From: akr Date: Thu, 8 Apr 1999 04:40:34 +0000 (+0000) Subject: Add all files for akemi-1_12. X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=2157b668ec5abb1b261f3560b9ec96195055cc8d;p=elisp%2Fsemi.git Add all files for akemi-1_12. --- diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..d38c99c --- /dev/null +++ b/ChangeLog @@ -0,0 +1,5264 @@ +1999-04-07 Tanaka Akira + + * mime-view.el (mime-display-application/x-postpet): New function. + (mime-preview-condition): Set up for + 'mime-preview-application/x-postpet. + +1999-03-05 Tanaka Akira + + * mime-edit.el (mime-edit-normalize-body): Call `enriched-encode' with + three arguments. + +1999-02-18 Tanaka Akira + + * Sync up with semi-1_13_2. + + * semi-def.el (mime-user-interface-product): Bump up to + AKEMI 1.13.1. + +1999-02-17 Tanaka Akira + + * mime-edit.el (mime-edit-define-charset): Check `mime-charset-comment' + property for mime-charset to add comment. + +1999-01-18 Tanaka Akira + + * mime-view.el (mime-display-text/x-vcard): Deal with bare LF as newline. + +1999-01-17 Tanaka Akira + + * mime-play.el, ChangeLog: + * mime-play.el (mime-view-caesar): Use `enable-character-translation' + instead of `standard-translation-table-for-decode' to disable + character translation. + + * semi-def.el, ChangeLog, AKEMI-VERSION: * AKEMI-VERSION: New file. + + * semi-def.el (mime-user-interface-product): Bump up to + AKEMI 1.12.1. + + * AKEMI-VERSION: New file. + + * mime-play.el, ChangeLog: * mime-play.el: Reuiqre `ccl'. + (translate-string): New CCL program. + (mime-view-caesar): Try to deal with + `standard-translation-table-for-decode'. + + * mime-view.el, ChangeLog: Sync up with semi-vcard. + +1999-01-17 Tanaka Akira + + * mime-play.el (mime-view-caesar): Use `enable-character-translation' + instead of `standard-translation-table-for-decode' to disable + character translation. + +1999-01-17 Tanaka Akira + + * AKEMI-VERSION: New file. + + * semi-def.el (mime-user-interface-product): Bump up to + AKEMI 1.12.1. + +1999-01-17 Tanaka Akira + + * mime-play.el: Reuiqre `ccl'. + (translate-string): New CCL program. + (mime-view-caesar): Try to deal with + `standard-translation-table-for-decode'. + +1998-11-12 Tanaka Akira + + * mime-view.el (mime-display-text/x-vcard): Fix multibyteness + problem. + +1998-11-07 Tanaka Akira + + * mime-view.el (mime-display-text/x-vcard): Preserve encoding. + +1998-11-07 Tanaka Akira + + * mime-view.el (mime-display-text/x-vcard): New function. + (mime-preview-condition): Set up for 'mime-preview-text/x-vcard. + + +1999-01-27 MORIOKA Tomohiko + + * SEMI: Version 1.13.2 (Mikawa) released. + +1999-01-26 Katsumi Yamaoka + + * README.en: Notice that 1.12.5 or later of FLIM is required. + +1999-01-26 MORIOKA Tomohiko + + * mime-play.el (mime-preview-play-current-entity): Add autoload + cookie. + (mime-play-entity): Likewise. + + * mime-view.el (mime-display-message): Add autoload cookie; add + DOC-string. + (mime-view-buffer): Add autoload cookie. + +1999-01-26 MORIOKA Tomohiko + + * mime-play.el (mime-reduce-acting-situation-examples): New + implementation. + +1999-01-26 MORIOKA Tomohiko + + * mime-play.el (mime-view-caesar): Select window which displays + current-buffer if it is not selected . + +1999-01-26 Katsumi Yamaoka + + * mime-edit.el (mime-edit-decode-single-part-in-buffer): Limit the + search bound for the end of "Content-Transfer-Encoding" field. + +1999-01-26 MORIOKA Tomohiko + + * mime-play.el (mime-view-caesar): New implementation. + +1999-01-26 MORIOKA Tomohiko + + * mime-play.el (mime-view-caesar): Don't expect called in + raw-buffer; use `mime-insert-entity'. + +1999-01-25 MORIOKA Tomohiko + + * mime-w3.el (mime-preview-text/html): Display err if error occurs + in `w3-region'. + + * mime-w3.el (mime-preview-text/html): Guard from error of + `w3-region'. + + +1999-01-24 MORIOKA Tomohiko + + * SEMI: Version 1.13.1 (Kaga-Kasama) released. + +1999-01-24 MORIOKA Tomohiko + + * TODO (Don't expect raw-buffer): New item. + (lazy generating of situations from mime-entity information): New + item. + + * TODO (Don't use filter-model): finished. + + * TODO (multipart/related support): virtually finished. + +1999-01-24 MORIOKA Tomohiko + + * Delete README.ja until it is fixed. + + * mime-w3.el (url-cid): Use `mime-insert-entity-content'. + + * README.ja, README.en (Required environment): Require FLIM + 1.12.4. + + * mime-w3.el (mime-w3-message-structure): New variable. + (mime-preview-text/html): Set up `mime-w3-message-structure'. + (url-cid): New function; set up as registered-protocol of url. + +1999-01-23 MORIOKA Tomohiko + + * README.ja: Modify title. + + * README.ja: Add notice about translation. + + * README.ja, README.en (Required environment): Require FLIM + 1.12.3; delete description about enriched.el because anything + older than Emacs 19.28 are not supported. + + * mime-pgp.el (mime-view-application/pgp): Don't expect called in + raw-buffer; use `mime-insert-entity'. + + * mime-play.el (mime-view-message/rfc822): Use + `mime-insert-entity'. + +1999-01-22 MORIOKA Tomohiko + + * NEWS (Function `mime-play-entity'): Sync with latest + specification. + + * mime-pgp.el (mime-verify-multipart/signed): Modify for interface + change of `mime-play-entity'. + + * mime-play.el (mime-preview-play-current-entity): Modify for + interface change of `mime-play-entity'. + (mime-play-entity): Change interface; abolish optional arguments + `mode' and `ignore-example'. + (mime-detect-content): Modify for interface change of + `mime-play-entity'. + + * mime-view.el (mime-entity-situation): Add new optional argument + `situation'; it is preferred to attributes of entity. + +1999-01-22 MORIOKA Tomohiko + + * mime-view.el (mime-view-version): Don't use `eval-when-compile' + to avoid to break product-code-name. + + * mime-edit.el (mime-edit-version): Don't use `eval-when-compile' + to avoid to break product-code-name. + + +1999-01-21 MORIOKA Tomohiko + + * SEMI: Version 1.13.0 (Matt-Dò)-A released. + +1999-01-21 MORIOKA Tomohiko + + * mime-play.el (mime-view-message/rfc822): Don't expect called in + raw-buffer. + +1999-01-21 MORIOKA Tomohiko + + * NEWS (Function `mime-play-entity'): Add description about + interface change of `mime-play-entity'. + + * mime-play.el (mime-play-entity): Change interface. + +1999-01-21 MORIOKA Tomohiko + + * NEWS (Changes in SEMI 1.13): New section. + + * NEWS (Changes in SEMI 1.12): New section. + +1999-01-21 MORIOKA Tomohiko + + * mime-pgp.el (mime-view-application/pgp): Don't expect called in + raw-buffer. + (mime-verify-application/pgp-signature): Likewise. + + * mime-play.el: Abolish variable + `mime-preview-after-decoded-position'. + (mime-preview-play-current-entity): Use `mime-play-entity' simply; + don't switch to raw-buffer. + (mime-play-entity): renamed from `mime-raw-play-entity'; don't + expect called in raw-buffer. + (mime-activate-mailcap-method): Don't expect called in raw-buffer. + (mime-show-echo-buffer): Permit to run in preview-buffer. + + +1999-01-21 MORIOKA Tomohiko + + * SEMI: Version 1.12.1 ([JR] Nonoichi) released. + + * mime-play.el (mime-detect-content): Use `mime-entity-content' + not to refer to buffer directly. + +1999-01-15 MORIOKA Tomohiko + + * mime-view.el: Must require `emu'. + +1999-01-04 OKUNISHI Fujikazu + + * mime-view.el (mime-view-insert-entity-button): Use URL if it + exists in Content-Type field. + + * mime-play.el (mime-raw-browse-url-function): Default to + `mime-browse-url-function' instead of `mime-browse-url'. + +1998-12-24 Katsumi Yamaoka + + * mime-view.el (mime-preview-move-to-next): Don't move forward at + the end of buffer. + +1998-12-03 Katsumi Yamaoka + + * mime-edit.el (mime-edit-user-agent-value): Include + `xemacs-betaname'. + + +1998-12-02 MORIOKA Tomohiko + + * SEMI: Version 1.12.0 (Nishi-Kanazawa) released. + +1998-11-30 MORIOKA Tomohiko + + * mime-edit.el (eliminate-top-spaces): New function (moved from + mime-def.el of FLIM). + +1998-11-17 Kazuhiro Ohta + + * mime-partial.el + (mime-combine-message/partial-pieces-automatically): Fix + DOC-string. + + * mime-view.el (mime-view-buffer): Fix DOC-string. + +1998-11-25 MORIOKA Tomohiko + + * NEWS (Changes in SEMI 1.11): New section. + +1998-11-18 Katsumi Yamaoka + + * semi-setup.el (mime-setup-decode-message-header): Use + `mime-decode-header-in-buffer' instead of `eword-decode-header'. + + * mime-view.el (mime-preview-follow-current-entity): Likewise. + +1998-11-18 Keiichi Suzuki + + * mime-edit.el (mime-content-transfer-encoding-priority-list): New + variable. + (mime-edit-translate-single-part-tag): Change return value to + `nil' or a cons which include content-type and encoding. + (mime-edit-translate-region): Generate `encodeing' from + return value of `mime-edit-translate-single-part-tag'. + + +1998-11-16 MORIOKA Tomohiko + + * SEMI: Version 1.11.0 (Kanazawa) released. + + * README.ja, README.en (Required environment): Modify for APEL + 9.11 and FLIM 1.12.0. + +1998-11-12 Katsumi Yamaoka + + * mime-edit.el (mime-edit-split-ignored-field-regexp): Add "^". + +1998-11-08 MORIOKA Tomohiko + + * mime-bbdb.el (mime-bbdb/update-record): Use + `mime-decode-field-body' instead of + `eword-decode-structured-field-body'. + +1998-10-31 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-decode-message-in-buffer): Delete fields + match with `mime-edit-again-ignored-field-regexp' then call + `mime-decode-header-in-buffer'. + (mime-edit-again): Delete header filter. + +1998-10-31 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-decode-multipart-in-buffer): Change + interface. + (mime-edit-decode-single-part-in-buffer): New function. + (mime-edit-decode-message-in-buffer): Swap arguments; use function + `mime-edit-decode-single-part-in-buffer'. + (mime-edit-again): Modify for + `mime-edit-decode-message-in-buffer'. + +1998-10-31 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-decode-multipart-in-buffer): New + function. + (mime-edit-decode-message-in-buffer): Add new optional argument + `default-content-type'; use function + `mime-edit-decode-multipart-in-buffer'; add autoload cookie. + (mime-edit-again): Add autoload cookie. + + * mime-edit.el (mime-edit-decode-message-in-buffer): Renamed from + `mime-edit-decode-buffer'; change `not-decode-text' to optional + argument. + + +1998-10-31 MORIOKA Tomohiko + + * SEMI: Version 1.10.2 (Higashi-Kanazawa) released. + +1998-10-29 MORIOKA Tomohiko + + * NEWS (Abolish variable `mime-temp-directory'): New subsection. + +1998-10-27 Katsumi Yamaoka + + * mime-edit.el (mime-edit-decode-buffer): Limit search bound for + "Content-Transfer-Encoding:". + + +1998-10-26 MORIOKA Tomohiko + + * SEMI: Version 1.10.1 (Morimoto) released. + + * README.ja, README.en (Required environment): Modify for APEL 9.6 + and FLIM 1.11.2. + +1998-10-24 MORIOKA Tomohiko + + * mime-play.el, mime-pgp.el, mime-partial.el, mime-image.el, + mime-edit.el: Use `temporary-file-directory' instead of + `mime-temp-directory'. + + +1998-10-23 MORIOKA Tomohiko + + * SEMI: Version 1.10.0 (Tsubata) released. + +1998-10-22 Yoshiki Hayashi + + * README.ja: New file. + +1998-10-22 MORIOKA Tomohiko + + * mime-edit.el, mime-view.el: Use `(featurep 'xemacs)' instead of + `running-xemacs'. + +1998-10-21 MORIOKA Tomohiko + + * mime-view.el, SEMI-ELS: Move function `mime-display-text/plain', + `mime-display-text/enriched' and `mime-display-text/richtext' from + mime-text to mime-view.el; abolish mime-text.el. + + * mime-play.el: Don't Require `mime-text' when compiling. + + * mime-w3.el: Require `mime' instead of `mime-text'. + +1998-10-21 MORIOKA Tomohiko + + * semi-setup.el (mime-setup-enable-inline-image): Use `(featurep + 'xemacs)' instead of `running-xemacs'. + +1998-10-20 MORIOKA Tomohiko + + * README.en (Required environment): Modify to require APEL 9.5 and + FLIM 1.11.1. + + * mime-edit.el: - Don't require emu. + - Require invisible. + + * semi-def.el: Require poe instead of emu. + +1998-10-20 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-decode-buffer): Convert encoding to + lower case. + +1998-10-19 MORIOKA Tomohiko + + * mime-view.el (mime-view-ignored-field-list): Modify each element + of initial value to include `:'. + (mime-view-visible-field-list): Likewise. + (mime-display-entity): Use `mime-insert-header' instead of + `mime-insert-decoded-header'. + +1998-10-16 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-decode-buffer): Call + `mule-caesar-region' for text/x-rot13-47-48 entity. + +1998-09-22 Shozo UEHARA + + * mime-play.el (mime-raw-play-entity): Initialize `max-escore' by + 0. + +1998-10-16 MORIOKA Tomohiko + + * NEWS (Changes in SEMI 1.10): New section. + + * NEWS (Changes in SEMI 1.9): New section. + + * NEWS (User-Agent field): New subsection. + +1998-10-16 MORIOKA Tomohiko + + * mime-play.el (mime-view-caesar): Use `mime-insert-text-content' + instead of `mime-text-insert-decoded-body'. + + * mime-w3.el (mime-preview-text/html): Use + `mime-insert-text-content' instead of + `mime-text-insert-decoded-body'. + + * mime-text.el: Abolish function `mime-text-insert-decoded-body'. + (mime-display-text/plain): Use `mime-insert-text-content' instead + of `mime-text-insert-decoded-body'. + (mime-display-text/richtext): Likewise. + (mime-display-text/enriched): Likewise. + + +1998-10-14 MORIOKA Tomohiko + + * SEMI: Version 1.9.1 (Kurikara) released. + +1998-10-14 Jari Aalto + + * mime-edit.el (mime-file-types): Add some new mime types, and + rearrange the types to logical sections: text; octext text and + binary. + +1998-10-12 Katsumi Yamaoka + + * README.en: Add explanation about `VERSION_SPECIFIC_LISPDIR'. + + * Makefile (install): Add new arg `VERSION_SPECIFIC_LISPDIR'. + (install-elc): Likewise. + + * SEMI-MK (config-semi): Refer to `VERSION_SPECIFIC_LISPDIR'. + + * SEMI-CFG (VERSION_SPECIFIC_LISPDIR): New variable. + +1998-10-09 MORIOKA Tomohiko + + * SEMI-CFG: Abolish variable `SHELL' and `SHELLOPTION'. + +1998-10-08 Katsumi Yamaoka + + * SEMI-CFG: Use `add-latest-path' for adding "custom" to + load-path. + +1998-10-08 MORIOKA Tomohiko + + * SEMI-CFG: Don't use `when' before install is required; don't + require cl. + +1998-10-08 Katsumi Yamaoka + + * SEMI-CFG: Add "custom" to load-path. + + +1998-10-07 MORIOKA Tomohiko + + * SEMI: Version 1.9.0 (Isurugi) released. + +1998-10-06 MORIOKA Tomohiko + + * README.en (Required environment): Modify for APEL 9.1 and FLIM + 1.10.1. + +1998-10-06 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-version): Enclose with + `eval-and-compile'. + + * mime-edit.el (mime-edit-version): Renamed from + `mime-edit-version-string'; use `mime-user-interface-product', + `mime-product-name', `mime-product-version' and + `mime-product-code-name'. + (mime-edit-user-agent-value): Use `mime-user-interface-product', + `mime-library-product', `mime-product-name', + `mime-product-version' and `mime-product-code-name'. + (mime-edit-mime-version-value): Rename `mime-edit-version-string' + -> `mime-edit-version'. + (mime-edit-mime-version-field-for-message/partial): Likewise. + + * mime-play.el (mime-save-acting-situation-examples): Rename + `mime-view-version-string' -> `mime-view-version'. + + * mime-view.el (mime-view-version): Renamed from + `mime-view-version-string'; use `mime-user-interface-product', + `mime-product-name', `mime-product-version' and + `mime-product-code-name'. + + * semi-def.el (mime-user-interface-product): New constant; abolish + `mime-user-interface-version'. + +1998-10-04 MORIOKA Tomohiko + + * mime-play.el (mime-echo-window-is-shared-with-bbdb): Check bbdb + is install or not to define default value. + (mime-show-echo-buffer): New implementation about + `mime-echo-window-is-shared-with-bbdb'. + +1998-10-01 MORIOKA Tomohiko + + * mime-edit.el (mime-charset-type-list): Use `cn-gb' instead of + `cn-gb2312' because `cn-gb2312' is typo. + +1998-09-29 MORIOKA Tomohiko + + * mime-edit.el (mime-file-types): Use function + `mime-encoding-list' instead of variable + `mime-file-encoding-method-alist' to define default value. + (mime-edit-insert-voice): Use function `mime-encoding-alist' + instead of variable `mime-file-encoding-method-alist' for + completion. + (mime-prompt-for-encoding): Likewise. + +1998-09-20 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-user-agent-value): Add + system-configuration for Emacs and XEmacs. + +1998-09-20 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-normalize-body): Use "7bit" for nil + encoding as an argument of `mime-encode-region'. + + +1998-09-16 MORIOKA Tomohiko + + * SEMI: Version 1.8.6 (Fukuoka) released. + +1998-09-15 MORIOKA Tomohiko + + * README.en (Installation): Add description for `run in expanded + place' and `install as a XEmacs package'. + + * README.en (Required environment): Require FLIM 1.9.2 or later. + +1998-09-13 MORIOKA Tomohiko + + * mime-edit.el (mime-file-types): Abolish setting for + text/richtext. + (mime-edit-insert-text): Likewise. + + * mime-edit.el (mime-content-types): Modify comment style. + +1998-09-13 Shin'ichiro Tanaka + + * mime-edit.el (mime-content-types): Delete text/richtext and add + text/css and text/xml (cf. [tm-ja:3387]). + +1998-09-11 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-insert-user-agent-field): New variable + (abolish `mime-edit-insert-x-emacs-field'). + (mime-edit-user-agent-value): New variable (abolish + `mime-edit-x-emacs-value'). + (mime-edit-translate-body): Insert User-Agent field instead of + `X-Emacs' field. + (mime-edit-again-ignored-field-regexp): Add `User-Agent' instead + of `X-Emacs' field conditionally. + +1998-09-11 MORIOKA Tomohiko + + * SEMI-MK (config-semi-package): New function. + (compile-semi-package): New function. + (install-semi-package): New function. + + * SEMI-CFG (PACKAGEDIR): New variable. + + * Makefile: Abolish variable `SHELL', `MAKE', `CC' and `CFLAGS'. + (XEMACS): New variable. + (FLAGS): Add `-l SEMI-MK'. + (PACKAGEDIR): New variable. + (elc): Delete `-l SEMI-MK'. + (install-elc): Delete `-l SEMI-MK'. Abolish target `all', `tex', + `dvi' and `ps'. + (package): New target. + (install-package): New target. + (clean): Delete historical setting. + + +1998-08-31 MORIOKA Tomohiko + + * SEMI: Version 1.8.5 (Nishi-Takaoka) released. + + * README.en (Required environment): Modify APEL and FLIM version. + + * mime-ui-en.sgml (Introduction): Translate. + +1998-08-31 MORIOKA Tomohiko + + * mime-view.el (mime-view-type-subtype-score-alist): Fix + mismatched. + +1998-08-10 MORIOKA Tomohiko + + * mime-text.el (mime-text-insert-decoded-body): Specify line break + code type as CRLF. + +1998-08-10 Shuhei KOBAYASHI + + * mime-edit.el (mime-edit-normalize-body): Failed to canonicalize + empty lines. + +1998-08-09 MORIOKA Tomohiko + + * mime-w3.el (mime-preview-text/html): Insert dummy "\n" into end + of entity to avoid keymap text-property problem. + +1998-07-21 MORIOKA Tomohiko + + * NEWS (Don't use "file" command to detect content of entity): New + section. + + * mime-play.el (mime-magic-type-alist): New variable; abolish + `mime-file-content-type-alist'. + (mime-detect-content): New implementation (don't use "file" + command). + + +1998-07-15 MORIOKA Tomohiko + + * SEMI: Version 1.8.4 (Takaoka) released. + +1998-07-14 MORIOKA Tomohiko + + * mime-ui-en.sgml, mime-ui-ja.sgml (message/partial sending): New + section. + + * mime-edit.el (mime-edit-split-blind-field-regexp): Add + DOC-string; change to user option. + + +1998-07-11 MORIOKA Tomohiko + + * REMI: Version 1.8.4 (Takaoka) released. + +1998-07-09 MORIOKA Tomohiko + + * mime-play.el: Reduce `mime-acting-situation-example-list' while + it is bigger than `mime-acting-situation-example-list-max-size'. + +1998-07-08 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-preview-message): Use `mime-view-buffer' + instead of `mime-view-mode'. + + +1998-07-08 MORIOKA Tomohiko + + * REMI: Version 1.8.3 (Ecch-Dþ-Nakagawa)-A released. + + * mime-play.el (mime-delq-null-situation): Add new optional + argument `ignored-value'. + (mime-raw-play-entity): Add new optional argument + `ignored-method'; add `ignore-examples' to acting-situation. + (mime-detect-content): Specify `ignore-examples' of + acting-situation as `ignore-examples' of `mime-raw-play-entity'; + specify `mime-detect-content' as `ignored-method' of + `mime-raw-play-entity'. + +1998-07-08 MORIOKA Tomohiko + + * mime-view.el (mime-preview-extract-current-entity): Change + interface to add `ignore-examples'. + (mime-preview-print-current-entity): Likewise. + + * mime-play.el (mime-acting-situation-example-list-max-size): New + variable. + (mime-reduce-acting-situation-examples): New function. + (mime-preview-play-current-entity): Change interface to add + `ignore-examples'. + (mime-raw-play-entity): Add new optional argument + `ignore-examples'. Reduce `mime-acting-situation-example-list' + when loading example file. + + +1998-07-08 MORIOKA Tomohiko + + * REMI: Version 1.8.2 (N-Dòmachi)-A released. + +1998-07-07 MORIOKA Tomohiko + + * mime-play.el (mime-acting-situation-example-list): New variable; + abolish `mime-acting-situation-examples'. + (mime-save-acting-situation-examples): Modify for + `mime-acting-situation-example-list'. + (mime-compare-situation-with-example): New function. + (mime-raw-play-entity): Change algorithm to compare with + acting-situation-examples. + (mime-store-message/partial-piece): Use `mime-view-buffer' instead + of `mime-view-mode'. + +1998-07-06 MORIOKA Tomohiko + + * mime-play.el (mime-preview-play-current-entity): Fix problem + when `mode' is omitted with non-interactive mode (maybe for button + dispatcher). + + +1998-07-06 MORIOKA Tomohiko + + * REMI: Version 1.8.1 (Fushiki) released. + +1998-07-05 MORIOKA Tomohiko + + * mime-ui-en.texi, mime-ui-en.sgml: New files. + + * mime-ui-ja.sgml: Modify node names about MIME-Edit. + (file-type specification): Fix typo. + +1998-07-04 MORIOKA Tomohiko + + * mime-play.el (mime-file-content-type-alist): Add "Standard + MIDI". + + * mime-play.el (mime-detect-content): Fixed. + +1998-07-03 MORIOKA Tomohiko + + * mime-play.el (mime-activate-mailcap-method): Check filename is + null string. + +1998-07-03 MORIOKA Tomohiko + + * mime-ui-ja.sgml, mime-ui-ja.texi: New files; delete + mime-view-ja.sgml and mime-view-ja.texi. + + +1998-07-01 MORIOKA Tomohiko + + * SEMI: Version 1.8.2 (Kosugi) released. + + * README.en (Required environment): Modify for FLIM 1.8.0. + + * mime-view.el (mime-display-entity): Modify for + `mime-insert-decoded-header'. + +1998-06-30 MORIOKA Tomohiko + + * mime-play.el (mime-activate-mailcap-method): Use + `mime-write-entity-content'. + + +1998-06-30 MORIOKA Tomohiko + + * SEMI: Version 1.8.1 (Kureha) released. + +1998-06-29 MORIOKA Tomohiko + + * mime-play.el (mime-save-content): Use + `mime-write-entity-content'. + +1998-06-29 MORIOKA Tomohiko + + * mime-view.el: + - Abolish local variable `mime-raw-representation-type'. + - Abolish function `mime-entity-representation-type'. + + * mime-pgp.el (mime-view-application/pgp): Use + `mime-entity-cooked-p'. + + * mime-play.el (mime-view-message/rfc822): Use + `mime-entity-cooked-p'. + +1998-06-28 MORIOKA Tomohiko + + * mime-play.el: Abolish function `mime-raw-write-region'. + + * mime-play.el (mime-store-message/partial-piece): Use + `mime-write-entity-body'. + + * mime-pgp.el (mime-verify-application/pgp-signature): Use + `mime-write-entity'. + +1998-06-28 MORIOKA Tomohiko + + * mime-pgp.el (mime-view-application/pgp): Specify + representation-type by argument of `mime-view-buffer'. + +1998-06-28 MORIOKA Tomohiko + + * mime-play.el (mime-view-message/rfc822): New implementation. + + * mime-view.el (mime-display-message): Try use window of mother + buffer to display mime-preview-buffer. + +1998-06-28 MORIOKA Tomohiko + + * mime-view.el: Abolish `mime-entity-cooked-p'; use + `mime-entity-cooked-p' of FLIM. + (mime-view-buffer): New optional argument `representation-type'; + use `mime-open-entity'. + (mime-view-mode): New implementation. + + +1998-06-28 MORIOKA Tomohiko + + * REMI: Version 1.8.0 (Ecch-Dþ-Kokubu)-A released. + +1998-06-26 MORIOKA Tomohiko + + * README.en (Required environment): Modify for FLIM 1.7.0. + + * mime-view.el (mime-view-mode): New implementation. + +1998-06-25 MORIOKA Tomohiko + + * mime-text.el (mime-display-text/plain): Must rename + `mime-browse-add-url-button' to `mime-add-url-buttons'. + +1998-06-25 Shuhei KOBAYASHI + + * semi-def.el: Don't require 'browse-url. + Abolish `mime-browse-add-url-buttons-maybe' and `mime-browse-url'. + (mime-browse-url-function): New variable. + (mime-add-url-buttons): Renamed from `mime-browse-add-url-button'. + Use `mime-browse-url-function'. + +1998-06-24 Shuhei KOBAYASHI + + * mime-view.el: (mime-preview-condition): Renamed method for + "anon-ftp" access-type to `mime-view-message/external-anon-ftp' + and added new method `mime-view-message/external-url' for "url" + access-type. + +1998-06-24 Shuhei KOBAYASHI + + * mime-play.el (mime-preview-play-current-entity): Use + optional arg of `interactive'. + (mime-view-message/external-anon-ftp): Renamed from + `mime-view-message/external-ftp'. + (mime-raw-browse-url-function): New variable. + (mime-view-message/external-url): New function. + +1998-06-24 Shuhei KOBAYASHI + + * semi-def.el (mime-browse-url-regexp): Renamed from + `mime-text-url-regexp'. + (mime-browse-url): Renamed from `mime-text-browse-url'. + (mime-browse-add-url-buttons): Renamed from + `mime-text-add-url-buttons'. + (mime-browse-add-url-buttons-maybe): Renamed from + `mime-text-add-url-buttons-maybe'. + + * mime-text.el: Moved URL stuff to semi-def.el. + + +1998-06-24 MORIOKA Tomohiko + + * SEMI: Version 1.8.0 (Toyama) released. + + * SEMI-CFG: Modify for FLIM 1.6.0. + + * README.en (Required environment): Modify for FLIM 1.6.0. + +1998-06-24 MORIOKA Tomohiko + + * mime-view.el: + - Abolish function `mime-raw-find-entity-from-node-id', + `mime-raw-find-entity-from-number'. + - Move function `mime-entity-parent' to mime.el of FLIM. + - Abolish variable `mime-view-uuencode-encoding-name-list'. + - Move function `mime-entity-uu-filename' and + `mime-entity-filename' to mime.el of FLIM. + (mime-preview-follow-current-entity): Use function + `mime-find-entity-from-node-id' instead of + `mime-raw-find-entity-from-node-id'. + (mime-preview-move-to-upper): Don't use + `mime-raw-find-entity-from-node-id'. + + * mime-pgp.el (mime-verify-application/pgp-signature): Don't use + `mime-raw-find-entity-from-node-id'. + (mime-decrypt-application/pgp-encrypted): Likewise. + + * mime-view.el, mime-play.el (mime-entity-safe-filename): Use + `mime-read-field' instead of `mime-entity-read-field'. + + * mime-partial.el + (mime-combine-message/partial-pieces-automatically): Use + `mime-read-field' instead of `mime-entity-read-field'. + + * mime-bbdb.el (mime-bbdb/update-record): Use `mime-fetch-field' + and `mime-read-field' instead of `mime-entity-fetch-field' and + `mime-entity-read-field'. + +1998-06-23 MORIOKA Tomohiko + + * mime-view.el (mime-display-message): Use window of + preview-buffer or preview-buffer to display preview-buffer. + (mime-view-buffer): fixed. + (mime-view-mode): fixed. + + * MIME-View-API-ja.ol: Delete MIME-View-API-ja.ol. + +1998-06-22 MORIOKA Tomohiko + + * NEWS (Changes in SEMI 1.8): New chapter. + +1998-06-22 MORIOKA Tomohiko + + * mime-view.el: Abolish external x-face viewer. + +1998-06-22 MORIOKA Tomohiko + + * semi-def.el: Abolish function `tm:set-fields', `tm:add-fields' + and `tm:delete-fields'. + + * mime-partial.el: Abolish variable + `mime-view-partial-message-method-alist' and function + `mime-view-partial-message'. + (mime-combine-message/partial-pieces-automatically): Use + `request-partial-message-method' in acting-situation. + +1998-06-22 MORIOKA Tomohiko + + * mime-view.el (mime-display-message): Delete unnecessary + `mime-parse-buffer'. + + +1998-06-22 MORIOKA Tomohiko + + * SEMI: Version 1.7.1 (Higashi-Toyama) released. + + * README.en (Required environment): Delete description about + `enable-multibyte-characters'; modify for FLIM 1.5.0. + +1998-06-22 Shuhei KOBAYASHI + + * mime-edit.el (mime-content-types): Add "url" access-type and + "subject" parameter of "mail-server" access-type to + message/external-body media-type. + (mime-edit-define-menu-for-xemacs): Doc-string fix. + +1998-06-22 Shuhei KOBAYASHI + + * SEMI-CFG: Support run-in-place installation of BBDB and + Emacs/W3. + +1998-06-21 MORIOKA Tomohiko + + * mime-view.el: Don't require `std11'. + + * mime-view.el: Require `mime' instead of `mime-lib'. + (mime-entity-filename): Don't use `std11-strip-quoted-string'. + + * mime-edit.el: Don't require `eword-encode'. + +1998-06-21 MORIOKA Tomohiko + + * mime-partial.el + (mime-combine-message/partial-pieces-automatically): Fixed. + + * mime-pgp.el (mime-view-application/pgp): Use function + `mime-entity-representation-type'. + + * mime-play.el (mime-view-message/rfc822): Use function + `mime-entity-representation-type'. + (mime-store-message/partial-piece): `mime-entity-body-start' and + `mime-entity-body-end'. + + * mime-text.el (mime-text-insert-decoded-body): Use function + `mime-entity-cooked-p'. + + * mime-view.el (mime-entity-representation-type): New function. + (mime-entity-cooked-p): New function. + (mime-display-entity): Use function `mime-entity-cooked-p'. + +1998-06-21 MORIOKA Tomohiko + + * mime-text.el (mime-text-insert-decoded-body): Use + `mime-entity-content'. + + * mime-image.el (mime-display-image): Use `mime-entity-content'. + +1998-06-21 MORIOKA Tomohiko + + * mime-play.el (mime-entity-safe-filename): New implementation. + +1998-06-20 MORIOKA Tomohiko + + * mime-text.el (mime-text-insert-decoded-body): Delete unnecessary + `save-restriction'. + +1998-06-20 Shuhei KOBAYASHI + + * semi-def.el: Require 'custom. + +1998-06-19 MORIOKA Tomohiko + + * mime-view.el: Don't require `mime-parse'. + +1998-06-19 MORIOKA Tomohiko + + * SEMI-CFG: - Modify for FLIM 1.5.0. + - Don't signal error if tm is found in load-path. + +1998-06-19 MORIOKA Tomohiko + + * mime-play.el (mime-save-content): Use `mime-entity-body-start' + and `mime-entity-body-end'. + +1998-06-19 MORIOKA Tomohiko + + * mime-pgp.el (mime-view-application/pgp): fixed. + (mime-verify-application/pgp-signature): Use + `mime-message-structure' instead of `mime-raw-message-info'. + (mime-decrypt-application/pgp-encrypted): Use + `mime-message-structure' instead of `mime-raw-message-info'. + + * mime-view.el (mime-display-message): Use `mime-parse-buffer'; + abolish variable `mime-raw-message-info'; use + `mime-message-structure' instead of `mime-raw-message-info'. + +1998-06-19 MORIOKA Tomohiko + + * mime-bbdb.el (mime-bbdb/update-record): Use + `mime-entity-fetch-field' and `mime-entity-read-field'. + +1998-06-19 Shuhei KOBAYASHI + + * SEMI-CFG: Require 'cl first. + + +1998-06-18 MORIOKA Tomohiko + + * SEMI: Version 1.7.0 (Mizuhashi) released. + +1998-06-17 MORIOKA Tomohiko + + * mime-edit.el, mime-view.el, semi-def.el: Rename + `mime-module-version' to `mime-user-interface-version'. + + * mime-parse.el, SEMI-ELS: Move mime-parse.el to FLIM layer. + +1998-06-17 MORIOKA Tomohiko + + * semi-setup.el (call-after-loaded): Moved from semi-def.el. + + * semi-def.el: Move `call-after-loaded' to semi-setup.el. + +1998-06-17 MORIOKA Tomohiko + + * mime-view.el (mime-view-insert-entity-button): Change interface. + +1998-06-17 MORIOKA Tomohiko + + * mime-view.el (mime-entity-filename): Moved from mime-play.el. + (mime-view-entity-title): Use `mime-entity-filename'. + + * mime-play.el: Move `mime-entity-filename' to mime-view.el. + +1998-06-17 MORIOKA Tomohiko + + * mime-play.el (mime-entity-filename): New function; abolish + `mime-raw-get-original-filename'. + (mime-entity-safe-filename): New function; abolish + `mime-raw-get-filename'. + (mime-activate-mailcap-method): Use `mime-entity-safe-filename'. + (mime-save-content): Use `mime-entity-safe-filename'. + (mime-detect-content): Use `mime-entity-safe-filename'. + + * mime-view.el (mime-entity-uu-filename): New function; abolish + `mime-raw-get-uu-filename'. + +1998-06-17 MORIOKA Tomohiko + + * mime-view.el (mime-view-entity-title): Renamed from + `mime-raw-get-subject'; use `mime-entity-read-field'. + +1998-06-17 MORIOKA Tomohiko + + * NEWS (Changes in SEMI 1.7): New chapter. + (Changes in SEMI 1.6): Add description of entity-detection. + +1998-06-17 MORIOKA Tomohiko + + * mime-view.el: Rename `mime-view-following-method-alist' to + `mime-preview-following-method-alist'. + +1998-06-17 MORIOKA Tomohiko + + * semi-setup.el, mime-pgp.el: Rename + `mime-method-to-add-application/pgp-keys' to + `mime-add-application/pgp-keys'. + + * semi-setup.el, mime-pgp.el: Rename + `mime-method-to-decrypt-application/pgp-encrypted' to + `mime-decrypt-application/pgp-encrypted'. + + * semi-setup.el, mime-pgp.el: Rename + `mime-method-to-verify-application/pgp-signature' to + `mime-verify-application/pgp-signature'. + + * semi-setup.el, mime-pgp.el: Rename + `mime-method-to-verify-multipart/signed' to + `mime-verify-multipart/signed'. + + * semi-setup.el, mime-pgp.el: Rename + `mime-method-for-application/pgp' to `mime-view-application/pgp'. + + * SEMI-naming.ol: New file. + +1998-06-16 MORIOKA Tomohiko + + * mime-partial.el: Rename + `mime-method-to-combine-message/partial-pieces' to + `mime-combine-message/partial-pieces-automatically'. + +1998-06-16 MORIOKA Tomohiko + + * mime-play.el, mime-view.el: Rename + `mime-method-to-display-caesar' to `mime-view-caesar'. + + * mime-play.el, mime-view.el: Rename + `mime-method-to-display-message/external-ftp' to + `mime-view-message/external-ftp'. + +1998-06-16 MORIOKA Tomohiko + + * mime-view.el, mime-partial.el, mime-play.el: Rename + `mime-method-to-store-message/partial' to + `mime-store-message/partial-piece'. + +1998-06-16 MORIOKA Tomohiko + + * mime-play.el, mime-view.el: Rename + `mime-method-to-display-message/rfc822' to + `mime-view-message/rfc822'. + +1998-06-16 MORIOKA Tomohiko + + * mime-play.el, mime-view.el: Rename `mime-method-to-detect' to + `mime-detect-content'. + +1998-06-16 MORIOKA Tomohiko + + * mime-view.el (mime-display-entity): Abolish body-filter support. + + * mime-play.el, mime-view.el: Rename `mime-method-to-save' to + `mime-save-content'. + +1998-06-16 MORIOKA Tomohiko + + * mime-play.el (mime-activate-mailcap-method): Fixed. + +1998-06-16 MORIOKA Tomohiko + + * mime-image.el (mime-display-image): New function; abolish + function `mime-preview-filter-for-image'. + + * mime-image.el: Rename `mime-view-content-header-filter-hook' to + `mime-display-header-hook'. + + * mime-view.el (mime-display-entity): Run + `mime-display-header-hook'. + + * mime-text.el, mime-view.el: Rename `mime-preview-text/enriched' + to `mime-display-text/enriched'. + + * mime-text.el, mime-view.el: Rename `mime-preview-text/richtext' + to `mime-display-text/richtext'. + + * mime-text.el, mime-view.el: Rename `mime-preview-text/plain' to + `mime-display-text/plain'. + + * mime-view.el (mime-display-multipart/mixed): Renamed from + `mime-preview-multipart/mixed'. + + * mime-view.el (mime-display-multipart/alternative): Renamed from + `mime-preview-multipart/alternative'. + + * mime-view.el (mime-display-message/partial-button): Renamed from + `mime-preview-message/partial-button'. + + * mime-view.el (mime-display-entity): Renamed from + `mime-view-display-entity'; change interface. + (mime-display-message): Renamed from `mime-view-display-message'. + +1998-06-16 MORIOKA Tomohiko + + * README.en (Required environment): Modify for FLIM 1.4.0. + +1998-06-16 MORIOKA Tomohiko + + * mime-parse.el: Move function `mime-entity-number' to FLIM layer. + +1998-06-16 MORIOKA Tomohiko + + * mime-view.el (mime-header-presentation-method-alist): New + variable; abolish variable + `mime-view-content-header-filter-alist'; abolish function + `mime-view-cut-header'; abolish variable + `mime-view-ignored-field-regexp'. + (mime-view-display-entity): Use + `mime-header-presentation-method-alist'. + + * mime-parse.el: Move definition of structure `mime-entity' to + FLIM layer. + +1998-06-16 MORIOKA Tomohiko + + * mime-parse.el: Change order of `mime-entity'. + + +1998-06-15 MORIOKA Tomohiko + + * SEMI: Version 1.6.0 (Namerikawa) released. + +1998-06-15 MORIOKA Tomohiko + + * mime-view-ja.texi, mime-view-ja.sgml: New files. + + * mime-view.el (mime-view-mode): Fix DOC-string. + +1998-06-15 MORIOKA Tomohiko + + * mime-play.el (mime-file-content-type-alist): Renamed from + `mime-file-type-regexp-type-subtype-alist'. + +1998-06-14 MORIOKA Tomohiko + + * NEWS: Add description about + `mime-preview-over-to-{previous|next}-method-alist'. + + * mime-view.el (mime-preview-over-to-previous-method-alist): + Add DOC-string. + (mime-preview-over-to-next-method-alist): Add DOC-string. + + * mime-view.el (mime-preview-over-to-previous-method-alist): + Renamed from `mime-view-over-to-previous-method-alist'. + (mime-preview-over-to-next-method-alist): Renamed from + `mime-view-over-to-next-method-alist'. + +1998-06-13 MORIOKA Tomohiko + + * mime-w3.el (mime-save-background-color): Fixed. + + * mime-view.el (mime-acting-condition): Set up + `mime-method-to-detect' for application/octet-stream in "play" + mode. + + * mime-play.el (mime-file-type-regexp-type-subtype-alist): New + variable. + (mime-method-to-detect): New function. + +1998-06-13 MORIOKA Tomohiko + + * mime-play.el (mime-sort-situation): Modify for + Content-Disposition information. + +1998-06-13 MORIOKA Tomohiko + + * mime-view.el: Abolish variable `mime-view-show-summary-method' + and function `mime-preview-show-summary'. + +1998-06-13 MORIOKA Tomohiko + + * mime-view.el (mime-entity-situation): Add information of + Content-Disposition. + +1998-06-12 MORIOKA Tomohiko + + * MIME-View-API-ja.ol (mime-preview-buffer): Add description about + `mime-preview-original-major-mode'. + + * mime-view.el (mime-preview-original-major-mode): Modify + DOC-string. + + * NEWS: Add description about abolishment of tm-compatible + external method support. + + * mime-play.el (mime-raw-play-entity): Abolish tm-compatible + external method support; abolish function + `mime-activate-external-method' and + `mime-make-external-method-args'. + +1998-06-12 MORIOKA Tomohiko + + * mime-play.el (mime-activate-mailcap-method): Use + `mime-entity-body-start'. + + * mime-play.el (mime-activate-external-method): Change interface. + + * mime-play.el (mime-activate-mailcap-method): Change interface. + +1998-06-12 MORIOKA Tomohiko + + * MIME-View-API-ja.ol (mime-preview-buffer): Delete description + about text-property `mime-view-raw-buffer'. + + * mime-play.el (mime-preview-play-current-entity): Don't refer + text-property `mime-view-raw-buffer'. + + * mime-view.el (mime-view-display-entity): Don't set up + text-property `mime-view-raw-buffer'. + +1998-06-12 MORIOKA Tomohiko + + * MIME-View-API-ja.ol: Abolish description about + `mime-preview-original-major-mode'. + + * NEWS (Changes in SEMI 1.6): New chapter. + + * TODO (multipart/related support): New item. + +1998-06-12 MORIOKA Tomohiko + + * NEWS: Add description about mime-w3.el. + +1998-06-12 MORIOKA Tomohiko + + * mime-w3.el (mime-save-background-color): New macro. + (mime-preview-text/html): Use `mime-save-background-color'. + +1998-06-11 MORIOKA Tomohiko + + * mime-edit.el: Abolish variable `mime-edit-signing-type' and + `mime-edit-encrypting-type'. + (mime-edit-process-multipart-1): Separate "signed" to "pgp-signed" + and "kazu-signed"; separate "encrypted" to "pgp-encrypted" and + "kazu-encrypted". + (mime-edit-enclose-signed-region): Renamed from + `mime-edit-enclose-pgp-signed-region'. + (mime-edit-enclose-pgp-encrypted-region): Renamed from + `mime-edit-enclose-encrypted-region'. + (mime-edit-enclose-kazu-signed-region): New function. + (mime-edit-enclose-kazu-encrypted-region): New function. + (mime-edit-set-sign): Don't refer `mime-edit-signing-type'. + (mime-edit-set-encrypt): Don't refer `mime-edit-encrypting-type'. + +1998-06-11 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-sign-pgp-kazu): Abolish unused local + variable. + (mime-edit-encrypt-pgp-kazu): Abolish unused local variables. + +1998-06-11 MORIOKA Tomohiko + + * mime-pgp.el (mime-method-for-application/pgp): Change interface. + (mime-method-to-verify-multipart/signed): Change interface. + (mime-method-to-verify-application/pgp-signature): Change + interface. + (mime-method-to-decrypt-application/pgp-encrypted): Change + interface. + (mime-method-to-add-application/pgp-keys): Change interface. + + * mime-partial.el (mime-method-to-combine-message/partial-pieces): + Change interface. + + * mime-play.el (mime-raw-play-entity): Change interface of + internal-method. + (mime-method-to-save): Change interface. + (mime-method-to-display-message/rfc822): Change interface. + (mime-method-to-store-message/partial): Change interface. + (mime-method-to-display-message/external-ftp): Change interface. + (mime-method-to-display-caesar): Change interface. + +1998-06-11 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-normalize-body): Use + `mime-charset-type-list' directly; abolish local variable + `mime-edit-charset-default-encoding-alist' and function + `mime-make-charset-default-encoding-alist'. + (mime-edit-toggle-transfer-level): Don't set up + `mime-edit-charset-default-encoding-alist'. + +1998-06-11 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-message): Set up + `mime-raw-message-info'. + (mime-view-buffer): New function. + (mime-view-mode): Don't set up `mime-raw-message-info'. + +1998-06-11 MORIOKA Tomohiko + + * mime-edit.el (mime-charset-type-list): Use base64 for cn-gb2312 + and gb2312. + (mime-edit-normalize-body): If encoding is not specified for + charset, use quoted-printable or 8bit for mime-transfer-level is 7 + or 8. + + * mime-edit.el (mime-charset-type-list): Add `shift_jis'. + +1998-06-10 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-message): Use + `mime-maybe-hide-echo-buffer'. + (mime-view-mode): Don't use `mime-maybe-hide-echo-buffer'. + + * mime-view.el (mime-view-display-message): Move point to top of + body; run `mime-view-mode-hook'. + (mime-view-mode): Don't move point; don't run + `mime-view-mode-hook'. + + * mime-view.el (mime-view-display-message): Add new optional + argument `default-keymap-or-function'. + (mime-view-mode): Modify for `mime-view-display-message'. + + * mime-view.el (mime-view-display-message): Add new optional + argument `mother'; set to `mime-mother-buffer'. + (mime-view-mode): Modify for `mime-view-display-message'. + +1998-06-10 MORIOKA Tomohiko + + * mime-mc.el: Use `eval-and-compile' to load "mc-pgp". + + * mime-view.el (mime-preview-multipart/mixed): Modify for + `mime-view-display-entity'; don't refer `mime-raw-buffer'. + (mime-preview-multipart/alternative): Modify for + `mime-view-display-entity'; don't refer `mime-raw-buffer'. + (mime-view-display-entity): Change interface to abolish argument + for raw-buffer; don't refer `mime-raw-buffer'. + (mime-view-display-message): Abolish variable + `mime-preview-original-major-mode'; modify for + `mime-view-display-entity'. + (mime-preview-original-major-mode): New implementation; add + optional argument `recursive'. + (mime-preview-follow-current-entity): Modify for + `mime-preview-original-major-mode'. + (mime-preview-move-to-next): Use function + `mime-preview-original-major-mode'. + (mime-preview-scroll-up-entity): Use function + `mime-preview-original-major-mode'. + (mime-preview-scroll-down-entity): Use function + `mime-preview-original-major-mode'. + (mime-preview-quit): Use function + `mime-preview-original-major-mode'. + (mime-preview-show-summary): Use function + `mime-preview-original-major-mode'. + + * mime-view.el (mime-view-display-message): New function; abolish + function `mime-view-setup-buffers'. + (mime-view-mode): Use `mime-view-display-message'. + +1998-06-10 MORIOKA Tomohiko + + * mime-play.el (mime-raw-play-entity): Use + `mime-entity-situation'. + + * mime-view.el (mime-entity-situation): New function. + (mime-preview-multipart/alternative): Use `mime-entity-situation'. + (mime-view-display-entity): Use `mime-entity-situation'. + +1998-06-10 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-enclose-region-internal): Abolish unused + local variable. + +1998-06-09 MORIOKA Tomohiko + + * MIME-View-API-ja.ol (entity): Add description of + `mime-entity-number'. + + * mime-play.el (mime-method-to-display-caesar): Use + `mime-entity-number'. + + * mime-parse.el (mime-entity-number): New function. + +1998-06-09 MORIOKA Tomohiko + + * MIME-View-API-ja.ol (entity-button): Modify description of + `mime-view-insert-entity-button'. + + * mime-view.el (mime-view-insert-entity-button): Change interface. + (mime-view-display-entity): Modify for + `mime-view-insert-entity-button'. + +1998-06-09 MORIOKA Tomohiko + + * MIME-View-API-ja.ol (entity-button): Modify description of + `mime-view-entity-button-visible-p'. + + * mime-view.el (mime-view-entity-button-visible-p): Change + interface. + (mime-view-display-entity): Modify for + `mime-view-entity-button-visible-p'. + +1998-06-09 MORIOKA Tomohiko + + * MIME-View-API-ja.ol: Add description of `mime-entity-parent' and + abolish description `mime-raw-entity-parent'. + + * mime-view.el (mime-entity-parent): New function; abolish + `mime-raw-entity-parent'. + (mime-view-entity-button-visible-p): Use `mime-entity-parent' + instead of `mime-raw-entity-parent'. + + +1998-06-09 MORIOKA Tomohiko + + * SEMI: Version 1.5.4 (Higashi-Namerikawa) released. + + * mime-edit.el (mime-edit-normalize-body): Abolish unused local + variable. + +1998-06-09 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-translate-single-part-tag): Add new + argument `boundary'. + (mime-edit-translate-region): Modify for + `mime-edit-translate-single-part-tag'. + +1998-06-08 MORIOKA Tomohiko + + * mime-w3.el (mime-put-keymap-region): New macro. + (mime-preview-text/html): Use macro `mime-put-keymap-region'. + +1998-06-08 MORIOKA Tomohiko + + * SEMI-ELS (semi-modules-to-compile): Add 'mime-w3 if w3 is found. + + * semi-setup.el (mime-setup-enable-inline-html): New variable; add + setting for mime-w3.el conditionally. + + * mime-w3.el: New module. + +1998-06-08 MORIOKA Tomohiko + + * mime-view.el (mime-preview-multipart/alternative): Fix typo. + +1998-06-08 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-x-emacs-value): Check + `enable-multibyte-characters' is bound or not. + + +1998-06-08 MORIOKA Tomohiko + + * SEMI: Version 1.5.3 (Uozu) released. + + * NEWS (`pgp-elkins' -> `pgp-mime'): New section. + + * mime-edit.el: Rename `pgp-elkins' -> `pgp-mime'. + +1998-06-08 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-sign-pgp-elkins): Abolish unused local + variable. + (mime-edit-encrypt-pgp-elkins): Abolish unused local variable. + +1998-06-08 MORIOKA Tomohiko + + * mime-parse.el (mime-parse-multipart): fixed. + + +1998-06-08 MORIOKA Tomohiko + + * SEMI: Version 1.5.2 (Kurobe) released. + + * mime-play.el (mime-delq-null-situation): New function. + (mime-raw-play-entity): Use `mime-delq-null-situation'. + +1998-06-08 MORIOKA Tomohiko + + * TODO (Better implementation for multipart/alternative): done. + + * NEWS (type-subtype-score): New section. + +1998-06-07 MORIOKA Tomohiko + + * mime-view.el (mime-raw-message-info): Modify DOC-string. + + * MIME-View-API-ja.ol: Modify for SEMI 1.5. + +1998-06-07 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-touched-flag): Define by `defvar'. + (mime-edit-mode): Don't check `mime-edit-touched-flag' is bound or + not. + + * mime-edit.el (mime-edit-find-inmost): Abolish unused local + variables. + +1998-06-07 MORIOKA Tomohiko + + * mime-text.el (mime-text-insert-decoded-body): Don't refer + `mime-raw-buffer'. + + * mime-parse.el: Change format of `mime-entity' to add `buffer'. + +1998-06-07 MORIOKA Tomohiko + + * mime-play.el: When it is compiled, require 'bbdb or define + `bbdb-buffer-name' to avoid compiler warning. + + (mime-method-to-display-caesar): Abolish unused local variable. + + Use `eval-buffer' to eval contents of + `mime-acting-situation-examples-file'. + +1998-06-07 MORIOKA Tomohiko + + * mime-text.el: Move definition of variable + `mime-raw-representation-type' to mime-view.el. + + * mime-view.el: Move definition of variable + `mime-raw-representation-type' from mime-text.el. + (mime-raw-message-info): Modify DOC-string. + + * MIME-View-API-ja.ol: New file. + + +1998-06-05 MORIOKA Tomohiko + + * SEMI: Version 1.5.1 (Ikuji) released. + + * mime-view.el (mime-raw-message-info): Fix typo. + (mime-view-type-subtype-score-alist): New variable. + (mime-preview-multipart/alternative): New function; set up for + `mime-preview-condition'. + (mime-view-display-entity): Add optional argument `situation'. + +1998-06-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity): Call + body-presentation-method to display multipart if it is function. + + * NEWS: Add news about SEMI 1.5. + +1998-06-05 MORIOKA Tomohiko + + * mime-view.el (mime-preview-multipart/mixed): New function. + (mime-view-display-entity): Use `mime-preview-multipart/mixed'. + +1998-06-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity): Display entity-button + in body if button is invisible and body-presentation-method is not + found. + + +1998-06-04 MORIOKA Tomohiko + + * SEMI: Version 1.5.0 (Nishi-Ny-Dþzen)-A released. + + * README.en (Required environment): Modify for FLIM 1.3.0. + +1998-06-03 MORIOKA Tomohiko + + * mime-play.el (mime-raw-write-region): New implementation; refer + `mime-raw-representation-type' or + `mime-raw-representation-type-alist' instead of + `mime-raw-buffer-coding-system-alist'. + + * mime-view.el: Abolish variable + `mime-raw-buffer-coding-system-alist'. + +1998-06-02 MORIOKA Tomohiko + + * mime-pgp.el (mime-method-for-application/pgp): Use + `mime-raw-representation-type-alist' instead of + `mime-text-decoder-alist'; set up to + `mime-raw-representation-type' instead of `mime-text-decoder'. + + * mime-play.el (mime-method-to-display-message/rfc822): Use + `mime-raw-representation-type-alist' instead of + `mime-text-decoder-alist'; set up to + `mime-raw-representation-type' instead of `mime-text-decoder'. + (mime-method-to-display-caesar): Use + `mime-text-insert-decoded-body'. + + * mime-text.el (mime-raw-representation-type): New variable; + abolish `mime-text-decoder'. + (mime-text-insert-decoded-body): Change interface; refer + `mime-raw-representation-type' or + `mime-raw-representation-type-alist' instead of + `mime-text-decoder' or `mime-text-decoder-alist'; abolish function + `mime-text-decode-buffer' and `mime-text-decode-buffer-maybe'. + (mime-preview-text/plain): Modify for new interface of + `mime-text-insert-decoded-body'. + (mime-preview-text/richtext): Modify for new interface of + `mime-text-insert-decoded-body'. + (mime-preview-text/enriched): Modify for new interface of + `mime-text-insert-decoded-body'. + + * mime-view.el (mime-raw-representation-type-alist): New variable; + abolish `mime-text-decoder-alist'. + +1998-05-31 MORIOKA Tomohiko + + * mime-parse.el (mime-parse-multipart): fixed. + + +1998-06-01 MORIOKA Tomohiko + + * SEMI: Version 1.4.6 (Ny-Dþzen)-A released. + +1998-05-28 MORIOKA Tomohiko + + * mime-text.el (mime-text-insert-decoded-body): New function; + abolish 'mime-text-decode-body. + (mime-preview-text/plain): Use 'mime-text-insert-decoded-body. + (mime-preview-text/richtext): Use 'mime-text-insert-decoded-body. + (mime-preview-text/enriched): Use 'mime-text-insert-decoded-body. + +1998-05-28 MORIOKA Tomohiko + + * mime-view.el (mime-preview-condition): Set up for + 'mime-preview-text/enriched instead of + 'mime-preview-filter-for-text/enriched. + + * mime-text.el (mime-preview-text/enriched): New function; abolish + 'mime-preview-filter-for-text/enriched. + +1998-05-28 MORIOKA Tomohiko + + * mime-view.el (mime-preview-condition): Set up for + 'mime-preview-text/richtext instead of + 'mime-preview-filter-for-text/richtext. + + * mime-text.el (mime-preview-text/richtext): New function; abolish + 'mime-preview-filter-for-text/richtext. + +1998-05-28 MORIOKA Tomohiko + + * mime-view.el: Rename 'mime-view-insert-message/partial-button to + 'mime-preview-message/partial-button. + +1998-05-28 MORIOKA Tomohiko + + * mime-view.el (mime-preview-condition): Set up for + 'mime-preview-text/plain instead of + 'mime-preview-filter-for-text/plain. + (mime-view-insert-message/partial-button): Change interface for + new spec of body-presentation-method. + (mime-view-display-entity): Change interface of + body-presentation-method. + + * mime-text.el (mime-preview-text/plain): New function; abolish + 'mime-preview-filter-for-text/plain. + +1998-05-28 MORIOKA Tomohiko + + * mime-parse.el (make-mime-entity): Change format. + (mime-entity-header-start): New function. + (mime-entity-header-end): New function. + (mime-entity-body-start): New function. + (mime-entity-body-end): New function. + (mime-entity-content-type): Modify for new format. + (mime-entity-content-disposition): Modify for new format. + (mime-entity-encoding): Modify for new format. + (mime-entity-children): Modify for new format. + (mime-entity-point-min): Change to alias of + 'mime-entity-header-start. + (mime-entity-point-max): Change to alias of 'mime-entity-body-end. + (mime-parse-multipart): Modify for 'make-mime-entity. + (mime-parse-message): Modify for 'make-mime-entity. + +1998-05-28 MORIOKA Tomohiko + + * mime-parse.el (mime-parse-multipart): Change interface; abolish + local variable 'beg and 'end. + (mime-parse-message): Modify for 'mime-parse-multipart. + +1998-05-28 MORIOKA Tomohiko + + * mime-parse.el (mime-parse-multipart): Use + 'mime-content-type-parameter. + +1998-05-28 MORIOKA Tomohiko + + * mime-parse.el (mime-parse-Content-Transfer-Encoding): New + function. + (mime-read-Content-Transfer-Encoding): Use function + 'mime-parse-Content-Transfer-Encoding. + (mime-parse-message): Use 'mime-parse-* instead of 'mime-read-*. + +1998-05-28 MORIOKA Tomohiko + + * mime-parse.el: Move 'regexp-* and 'regexp-or to mime-def.el of + FLIM (Chao); move 'std11-quoted-pair-regexp, 'std11-qtext-regexp + and 'std11-quoted-string-regexp to mime-def.el of FLIM (Chao). + +1998-05-28 MORIOKA Tomohiko + + * mime-parse.el: Rename 'rfc822/quoted-string-regexp -> + 'std11-quoted-string-regexp. + + * mime-parse.el: Rename 'rfc822/qtext-regexp -> + 'std11-qtext-regexp. + + * mime-parse.el: Rename 'rfc822/quoted-pair-regexp -> + 'std11-quoted-pair-regexp. + +1998-05-29 Katsumi Yamaoka + + * mime-view.el (mime-preview-scroll-down-entity): Use (not (bobp)) + instead of (> (point) 1). + +1998-05-25 Katsumi Yamaoka + + * mime-play.el (mime-preview-play-current-entity): Don't widen. + +1998-05-25 Katsumi Yamaoka + + * mime-play.el (mime-raw-play-entity): Abolish point correcting + procedures for VM. + + * mime-play.el (mime-preview-play-current-entity): Do widen befor + playing the entity. + + +1998-05-21 MORIOKA Tomohiko + + * SEMI: Version 1.4.5 (Tomari) released. + + * README.en (Mailing lists): Add notice about direct-mail for + authors. + +1998-05-19 MORIOKA Tomohiko + + * mime-play.el (mime-raw-dired-function): Don't refer + 'mime/use-multi-frame. + + * semi-def.el: Abolish variable 'mime/use-multi-frame. + + * semi-def.el (mime-insert-button): Merge arguments of two + 'insert. + + * semi-def.el: Abolish function 'get-version-string because it is + not used. + + * TODO (Don't use filter-model): New item. + + * TODO (Fix problem of dynamic configuration for + 'mime-acting-condition): Done. + + * TODO (Mother entity should modify preview-situation of + children): Done. + +1998-05-17 MORIOKA Tomohiko + + * mime-view.el (mime-view-setup-buffers): Use + 'mime-view-display-entity; abolish 'mime-view-display-message. + (mime-view-display-entity): fixed. + +1998-05-17 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-message): fixed. + +1998-05-16 MORIOKA Tomohiko + + * mime-view.el (mime-raw-get-subject): Use + 'mime-content-disposition-filename. + + * mime-parse.el (mime-content-type-parameter): New function. + + * mime-parse.el (mime-content-disposition-parameter): New + function. + (mime-content-disposition-filename): New function. + +1998-05-16 MORIOKA Tomohiko + + * mime-play.el (mime-raw-get-original-filename): Abolish optional + argument 'encoding; modify for 'mime-raw-get-uu-filename. + + * mime-view.el (mime-raw-get-uu-filename): Change interface; don't + check encoding. + (mime-raw-get-subject): Change interface; new implementation. + +1998-05-15 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity): fixed. + + * mime-parse.el (mime-parse-multipart): Change interface. + +1998-05-15 MORIOKA Tomohiko + + * mime-parse.el (make-mime-entity): Add 'content-disposition. + (mime-entity-content-disposition): New function. + (mime-parse-multipart): Modify for 'make-mime-entity. + (mime-parse-message): Modify for 'make-mime-entity. + +1998-05-15 MORIOKA Tomohiko + + * mime-play.el (mime-raw-play-entity): Don't use + 'mime-entity-media-type, 'mime-entity-media-subtype and + 'mime-entity-parameters. + +1998-05-15 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity): Don't use + 'mime-entity-media-type, 'mime-entity-media-subtype and + 'mime-entity-parameters. + +1998-05-15 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-message): Don't use + 'mime-entity-media-type, 'mime-entity-media-subtype and + 'mime-entity-parameters. + +1998-05-17 MORIOKA Tomohiko + + * mime-setup.el: Avoid warning message of byte-compiler. + + +1998-05-15 MORIOKA Tomohiko + + * SEMI: Version 1.4.4 (Ecch-Dþ-Miyazaki)-A released. + + * mime-play.el (mime-mailcap-method-filename-alist): New variable. + (mime-mailcap-method-sentinel): New function. + (mime-activate-mailcap-method): Use 'mime-mailcap-method-sentinel; + don't use 'mime-show-echo-buffer. + +1998-05-14 MORIOKA Tomohiko + + * mime-play.el (mime-activate-mailcap-method): Regard + 'mime-temp-directory. + +1998-05-14 MORIOKA Tomohiko + + * mime-parse.el (make-mime-entity): Change interface and + data-format. + (mime-entity-content-type): New access function. + (mime-entity-media-type): New implementation. + (mime-entity-subtype): New implementation. + (mime-entity-parameters): New implementation. + (mime-parse-multipart): Change interface; modify for + 'make-mime-entity. + (mime-parse-message): Modify for 'make-mime-entity. + + +1998-05-13 MORIOKA Tomohiko + + * SEMI: Version 1.4.3 (Ichiburi) released. + +1998-05-12 Kazuhiro Ohta + + * mime-partial.el: start and end of the region fixed. + +1998-05-12 MORIOKA Tomohiko + + * mime-parse.el (make-mime-content-type): New function. + (mime-parse-Content-Type): Use 'make-mime-content-type. + (mime-parse-multipart): Use 'make-mime-content-type. + +1998-05-12 MORIOKA Tomohiko + + * mime-parse.el: Change data format of mime-content-disposition. + +1998-05-11 MORIOKA Tomohiko + + * mime-parse.el: Rename 'mime/Content-Transfer-Encoding -> + 'mime-read-Content-Transfer-Encoding. + +1998-05-11 MORIOKA Tomohiko + + * mime-view.el (mime-raw-get-subject): Use + 'mime-content-disposition-parameters. + + * mime-play.el (mime-raw-get-original-filename): Use + 'mime-content-disposition-parameters. + + * mime-parse.el (mime-content-disposition-type): New function. + (mime-content-disposition-parameters): New function. + +1998-05-11 MORIOKA Tomohiko + + * mime-parse.el, mime-play.el, mime-view.el: Rename + 'mime/Content-Disposition -> 'mime-read-Content-Disposition. + +1998-05-11 MORIOKA Tomohiko + + * Makefile (PACKAGE): New variable. + (tar): Use $(PACKAGE). + +1998-05-11 MORIOKA Tomohiko + + * mime-parse.el: Change data format of mime-content-type. + +1998-05-11 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-decode-buffer): Use + 'mime-content-type-primary-type, 'mime-content-type-subtype and + 'mime-content-type-parameters. + +1998-05-11 MORIOKA Tomohiko + + * mime-parse.el (mime-content-type-primary-type): New function. + (mime-content-type-subtype): New function. + (mime-content-type-parameters): New function. + (mime-parse-message): Use 'mime-content-type-primary-type, + 'mime-content-type-subtype and 'mime-content-type-parameters. + +1998-05-10 MORIOKA Tomohiko + + * mime-parse.el: Abolish function 'symbol-concat because it is not + used. + + +1998-05-10 MORIOKA Tomohiko + + * SEMI: Version 1.4.2 (Oyashirazu) released. + +1998-05-07 MORIOKA Tomohiko + + * README.en (Authors): New section. + + * README.en (CVS based development): New section. + +1998-05-07 MORIOKA Tomohiko + + * mime-view.el (mime-preview-move-to-previous): Must regard + previous entity separated by null property region. + (mime-preview-move-to-next): Must regard next entity separated by + null property region. + +1998-05-03 Simon Josefsson + + * mime-view.el (mime-preview-move-to-previous): check that new + prop is non-null + + * mime-view.el (mime-preview-move-to-next): skip leading null + props, check that new prop is non-null + +1998-05-07 MORIOKA Tomohiko + + * mime-view.el: Use 'ctree-set-calist-with-default instead of + 'ctree-set-calist-strictly to set up mailcap entries. + + +1998-05-06 MORIOKA Tomohiko + + * SEMI: Version 1.4.1 (-DÒmi)-A released. + + * README.en (Required environment): Modify for FLIM 1.2.0. + +1998-05-06 MORIOKA Tomohiko + + * mime-parse.el: Move 'mime-type/subtype-string to + flim/mime-def.el. + +1998-05-06 MORIOKA Tomohiko + + * mime-play.el (mime-sort-situation): New function. + (mime-raw-play-entity): Use 'mime-sort-situation. + +1998-05-06 MORIOKA Tomohiko + + * mime-play.el (mime-activate-mailcap-method): Use + 'mailcap-format-command. + +1998-05-05 MORIOKA Tomohiko + + * README.en (What's SEMI?): Add description about mailcap. + (Documentation): Add RFC 1524; change location of RFC. + + +1998-05-05 MORIOKA Tomohiko + + * SEMI: Version 1.4.0 (Itoigawa) released. + + * README.en (Required environment): Modify for FLIM 1.1.0. + + * SEMI-CFG: Modify error message for FLIM 1.1.0. + +1998-05-04 MORIOKA Tomohiko + + * semi-def.el: Abolish 'mime/find-file-function because it is not + used. + +1998-05-04 MORIOKA Tomohiko + + * TODO (keymap-prefix): done. + (mailcap support): done. + (Change 'mime-acting-condition to condition-tree format): done. + (Unify entity display specifications to 'mime-preview-condition): + done. + +1998-05-04 MORIOKA Tomohiko + + * NEWS: Add description for SEMI 1.4. + +1998-05-04 MORIOKA Tomohiko + + * mime-view.el: Abolish setting for tm-sh-scripts. + + * semi-setup.el: Abolish MUA depended signature setting. + + * mail-mime-setup.el: Move setting for 'mail-signature from + semi-setup.el. + +1998-05-04 MORIOKA Tomohiko + + * semi-setup.el: Use 'mime-add-condition to set up for mime-pgp. + + * mime-pgp.el: Abolish setting for 'mime-preview-condition and + mime-acting-condition. + + * semi-def.el (mime-condition-type-alist): New variable. + (mime-condition-mode-alist): New variable. + (mime-add-condition): New function. + +1998-05-04 MORIOKA Tomohiko + + * mime-view.el (mime-acting-condition): Use + 'ctree-set-calist-with-default to set up 'mime-method-to-save. + +1998-05-03 MORIOKA Tomohiko + + * mime-view.el (mime-acting-condition): Delete setting for + metamail. + +1998-05-03 MORIOKA Tomohiko + + * mime-play.el (mime-activate-mailcap-method): New function. + (mime-raw-play-entity): Use 'mime-activate-mailcap-method for + mailcap method. + + * mime-view.el (mime-acting-condition): Read mailcap. + +1998-05-03 MORIOKA Tomohiko + + * mailcap.el: Move mailcap.el to FLIM. + +1998-05-02 MORIOKA Tomohiko + + * mime-play.el (mime-raw-play-entity): Sort before registering to + 'mime-acting-situation-examples. + + +1998-04-30 MORIOKA Tomohiko + + * SEMI: Version 1.3.4 (Kajiyashiki) released. + +1998-04-29 MORIOKA Tomohiko + + * SEMI-CFG: Modify messages for APEL 8.7. + + * README.en (Required environment): Modify for APEL 8.7. + +1998-04-29 MORIOKA Tomohiko + + * mime-view.el (mime-view-find-every-acting-situation): Change + default value to 't. + +1998-04-29 MORIOKA Tomohiko + + * mime-play.el (mime-save-acting-situation-examples): New + function; set up for 'kill-emacs-hook. + + * mime-play.el (mime-acting-situation-examples): Renamed from + 'mime-user-acting-condition. + + * mime-play.el: Load MIME acting-example file. + + * mime-view.el (mime-acting-situation-examples-file): New + variable. + +1998-04-29 MORIOKA Tomohiko + + * mime-play.el (mime-raw-play-entity): Use + 'ctree-match-calist-partially. + + +1998-04-28 MORIOKA Tomohiko + + * SEMI: Version 1.3.3 (Uramoto) released. + +1998-04-27 MORIOKA Tomohiko + + * mime-play.el (mime-raw-play-entity): Refer + 'mime-view-find-every-acting-situation. + + * mime-view.el (mime-view): New customize group. + (mime-view-find-every-acting-situation): New variable. + +1998-04-27 MORIOKA Tomohiko + + * mime-play.el (mime-user-acting-condition): New variable. + (mime-raw-play-entity): Refer it. + +1998-04-27 MORIOKA Tomohiko + + * mime-play.el (mime-raw-play-entity): Get all available + acting-situations; display menu of methods to select + acting-situation to activate. + + * semi-def.el (select-menu-alist): New function. + + +1998-04-25 MORIOKA Tomohiko + + * SEMI: Version 1.3.2 (N-Dò)-A was released. + + * mime-edit.el (mime-edit-mode-entity-prefix): New variable. + (mime-edit-mode-entity-map): New variable. + (mime-edit-mode-enclosure-prefix): New variable. + (mime-edit-mode-enclosure-map): New variable. + (mime-edit-mode-map): Use 'mime-edit-mode-entity-map and + 'mime-edit-mode-enclosure-map. + + * mime-view.el (mime-acting-condition): Fix setting. + +1998-04-24 MORIOKA Tomohiko + + * mime-play.el (mime-raw-play-entity): Use 'ctree-match-calist + directly; abolish 'mime/get-content-decoding-alist. + + +1998-04-22 MORIOKA Tomohiko + + * SEMI: Version 1.3.1 (Tsutsuishi) was released. + + * mime-view.el (mime-preview-follow-current-entity): Abolish + unused local variable 'message-info. + +1998-04-22 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-split-ignored-field-regexp): Add + Message-Id field. + +1998-04-22 MORIOKA Tomohiko + + * mail-mime-setup.el: Must require 'alist. + + +1998-04-22 MORIOKA Tomohiko + + * SEMI: Version 1.3.0 (Nadachi) was released. + +1998-04-21 MORIOKA Tomohiko + + * semi-def.el: Don't require 'atype; abolish function + 'field-unifier-for-mode. + +1998-04-21 MORIOKA Tomohiko + + * mime-pgp.el: Use 'ctree-set-calist-strictly instead of + 'set-atype to set up for 'mime-acting-condition. + + * mime-play.el (mime/get-content-decoding-alist): Use + 'ctree-match-calist instead of 'get-unified-alist. + + * mime-view.el (mime-acting-condition): Change format from list of + atype to ctree. + + +1998-04-19 MORIOKA Tomohiko + + * SEMI: Version 1.2.4 (Arimagawa) was released. + + * NEWS: Modify for SEMI 1.2.4 (Arimagawa). + + * mime-view.el (mime-view-display-message): Check 'message-button + is 'visible. + (mime-view-display-entity): Check 'header is 'visible. + +1998-04-19 MORIOKA Tomohiko + + * mime-view.el: Abolish variable + 'mime-view-childrens-header-showing-Content-Type-list and function + 'mime-view-header-visible-p. + (mime-preview-follow-current-entity): Don't use + 'mime-view-header-visible-p. + +1998-04-16 MORIOKA Tomohiko + + * mime-view.el (mime-preview-condition): Don't display body of + message/rfc822 and message/news; add '(entity-button . invisible) + to default situation of child entity. + (mime-view-display-entity): Don't display entity-button if + 'entity-button field value of preview-condition is 'invisible. + + +1998-04-15 MORIOKA Tomohiko + + * SEMI: Version 1.2.3 (Tanihama) was released. + + * mime-view.el: Abolish function 'mime-view-body-visible-p and + 'mime-view-entity-separator-visible-p. + (mime-view-display-entity): Don't use + 'mime-view-entity-separator-visible-p. + +1998-04-14 MORIOKA Tomohiko + + * mime-view.el (mime-preview-condition): Specify + 'childrens-situation field for message/rfc822 and message/news. + (mime-view-display-message): Use value of 'childrens-situation + field of preview-situation as default-situation of children. + (mime-view-display-entity): Add new argument 'default-situation; + use it as elements of draft of preview-situation; use value of + 'header field of preview-situation instead of + 'mime-view-header-visible-p; use value of 'childrens-situation + field of preview-situation as default-situation of children. + + +1998-04-13 MORIOKA Tomohiko + + * SEMI: Version 1.2.2 (Naoetsu) was released. + + * README.en: Modify for FLIM. + +1998-04-13 MORIOKA Tomohiko + + * SEMI-CFG: Modify messages for FLIM and APEL 8.2. + +1998-04-13 MORIOKA Tomohiko + + * SEMI-CFG: Add "flim" instead of "rime" to 'load-path. + +1998-04-12 MORIOKA Tomohiko + + * mime-view.el (mime-calist::field-match-method-as-default-rule): + New function; setup for calist-field-match-method for 'header and + 'body. + +1998-04-11 MORIOKA Tomohiko + + * mime-pgp.el (mime-preview-condition): Add (message-button + . visible) to application/pgp again. + +1998-04-11 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-message): Abolish unused local + variable 'ctype. + (mime-view-display-entity): Abolish unused local variable 'ctype. + + * mime-view.el (mime-view-display-message): Don't use + 'mime-view-content-button-visible-ctype-list; abolish it. + +1998-04-11 MORIOKA Tomohiko + + * mime-view.el (mime-view-entity-button-visible-p): Omit to check + entity is not message. + (mime-view-header-visible-p): Omit to check entity is message. + (mime-view-setup-buffers): Call 'mime-view-display-message instead + of 'mime-view-display-entity. + (mime-view-display-message): New function. + (mime-view-display-entity): Abolish local variable + 'entity-node-id; don't check entity is message or not. + +1998-04-10 MORIOKA Tomohiko + + * SEMI-CFG: Add "rime" instead of "mel" to 'load-path. + +1998-04-10 MORIOKA Tomohiko + + * SEMI-ELS (semi-modules-to-compile): Delete 'mime-def, + 'eword-encode and 'eword-decode. + + * mime-def.el, eword-encode.el, eword-decode.el: Abolish + mime-def.el, eword-decode.el and eword-encode.el; (moved to RIME). + +1998-04-10 MORIOKA Tomohiko + + * mime-parse.el (regexp-or): Moved from semi-def.el. + + * semi-def.el: Move 'regexp-or to mime-parse.el. + Move 'eliminate-top-spaces to mime-def.el. + + * mime-def.el (eliminate-top-spaces): Moved from semi-def.el. + +1998-04-09 MORIOKA Tomohiko + + * SEMI-ELS (semi-modules-to-compile): Add 'semi-def. + + * semi-setup.el: Require 'semi-def instead of 'mime-def. + + * mime-view.el: Require 'semi-def. + + * mime-def.el: Move SEMI depended definitions to semi-def.el. + + * semi-def.el: Move SEMI depended definitions from mime-def.el. + + * eword-decode.el (eword-decode-version): Don't use + `mime-module-version'. + + +1998-04-09 MORIOKA Tomohiko + + * SEMI: Version 1.2.1 (Nomachi) was released. + +1998-04-09 MORIOKA Tomohiko + + * mime-view.el (mime-view-setup-buffers): Don't use + 'mime-raw-flatten-message-info. + (mime-view-display-entity): Display recursively. + +1998-04-09 MORIOKA Tomohiko + + * TODO: New file. + +1998-04-03 MORIOKA Tomohiko + + * eword-decode.el (eword-decode-version): Use + `mime-module-version' instead of `semi-version'. + + * mime-edit.el (mime-edit-version-string): Use + `mime-module-version' instead of `semi-version'. + + * mime-view.el (mime-view-version-string): Use + `mime-module-version' instead of `semi-version'. + + * mime-def.el (mime-module-version): New variable; abolish + `semi-version'. + + +1998-03-26 MORIOKA Tomohiko + + * SEMI: Version 1.2.0 (Nishiizumi) was released. + + * NEWS: Update for SEMI 1.2. + +1998-03-25 MORIOKA Tomohiko + + * mime-text.el: Rename 'mime-view-plain-text-preview-hook -> + 'mime-preview-text/plain-hook. + + * mime-text.el (mime-text-add-url-buttons): New function. + (mime-text-add-url-buttons-maybe): New function. + +1998-03-25 MORIOKA Tomohiko + + * mime-view.el, mime-text.el, mime-image.el: Rename + 'mime-view-filter-for-* -> 'mime-preview-filter-for-*. + +1998-03-25 MORIOKA Tomohiko + + * mime-text.el: Rename 'mime-decode-text-body -> + 'mime-text-decode-body. + +1998-03-25 MORIOKA Tomohiko + + * mime-text.el (mime-decode-text-body): Change interface; call + 'mime-text-decode-hook. + +1998-03-23 MORIOKA Tomohiko + + * VERSION: New file. + + +1998-03-23 MORIOKA Tomohiko + + * SEMI: Version 1.1.2 (Shin-Nishikanazawa) was released. + +1998-03-22 MORIOKA Tomohiko + + * NEWS: Modify about 'image-format. + + * mime-image.el (mime-view-filter-for-image): Refer 'image-format + of preview-situation instead of 'mime-view-image-converter-alist; + abolish variable 'mime-view-image-converter-alist. + +1998-03-22 MORIOKA Tomohiko + + * NEWS: Modify about 'body-filter. + +1998-03-22 MORIOKA Tomohiko + + * mime-image.el: Abolish 'mime-view-ps-to-gif-command. + + * mime-image.el (mime-view-filter-for-image): Change interface. + Abolish `mime-view-filter-for-application/postscript'. + + * mime-text.el (mime-view-filter-for-text/plain): Change + interface. + (mime-view-filter-for-text/richtext): Change interface. + (mime-view-filter-for-text/enriched): Change interface. + + * mime-view.el (mime-view-display-entity): Change interface of + body-filter. + +1998-03-22 MORIOKA Tomohiko + + * mime-image.el (mime-preview-condition): Set 'with-filter in + body-presentation-method for body-filter. + + * mime-view.el (mime-view-display-entity): Call body-filter only + when body-presentation-method is 'with-filter. + +1998-03-21 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity): Modify to omit check + for body-presentation-method. + +1998-03-21 MORIOKA Tomohiko + + * NEWS: Modify about `mime-preview-condition'. + +1998-03-21 MORIOKA Tomohiko + + * mime-image.el: Set up for `mime-preview-condition' instead of + `mime-view-body-visible-condition' and + `mime-view-content-filter-alist'. + + * mime-view.el (mime-preview-condition): New variable. + (mime-view-body-visible-p): Use `mime-preview-condition' instead + of `mime-view-body-visible-condition'; abolish variable + `mime-view-body-visible-condition'. + (mime-view-insert-message/partial-button): Add argument + `situation'. + (mime-view-display-entity): Use `mime-preview-condition' instead + of `mime-view-content-filter-alist'; don't hard-coding for + `message/partial-button'; abolish variable + `mime-view-content-filter-alist'. + +1998-03-21 MORIOKA Tomohiko + + * mime-play.el: Require 'mime-text when compiling. + +1998-03-21 Shuhei KOBAYASHI + + * eword-decode.el (eword-lexical-analyze-internal): Fixed return + value. + + * mime-view.el (mime-view-body-visible-condition): text media- + type is always visible. + + +1998-03-20 MORIOKA Tomohiko + + * SEMI: Version 1.1.1 (Oshino) was released. + + * mime-play.el (mime-method-to-save): Must treat nil encoding as + 7bit. + +1998-03-20 MORIOKA Tomohiko + + * NEWS: Update for latest version. + +1998-03-20 MORIOKA Tomohiko + + * SEMI-CFG: Must set up load-path before version check codes. + +1998-03-20 MORIOKA Tomohiko + + * mime-view.el: Don't require mime-text.el; add autoload setting + for mime-text.el. + (mime-text-decoder-alist): moved from mime-text.el. + (mime-view-entity-separator-visible-p): New function. + Abolish `mime-view-display-header', `mime-view-display-body' and + `mime-view-entity-separator-function'. + + * mime-text.el: Require mime-view (mime-text.el is autoloaded by + mime-view); variable `mime-text-decoder-alist' was moved to + mime-view.el. + + * mime-play.el (mime-method-to-save): fixed. + +1998-03-16 MORIOKA Tomohiko + + * NEWS: New file. + + +1998-03-16 MORIOKA Tomohiko + + * SEMI: Version 1.1.0 (Nonoichi) was released. + +1998-03-15 MORIOKA Tomohiko + + * mime-pgp.el (mime-method-to-verify-application/pgp-signature): + Abolish unused local-variable `raw-buf'. + + * mime-play.el (mime-raw-play-entity): fixed. + + * mime-view.el (mime-preview-original-window-configuration): Use + `defvar' to avoid warning of byte-compiler. + + * mime-view.el (mime-view-display-entity): Don't use + `mime-view-entity-button-function' (abolish it); use + `mime-root-entity-p'. + +1998-03-15 MORIOKA Tomohiko + + * mime-view.el (mime-view-entity-button-visible-p): New function. + (mime-view-entity-button-function): Use function + `mime-view-entity-button-visible-p'. + + * mime-view.el (mime-raw-entity-parent): New function. + (mime-view-entity-button-function): Use `mime-raw-entity-parent'. + + * mime-view.el (mime-view-entity-button-function): Use + `mime-root-entity-p'. + + * mime-parse.el (mime-root-entity-p): New function. + +1998-03-15 MORIOKA Tomohiko + + * SEMI-CFG: Insert version check code. + +1998-03-15 MORIOKA Tomohiko + + * mime-image.el: Set up `mime-view-body-visible-condition' instead + of `mime-view-visible-media-type-list'. + + * mime-view.el (mime-view-body-visible-condition): New variable. + (mime-view-body-visible-p): Use `mime-view-body-visible-condition' + instead of `mime-view-visible-media-type-list'. + Abolish `mime-view-visible-media-type-list'. + + * mime-parse.el (mime-type/subtype-string): New function. + (mime-entity-type/subtype): Use `mime-type/subtype-string'. + +1998-03-14 MORIOKA Tomohiko + + * mime-pgp.el (mime-method-to-verify-application/pgp-signature): + Use `mime-raw-write-region'. + + * mime-view.el (mime-raw-buffer-coding-system-alist): Move setting + for mh-show-mode. + + * mime-play.el, mime-view.el: Rename + `mime-raw-coding-system-alist' -> + `mime-raw-buffer-coding-system-alist'. + + * mime-view.el, mime-play.el: Move `mime-raw-coding-system-alist' + from mime-play.el to mime-view.el. + +1998-03-14 MORIOKA Tomohiko + + * mime-view.el (mime-raw-point-to-entity-node-id): Use + `mime-raw-find-entity-from-point'. + (mime-raw-point-to-entity-number): Likewise. + + * mime-view.el (mime-raw-find-entity-from-point): New function. + +1998-03-14 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-body): Change interface. + +1998-03-14 MORIOKA Tomohiko + + * mime-play.el, mime-view.el: Rename `mime-view-entity-info' -> + `mime-view-entity'. + + * mime-view.el: Rename `mime-raw-entity-number-to-entity-info' -> + `mime-raw-find-entity-from-number'. + + * mime-pgp.el, mime-view.el: Rename + `mime-raw-entity-node-id-to-entity-info' -> + `mime-raw-find-entity-from-node-id'. + + * mime-pgp.el, mime-partial.el, mime-play.el, mime-view.el, + mime-parse.el: Rename `mime-entity-info' -> `mime-entity'. + +1998-03-14 MORIOKA Tomohiko + + * mime-view.el (mime-view-header-visible-p): Change interface. + (mime-view-body-visible-p): Change interface. + + * mime-view.el (mime-view-insert-entity-button): Change interface. + (mime-view-entity-button-function): Change interface. + + * mime-view.el (mime-view-body-visible-p): Add DOC-string. + + * mime-view.el: `rcnum' -> `entity-node-id'. + +1998-03-14 MORIOKA Tomohiko + + * mime-pgp.el (mime-method-to-verify-application/pgp-signature): + Don't use temporary buffer for signed entity. + + * mime-pgp.el (mime-method-to-verify-application/pgp-signature): + Don't use temporary buffer for PGP-signature. + +1998-03-14 MORIOKA Tomohiko + + * mime-pgp.el (mime-method-to-verify-application/pgp-signature): + Use `write-region-as-binary'. + + * mime-pgp.el (mime-method-to-verify-application/pgp-signature): + Use `mime-write-decoded-region'. + + * mime-pgp.el: Rename `rmcnum' -> `mother-node-id'. + +1998-03-14 MORIOKA Tomohiko + + * mime-pgp.el (mime-method-to-decrypt-application/pgp-encrypted): + Use `mime-raw-point-to-entity-node-id'; abolish `entity-number'. + + * (mime-method-to-verify-application/pgp-signature): Use + `mime-raw-point-to-entity-node-id'; abolish `entity-number'. + + * mime-pgp.el (mime-method-to-verify-multipart/signed): Use + `mime-raw-point-to-entity-node-id'. + + * mime-view.el (mime-raw-point-to-entity-node-id): New function. + + * mime-view.el, mime-pgp.el: Rename `reversed-entity-number' -> + `entity-node-id'. + + * mime-view.el, mime-parse.el: Rename `reversed-number' -> + `node-id'. + + * mime-pgp.el: `rcnum' -> `reversed-entity-number'. + + * mime-pgp.el: `cnum' -> `entity-number'. + + * mime-pgp.el: `beg' -> `start'. + +1998-03-13 MORIOKA Tomohiko + + * mailcap.el (mailcap-look-at-field): Change field-name to symbol. + +1998-03-13 MORIOKA Tomohiko + + * mailcap.el (mailcap-look-at-type-field): Must allow + "implicit-wild". + (mailcap-look-at-field): fixed. + +1998-03-13 Shuhei KOBAYASHI + + * README.en (Bug reports): Modify description of tm mailing list. + +1998-03-13 MORIOKA Tomohiko + + * mime-view.el, mime-play.el: Rename + `mime-view-quitting-method-for-mime-show-message-mode' -> + `mime-preview-quitting-method-for-mime-show-message-mode'. + + * mime-play.el, mime-edit.el, mime-view.el: Rename + `mime-view-quitting-method-alist' -> + `mime-preview-quitting-method-alist'. + +1998-03-13 MORIOKA Tomohiko + + * mime-play.el: Rename `mime-article::write-region' -> + `mime-raw-write-region'. + +1998-03-13 MORIOKA Tomohiko + + * mime-pgp.el, mime-play.el: Rename `mime-playback-entity' -> + `mime-raw-play-entity'. + + * mime-play.el, mime-view.el: Rename `mime-view-cinfo' -> + `mime-view-entity-info'. + + * mime-view.el, mime-parse.el: Rename `mime-entity-info-rnum' -> + `mime-entity-info-reversed-number'. + + * mime-view.el: Rename `mime/flatten-content-info' -> + `mime-raw-flatten-message-info'. + + * mime-pgp.el, mime-view.el: Rename `mime-raw-rcnum-to-cinfo' -> + `mime-raw-reversed-entity-number-to-entity-info'. + + * mime-view.el: Rename `mime-raw-cnum-to-cinfo' -> + `mime-raw-entity-number-to-entity-info'. + + * mime-pgp.el, mime-partial.el, mime-view.el: Rename + `mime-raw-entity-info' -> `mime-raw-message-info'. + + * mime-play.el, mime-pgp.el, mime-view.el: Rename + `mime-raw-point-content-number' -> + `mime-raw-point-to-entity-number'. + +1998-03-13 MORIOKA Tomohiko + + * mime-play.el, mime-pgp.el, mime-view.el: Rename ` mime-article/' + -> `mime-raw-'. + + * mime-view.el: Rename `mime-view-get-original-major-mode' -> + `mime-preview-original-major-mode'. + + * mime-view.el: Rename `mime-view-display-x-face' -> + `mime-preview-display-x-face'. + + * mime-play.el, mime-pgp.el, mime-bbdb.el, mime-view.el: Rename + `mime-view-buffer' -> `mime-preview-buffer'. + + * mime-play.el, mime-view.el: Rename `mime::preview/' -> + `mime-preview-'. + + * mime-view.el: Rename `mime-view-original-major-mode' -> + `mime-preview-original-major-mode'. + + * mime-play.el, mime-edit.el, mime-view.el: Rename + `mime-view-kill-buffer' -> `mime-preview-kill-buffer'. + + * mime-view.el: Rename `mime-view-show-summary' -> + `mime-preview-show-summary'. + + * mime-view.el: Rename `mime-view-quit' -> `mime-preview-quit'. + + * mime-view.el: Rename `mime-view-follow-current-entity' -> + `mime-preview-follow-current-entity'. + + * mime-view.el: Rename `mime-view-print-current-entity' -> + `mime-preview-print-current-entity'. + + * mime-view.el (mime-view-menu-list): Modify menu. + + * mime-view.el: Rename `mime-view-extract-current-entity' -> + `mime-preview-extract-current-entity'. + + * mime-def.el, mime-play.el, mime-view.el: Rename + `mime-view-play-current-entity' -> + `mime-preview-play-current-entity'. + + * mime-view.el: Rename `mime-view-previous-line-content' -> + `mime-preview-previous-line-entity'. + + * mime-view.el: Rename `mime-view-next-line-content' -> + `mime-preview-next-line-entity'. + + * mime-view.el: Rename `mime-view-scroll-' -> + `mime-preview-scroll-'. + + * mime-view.el: Rename `mime-view-move-to-' -> + `mime-preview-move-to-'. + + * mime-play.el, mime-image.el: Rename `mime-preview/' -> + `mime-preview-'. + +1998-03-13 MORIOKA Tomohiko + + * mime-partial.el (mime-method-to-combine-message/partial-pieces): + Rename `mime-raw-content-info' -> `mime-raw-entity-info'. + + * mime-pgp.el, mime-view.el: Rename `mime-raw-content-info' -> + `mime-raw-entity-info'. + +1998-03-13 MORIOKA Tomohiko + + * mime-view.el (mime-raw-content-info): Modify DOC-string. + +1998-03-13 MORIOKA Tomohiko + + * eword-encode.el: Abolish `eword-encode-RCS-ID'. + +1998-03-12 MORIOKA Tomohiko + + * mime-partial.el: Rename + `mime-combine-message/partials-automatically' -> + `mime-method-to-combine-message/partial-pieces'. + +1998-03-12 MORIOKA Tomohiko + + * mime-pgp.el (mime-acting-condition): Separate type and subtype. + + * mime-view.el (mime-acting-condition): Separate type and subtype. + + * mime-play.el (mime-playback-entity): Separate type and subtype. + + +1998-03-13 MORIOKA Tomohiko + + * SEMI: Version 1.0.2 (Nonoichi-K-Dòdaimae)-A was released. + +1998-03-12 MORIOKA Tomohiko + + * mime-pgp.el: Rename `mime-pgp-add-keys' -> + `mime-method-to-add-application/pgp-keys'. + + * mime-pgp.el: Rename `mime-pgp-decrypt-application/pgp-encrypted' + -> `mime-method-to-decrypt-application/pgp-encrypted'. + + * mime-pgp.el: Rename `mime-pgp-check-application/pgp-signature' + -> `mime-method-to-verify-application/pgp-signature'. + + * mime-pgp.el: Rename `mime-check-multipart/signed' -> + `mime-method-to-verify-multipart/signed'. + + * mime-pgp.el: Rename `mime-process-application/pgp' -> + `mime-method-for-application/pgp'. + +1998-03-12 MORIOKA Tomohiko + + * mailcap.el (mailcap-look-at-type-field): Change type and subtype + to symbol. + + * mailcap.el (mailcap-file): New variable. + (mailcap-parse-file): New function. + +1998-03-12 MORIOKA Tomohiko + + * README.en (What's SEMI?): Remove what does SEMI stand for. + +1998-03-12 MORIOKA Tomohiko + + * mime-view.el (mime-acting-condition): Use `mime-method-to-save' + instead of external method "tm-file". + + * mime-play.el: Rename `mime-extract-current-entity' -> + `mime-method-to-save'. + +1998-03-12 MORIOKA Tomohiko + + * SEMI-ELS (semi-modules-to-compile): Abolish mime-file.el. + + * mime-play.el (mime-extract-current-entity): New function; copied + from mime-file.el; abolish mime-file.el. + + * mime-view.el (mime-acting-condition), mime-partial.el + (mime-combine-message/partials-automatically), mime-play.el: + Rename `mime-display-message/partial' -> + `mime-method-to-store-message/partial'. + +1998-03-12 MORIOKA Tomohiko + + * mime-view.el (mime-acting-condition), mime-play.el: Rename + `mime-display-caesar' -> `mime-method-to-display-caesar'. + + * mime-view.el (mime-acting-condition), mime-play.el: Rename + `mime-display-message/external-ftp' -> + `mime-method-to-display-message/external-ftp'. + + * mime-view.el (mime-acting-condition), mime-play.el: Rename + `mime-display-message/rfc822' -> + `mime-method-to-display-message/rfc822'. + + * mime-play.el: Rename `mime-article/make-method-args' -> + `mime-make-external-method-args'. + + * mime-file.el: Fix setting. + +1998-03-11 MORIOKA Tomohiko + + * mime-play.el: Rename `mime-article/start-external-method-region' + -> `mime-activate-external-method'. + + * mime-play.el, mime-pgp.el: Rename `mime-display-content' -> + `mime-playback-entity'. + + * mime-file.el (mime-extract-current-entity): Use + `mime-write-decoded-region'. + + * mime-file.el: Rename `mime-article/extract-file' -> + `mime-extract-current-entity'. + +1998-03-03 François Pinard + + * mime-edit.el (mime-edit-insert-signature): Function + `mime-edit-insert-tag' is sometimes called with more arguments + than it is ready to accept. (cf. [tm-en:1585]) + +1998-03-11 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-insert-text): New optional argument + `subtype'. + + +1998-02-28 MORIOKA Tomohiko + + * SEMI: Version 1.0.1 (Magae) was released. + +1998-02-27 MORIOKA Tomohiko + + * mime-pgp.el (mime-check-multipart/signed): New function. + +1998-02-26 MORIOKA Tomohiko + + * eword-decode.el (eword-decode-and-fold-structured-field): Fixed. + + * mime-edit.el (mime-file-types): Use `defcustom'. + + +1998-02-25 MORIOKA Tomohiko + + * SEMI: Version 1.0.0 (Nukaj-Dþtaku-mae)-A was released. + + * SEMI-ELS: Remove mime-tar.el. + +1998-02-25 MORIOKA Tomohiko + + * eword-decode.el (eword-decode-version): Use `semi-version'; + abolish `eword-decode-RCS-ID'. + + * mime-view.el (mime-view-version-string): Use `semi-version'; + abolish `mime-view-version' and `mime-view-RCS-ID'. + + * mime-edit.el (mime-edit-version-string): Use `semi-version'; + abolish `mime-edit-version' and `mime-edit-RCS-ID'. + + * mime-def.el (semi-version): New constant; abolish constant + `semi-version-name'. + + * mime-view.el: Rename `mime-view-version-name' -> + `mime-view-version-string'. + + * mime-edit.el: Rename `mime-edit-version-name' -> + `mime-edit-version-string'. + + * eword-decode.el (eword-lexical-analyzers): New variable. + (eword-analyze-quoted-string): Add second argument. + (eword-analyze-domain-literal): New function. + (eword-analyze-spaces): New function. + (eword-analyze-special): New function. + (eword-analyze-atom): Add second argument. + (eword-lexical-analyze-internal): Use `eword-lexical-analyzers'. + + +1998-02-17 MORIOKA Tomohiko + + * SEMI: Version 0.118.2 (Otomaru) was released. + + * eword-decode.el (eword-decode-and-unfold-structured-field): New + function. + + * eword-decode.el (eword-decode-and-fold-structured-field): New + function. + (eword-decode-structured-field-body): Use it. + (eword-decode-header): Likewise. + + * eword-decode.el (eword-decode-structured-field-body): If + `START-COLUMN' is nil, it uses `mapconcat'. + + * eword-decode.el (eword-decode-token): New function. + (eword-decode-structured-field-body): Add new optional arguments + `START-COLUMN' and `MAX-COLUMN'; fill results; use function + `eword-decode-token'. + (eword-decode-header): Specify START-COLUMN for + `eword-decode-structured-field-body'. + +1998-02-16 MORIOKA Tomohiko + + * eword-decode.el (eword-decode-header): Unfold fields including + encoded-words. + + * eword-decode.el (eword-decode-ignored-field-list): New variable. + (eword-decode-structured-field-list): New variable. + (eword-decode-header): Refer them. + + * eword-decode.el (eword-decode-header): Don't use + `eword-decode-unstructured-field-body'. + +1998-02-16 MORIOKA Tomohiko + + * eword-decode.el (eword-decode-header): New implementation; add + new argument `CODE-CONVERSION' as first argument. Change + `SEPARATOR' as second argument. + + +1998-02-12 MORIOKA Tomohiko + + * SEMI: Version 0.118.1 (Shijima) was released. + + * README.en (Bug reports): Modified for SEMI. + +1998-02-06 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-normalize-body): Must not ignore case to + search "From " in beginning of line. + +1998-01-16 MORIOKA Tomohiko + + * mime-image.el: Comment out setting for inline Postscript + feature. + +1998-01-11 MORIOKA Tomohiko + + * eword-decode.el (eword-analyze-atom): New function. + (eword-lexical-analyze-internal): Use `eword-analyze-atom' instead + of `std11-analyze-atom'. + +1997-11-26 Thierry Emery + + * mime-edit.el (mime-edit-insert-text): Fix to avoid unexpected + entering enriched-mode. (cf. [tm-ja:2697]) + + +1997-11-26 MORIOKA Tomohiko + + * SEMI: Version 0.118 (Sodani) was released. + +1997-11-24 MORIOKA Tomohiko + + * mime-view.el (mime-maybe-hide-echo-buffer): bury MIME echo + buffer. + +1997-11-23 MORIOKA Tomohiko + + * mime-view.el (mime-maybe-hide-echo-buffer): New inline function; + abolish `mime-hide-echo-buffer'. + (mime-view-mode): Use `mime-maybe-hide-echo-buffer'. + +1997-11-20 MORIOKA Tomohiko + + * mime-pgp.el: Rename `mime-article/add-pgp-keys' -> + `mime-pgp-add-keys'. + + * mime-pgp.el: Rename `mime-article/decrypt-pgp' -> + `mime-pgp-decrypt-application/pgp-encrypted'. + + * mime-pgp.el: Rename `mime-article/check-pgp-signature' -> + `mime-pgp-check-application/pgp-signature'. + + * mime-pgp.el: Rename `mime::article/call-pgp-to-check-signature' + -> `mime-pgp-check-signature'. + + * mime-pgp.el: Rename `mime-article/view-application/pgp' -> + `mime-process-application/pgp'. + + +1997-11-16 MORIOKA Tomohiko + + * SEMI: Version 0.116 (D-Dòhòji)-A was released. + +1997-11-15 MORIOKA Tomohiko + + * mime-view.el, mime-pgp.el, mime-partial.el: Rename + `mime::article/content-info' -> `mime-raw-content-info'. + +1997-11-11 François Pinard + + * mime-edit.el: Modify space in prompt and removespurious trailing + spaces in the files. (cf. [tm-en:1507]) + +1997-11-08 MORIOKA Tomohiko + + * mime-edit.el: Rename `mime-edit-enclose-region' -> + `mime-edit-enclose-region-internal'. + + * mime-edit.el (mime-edit-enclose-quote-region, + mime-edit-enclose-mixed-region, mime-edit-enclose-parallel-region, + mime-edit-enclose-digest-region, + mime-edit-enclose-alternative-region, + mime-edit-enclose-signed-region, + mime-edit-enclose-encrypted-region): Change subtype to symbol. + +1997-11-06 MORIOKA Tomohiko + + * mime-bbdb.el, semi-setup.el: Use path-util.el instead of + file-detect.el. + +1997-11-05 MORIOKA Tomohiko + + * mime-def.el: Add group `mime' to `default-mime-charset'. + +1997-11-04 MORIOKA Tomohiko + + * eword-encode.el (eword-encode-field): Must regard MIME-Version + field as structured field. + + +1997-11-04 MORIOKA Tomohiko + + * SEMI: Version 0.115.2 (Inokuchi) was released. + +1997-11-04 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-split-message): Use `defcustom'. + (mime-edit-message-default-max-lines): Use `defcustom'. + (mime-edit-message-max-lines-alist): Use `defcustom'. + +1997-11-04 MORIOKA Tomohiko + + * Makefile: Abolish `execs' and `install-execs'. + +1997-11-04 MORIOKA Tomohiko + + * mime-edit.el (mime-edit): New customize group. + (mime-ignore-preceding-spaces): Use `defcustom'. + (mime-ignore-trailing-spaces): Use `defcustom'. + (mime-ignore-same-text-tag): Use `defcustom'. + (mime-auto-hide-body): Use `defcustom'. + (mime-edit-voice-recorder): Use `defcustom'. + (mime-edit-mode-hook): Use `defcustom'. + (mime-edit-translate-hook): Use `defcustom'. + (mime-edit-exit-hook): Use `defcustom'. + + * mime-def.el (mime): New customize group. + (mime-button-face): Use `defcustom'. + (mime-button-mouse-face): Use `defcustom'. + +1997-11-04 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-x-emacs-value): Don't add mule-version + if enable-multibyte-characters is nil. + +1997-10-31 Kazuhiro Ohta + + * mime-play.el (mime-article::write-region): fixed + (cf. [tm-ja:2641]). + +1997-10-21 MORIOKA Tomohiko + + * semi-setup.el (mime-setup-set-signature-key): Check local keymap + is exist or not to fix problem about + `gnus-summary-resend-message'. + + +1997-10-04 MORIOKA Tomohiko + + * SEMI: Version 0.115.1 (Oyanagi) was released. + +1997-10-03 Shuhei KOBAYASHI + + * mime-play.el (mime-display-message/partial): Use `write-region'. + + * mime-pgp.el (mime-article/check-pgp-signature): Use + `write-region'. + + * mime-file.el (mime-article/extract-file): Use `write-region'. + +1997-10-02 MORIOKA Tomohiko + + * mime-def.el: Don't use `third' (don't use cl function). + + * SEMI-CFG: Add current directory to load-path. + + * mime-def.el, mime-edit.el (mime-edit-insert-text): Rename + `second' -> `cadr' (Don't use cl function). + + +1997-09-28 MORIOKA Tomohiko + + * SEMI: Version 0.115 (Hinomiko) was released. + + * README.en: Modify for Emacs 20.2. + +1997-09-25 MORIOKA Tomohiko + + * mime-def.el (butlast, nbutlast): Don't use `defun-maybe' for cl + functions. + +1997-09-25 MORIOKA Tomohiko + + * mime-def.el (butlast): New function; imported from cl.el. + (nbutlast): New function; imported from cl.el. + +1997-09-25 MORIOKA Tomohiko + + * mime-view.el (mime-view-cut-header): Don't use `member-if'. + + * mime-def.el: Don't require cl. + + * eword-encode.el: Abolish variable `eword-generate-X-Nsubject'. + (eword-encode-header): Abolish X-Nsubject field generator. + + * eword-encode.el (eword-find-field-encoding-method): New inline + function. + (eword-encode-header): Use it. + +1997-09-25 MORIOKA Tomohiko + + * mime-image.el: Use `exec-installed-p' to search + `uncompface-program'. + +1997-09-24 Shuhei KOBAYASHI + + * signature.el: Add doc-string to `signature-file-alist'. + + * mime-bbdb.el: Remove Artur Pioro from the authors list; Recent + versions don't contain his code. + +1997-09-21 MORIOKA Tomohiko + + * mime-view.el: Don't use cl. + (mime-article/rcnum-to-cinfo): New implementation (use function + `mime-article/cnum-to-cinfo'); use `defsubst'. + +1997-09-18 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-x-emacs-value): Use `(featurep + 'xemacs)'; add DOC-string. + +1997-09-17 Hisashi Miyashita + + * mime-edit.el (mime-edit-x-emacs-value): Add `(Meadow-version)' + when running Meadow. (cf. [tm-ja:2567], [mule-win32:4339]) + +1997-09-15 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-mime-version-field-for-message/partial): + New constant. + (mime-edit-insert-partial-header): Use it. + + +1997-09-09 MORIOKA Tomohiko + + * SEMI: Version 0.112 (Tsurugi) was released. + +1997-09-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-insert-entity-button): Change interface + to use `media-type' and `media-subtype' instead of `ctype'. + (mime-view-entity-button-function): ditto. + +1997-09-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-body-visible-p): Change interface to use + `media-type' and `media-subtype' instead of `ctype'. + (mime-view-entity-separator-function): ditto. + +1997-09-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity): Use `media-type' and + `media-subtype' instead of `ctype' to compare with + message/partial. + + * mime-view.el (mime-view-follow-current-entity, + mime-view-display-entity, mime-view-entity-button-function): Use + `mime-entity-info-media-type' and `mime-entity-info-media-subtype' + instead of `mime-entity-info-type/subtype'. + +1997-09-05 MORIOKA Tomohiko + + * mime-parse.el: Abolish macro `define-structure'. + + (make-mime-entity-info, mime-entity-info-rnum, + mime-entity-info-point-min, mime-entity-info-point-max, + mime-entity-info-parameters, mime-entity-info-encoding, + mime-entity-info-children): New implementation. + + (mime-entity-info-media-type, mime-entity-info-media-subtype): New + inline function. + + * mime-view.el (mime-view-display-entity, + mime-article/point-content-number, mime-article/cnum-to-cinfo, + mime/flatten-content-info): Use `mime-entity-info-children' + instead of `mime::content-info/children'. + + * mime-parse.el (mime-entity-info-children): New inline function. + +1997-09-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-body-visible-p, + mime-view-display-entity): Use `mime-entity-info-encoding' instead + of `mime::content-info/encoding'. + + * mime-play.el (mime-display-content): Use + `mime-entity-info-encoding' instead of + `mime::content-info/encoding'. + + * mime-parse.el (mime-entity-info-encoding): New inline function. + +1997-09-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity), mime-partial.el + (mime-combine-message/partials-automatically), mime-play.el + (mime-display-content): Use `mime-entity-info-parameters' instead + of `mime::content-info/parameters'. + + * mime-parse.el (mime-entity-info-parameters): New inline + function. + +1997-09-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-header-visible-p, + mime-view-body-visible-p, mime-view-entity-button-function, + mime-view-display-entity, mime-view-follow-current-entity), + mime-play.el (mime-display-content): Use + `mime-entity-info-type/subtype' instead of + `mime::content-info/type'. + + * mime-parse.el (mime-entity-info-type/subtype): New inline + function. + +1997-09-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity, + mime-article/rcnum-to-cinfo, mime-view-follow-current-entity, + mime-view-move-to-upper): Use `mime::content-info/rcnum' instead + of `mime-entity-info-rnum'. + + * mime-parse.el (mime-entity-info-rnum): New inline function. + +1997-09-05 MORIOKA Tomohiko + + * mime-view.el (mime-view-display-entity, + mime-article/point-content-number, + mime-view-follow-current-entity), mime-play.el + (mime-display-content), mime-pgp.el + (mime-article/check-pgp-signature, mime-article/decrypt-pgp): Use + `mime-entity-info-point-{min|max}' instead of + `mime::content-info/point-{min|max}'. + + * mime-parse.el (mime-entity-info-point-min): New inline function. + (mime-entity-info-point-max): New inline function. + (mime-parse-multipart): Use `mime-entity-info-point-max' instead + of `mime::content-info/point-max'. + +1997-09-05 MORIOKA Tomohiko + + * mailcap.el (mailcap-skip-comment): Check `chr' is nil. + + * mime-edit.el (mime-edit-decode-buffer): Modify for new return + format of `mime-parse-Content-Type'. + + * mime-parse.el (mime-parse-Content-Type): Change return format. + (mime-read-Content-Type): Modify DOC-string. + (make-mime-entity-info): New inline function. + (mime-parse-multipart): Change interface. + (mime-parse-message): Rename names of arguments. + + * mime-def.el (mime-tspecials): Remove `.' and control-characters. + (mime-token-regexp): Add specification for control-characters. + +1997-09-04 MORIOKA Tomohiko + + * mime-view.el (mime-view-cut-header): Use `defun' instead of + `defsubst'. + + * mime-view.el: Rename `mime-preview/display-body' -> + `mime-view-display-body'. + + * mime-view.el: Rename `mime-preview/display-header' -> + `mime-view-display-header'. + +1997-09-03 MORIOKA Tomohiko + + * mime-parse.el, mime-edit.el: Rename `mime/Content-Type' -> + `mime-read-Content-Type'. + + * mime-parse.el (symbol-concat): New implementation. + +1997-08-30 MORIOKA Tomohiko + + * mime-def.el: Abolish alias `last*'. + + * eword-decode.el (eword-lexical-analyze): `last' of Emacs 20.0.97 + allows two arguments. + +1997-08-25 MORIOKA Tomohiko + + * eword-decode.el (eword-lexical-analyze): Use `last*' instead of + `last' (for Emacs 20.0.96). + + * mime-def.el (last*): New alias for old emacsen. + +1997-07-26 MORIOKA Tomohiko + + * mime-parse.el, mime-def.el: Constant + `mime-disposition-type-regexp' was moved from mime-def.el to + mime-parse.el. + + +1997-07-25 MORIOKA Tomohiko + + * SEMI: Version 0.97 (Naka-Tsurugi) was released. + +1997-07-24 MORIOKA Tomohiko + + * mime-edit.el: Delete unnecessary "[mime-edit.el]" from + DOC-strings. + +1997-07-23 MORIOKA Tomohiko + + * eword-decode.el (eword-analyze-encoded-word): cdr of return + value must not nil (cf.[tm-ja:2496]) + +1997-07-14 MORIOKA Tomohiko + + * mime-view.el, mime-play.el: `mime-article/view-message/rfc822' + -> `mime-display-message/rfc822'. + +1997-07-13 MORIOKA Tomohiko + + * eword-encode.el (eword-phrase-route-addr-to-rwl): Use function + `eword-addr-seq-to-rwl'. + + * eword-encode.el: `tm-eword::phrase-route-addr-to-rwl' -> + `eword-phrase-route-addr-to-rwl'. + + * eword-encode.el (eword-addr-seq-to-rwl): New function. + (eword-addr-spec-to-rwl): Use function `eword-addr-seq-to-rwl'. + + * eword-encode.el (eword-addr-spec-to-rwl): New implementation. + + * eword-encode.el: `tm-eword::addr-spec-to-rwl' -> + `eword-addr-spec-to-rwl'. + +1997-07-07 MORIOKA Tomohiko + + * mime-parse.el: Constant `mime::ctype-regexp' was abolished. + + * mime-parse.el: Constant `mime::dtype-regexp' was abolished. + + * mime-parse.el, mime-def.el: `mime/disposition-type-regexp' -> + `mime-disposition-type-regexp'. + + +1997-07-07 MORIOKA Tomohiko + + * SEMI: Version 0.96 (Kaga-Ichinomiya) was released. + +1997-07-05 MORIOKA Tomohiko + + * mime-edit.el: (mime-edit-normalize-body): + - Protect "From " in beginning of line (insert `ESC ( B' before it + if possible, otherwise encode by quoted-printable) + - canonicalize line break code for base64 + +1997-07-04 MORIOKA Tomohiko + + * signature.el (signature-separator): New variable. + (insert-signature): Insert `signature-separator' when signature is + inserted at end of file. + +1997-07-03 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-version-name): Add `semi-version-name'. + + * mime-view.el (mime-view-version-name): New constant. + + * mime-def.el (semi-version-name): New constant. + +1997-07-02 MORIOKA Tomohiko + + * README.en (Required environment): Updated. + +1997-07-02 MORIOKA Tomohiko + + * mime-parse.el, mime-def.el: `mime/content-type-subtype-regexp' + -> `mime-media-type/subtype-regexp'. + +1997-07-02 MORIOKA Tomohiko + + * mime-parse.el, mime-def.el, mailcap.el: `mime/token-regexp' -> + `mime-token-regexp'. + + * mime-def.el: `mime/tspecials' -> `mime-tspecials'. + +1997-07-02 MORIOKA Tomohiko + + * mime-play.el, mime-pgp.el, mime-def.el: `mime/temp-buffer-name' + -> `mime-temp-buffer-name'. + +1997-07-02 MORIOKA Tomohiko + + * mime-text.el (mime-decode-text-body): Canonicalize line break + code. + +1997-06-27 MORIOKA Tomohiko + + * mailcap.el: New file. + +1997-06-26 MORIOKA Tomohiko + + * eword-encode.el (eword-field-encoding-method-alist): Add + "Message-ID" as ignored. + +1997-06-26 MORIOKA Tomohiko + + * eword-encode.el (tm-eword::encode-string-1): avoid infinite loop + caused by long non-encoded-word element. (cf. [tm-en:1356]) + +1997-06-24 MORIOKA Tomohiko + + * mime-view.el: `mime-preview/display-message/partial' -> + `mime-view-insert-message/partial-button'. + + * mime-view.el (mime-preview/display-message/partial): Use + `mime-add-button' again. + +1997-06-21 MORIOKA Tomohiko + + * eword-encode.el: `tm-eword::lc-words-to-words' -> + `eword-encode-charset-words-to-words'. + + * eword-encode.el (tm-eword::lc-words-to-words): New + implementation; function `tm-eword::parse-word' was abolished. + +1997-06-21 MORIOKA Tomohiko + + * eword-encode.el: `tm-eword::split-to-lc-words' -> + `eword-encode-divide-into-charset-words'. + + * eword-encode.el: Function `tm-eword::parse-lc-word' was + abolished. + (tm-eword::split-to-lc-words): New implementation. + +1997-06-21 MORIOKA Tomohiko + + * eword-encode.el: `tm-eword::char-type' -> + `eword-encode-char-type'. + + * eword-encode.el: `tm-eword::encode-encoded-text' -> + `eword-encode-text' + + * mime-view.el (mime-view-insert-entity-button, + mime-preview/display-message/partial): Use `mime-insert-button'. + + (mime-view-setup-buffers): Enclose codes to display preview-buffer + by `(let ((inhibit-read-only t)) ...)'. + + * mime-def.el (mime-insert-button): New inline function. + + * mime-def.el (mime-add-button): Argument `func' was renamed to + `function'; Use overlay for `mime-button-mouse-face'. + + +1997-06-19 MORIOKA Tomohiko + + * SEMI: Version 0.92 was released. + + * mime-view.el, mime-play.el, mime-partial.el: + `mime-article/decode-' -> `mime-display-'. + + * mime-play.el (mime-display-caesar): fixed. + +1997-06-18 MORIOKA Tomohiko + + * eword-decode.el (eword-decode-structured-field-body): fixed. + +1997-06-16 MORIOKA Tomohiko + + * eword-decode.el (eword-lexical-analyze-cache): New variable. + (eword-lexical-analyze-cache-max): New variable. + (eword-analyze-quoted-string): New function. + (eword-analyze-comment): New function. + (eword-analyze-encoded-word): New function. + (eword-lexical-analyze-internal): New function. + (eword-lexical-analyze): New function. + (eword-decode-structured-field-body): New function. + (eword-decode-unstructured-field-body): New function. + (eword-extract-address-components): New function. + +1997-06-11 Steven L Baur + + * eword-encode.el (tm-eword::char-type, tm-eword::encode-rwl, + tm-eword::encode-rwl): Clean up Ebola + infection. (cf.[tm-en:1346],[xemacs-beta:9333]) + + +1997-05-30 MORIOKA Tomohiko + + * SEMI: Version 0.91 was released. + +Wed May 28 13:16:15 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-define-keymap): fixed problem about + [tab], [delete] and [backspace] keys. + +Tue May 27 03:26:23 1997 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-sign-pgp-elkins): Enclose PGP-processing + by `as-binary-process'. + +1997-05-23 Steven L Baur + + * mime-view.el (mime-acting-condition): Add image/png + mime type. (cf.[tm-en:1334]) + + * mime-image.el: Add image/png mime type. (cf.[tm-en:1334]) + + * mime-edit.el (mime-file-types): Add png handling. + (mime-content-types): Ditto. (cf.[tm-en:1334]) + +Fri May 23 22:13:47 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-define-keymap): Doesn't bind + `beginning-of-buffer' and `end-of-buffer' for "<" and ">" keys. + + +1997-05-15 MORIOKA Tomohiko + + * SEMI: Version 0.88 was released. + +Thu May 15 06:05:13 1997 MORIOKA Tomohiko + + * Makefile (tar): New implementation. + +Tue May 13 14:32:39 1997 MORIOKA Tomohiko + + * SEMI-MK (config-semi): fixed. + + * SEMI-CFG: Add site-lisp/apel/ even if LISPDIR is specified. + +Tue May 13 14:11:48 1997 MORIOKA Tomohiko + + * README.en: Add `LISPDIR'. + + * Makefile (LISPDIR): New variable. + + * SEMI-CFG: Setting for load-path is modified. + +Mon May 12 12:30:42 1997 MORIOKA Tomohiko + + * mime-tar.el, mime-play.el, mime-pgp.el, mime-file.el, + mime-view.el: `mime/content-decoding-condition' -> + `mime-acting-condition'. + + +1997-05-09 MORIOKA Tomohiko + + * SEMI: Version 0.87 was released. + +Fri May 9 04:19:21 1997 MORIOKA Tomohiko + + * mime-tar.el: `mime-viewer/uuencode-encoding-name-list' -> + `mime-view-uuencode-encoding-name-list'. + +Fri May 9 03:07:02 1997 MORIOKA Tomohiko + + * mime-edit.el: Use "text/x-rot13-47-48" instead of + "text/x-rot13-47". + + * mime-view.el (mime/content-decoding-condition): Add + "text/x-rot13-47-48". + +Fri May 9 01:26:13 1997 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-normalize-body): Use + `mule-caesar-region' instead of `caesar-region'. + + * mime-play.el (mime-display-caesar): Use `mule-caesar-region' + instead of `caesar-region'. + + * mime-def.el: Add autoload for mule-caesar.el. + + * mime-def.el: Function caesar-region was abolished. + +Thu May 8 23:31:45 1997 MORIOKA Tomohiko + + * mime-play.el, mime-edit.el, mime-def.el: `tm:caesar-region' -> + `caesar-region'. + +Thu May 8 22:37:47 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-define-keymap): Use + `set-keymap-default-binding' for XEmacs. + +Wed May 7 10:04:36 1997 MORIOKA Tomohiko + + * mime-play.el (mime-display-caesar): Don't use + `buffer-substring'. + + * mime-play.el (mime-display-caesar): Use `view-buffer' instead of + `view-mode-enter'. + +Wed May 7 09:37:54 1997 MORIOKA Tomohiko + + * mime-play.el: Don't require `view'. + + Constant `mime-view-text/plain-mode-map' was abolished. + + Function `mime-view-text/plain-mode' and + `mime-view-text/plain-exit' were abolished. + + (mime-display-caesar): Use `view-mode-enter mother' instead of + `mime-view-text/plain-mode'. + +Wed May 7 09:33:48 1997 MORIOKA Tomohiko + + * mime-play.el, mime-view.el (mime/content-decoding-condition): + `mime-article/decode-caesar' -> `mime-display-caesar'. + +Wed May 7 05:49:03 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-cut-header): fixed. (cf.[tm-ja:2386]) + + +1997-04-30 MORIOKA Tomohiko + + * SEMI: Version 0.83 was released. + +Sat Apr 5 06:20:34 1997 MORIOKA Tomohiko + + * mime-def.el: Overlay is required by emu. + +Thu Apr 3 18:09:35 1997 MORIOKA Tomohiko + + * mime-image.el, mime-view.el, mime-text.el: + `mime-preview/filter-' -> `mime-view-filter-'. + + * mime-view.el: `mime-preview/get-original-major-mode' -> + `mime-view-get-original-major-mode'. + +Thu Mar 27 22:16:53 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-mode): Hide mime-echo window. + + * mime-view.el: Function `mime-hide-echo-buffer' was moved from + mime-play.el. + + * mime-play.el: Function `mime-hide-echo-buffer' was moved to + mime-view.el. + + * mime-play.el (mime-hide-echo-buffer): New inline function. + + * mime-play.el (mime-echo-window-height): New variable. + +Thu Mar 27 21:48:32 1997 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-content-end): Abolish unused local + variable `beg'. + +Thu Mar 27 21:45:49 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-follow-current-entity): Abolish unused + local variable `rc'. + +Thu Mar 27 21:42:08 1997 MORIOKA Tomohiko + + * eword-encode.el (eword-encode-field): Intern down-cased + field-name and use `memq' instead of `member' to detect a field is + address-list or not. + +Thu Mar 27 21:17:25 1997 MORIOKA Tomohiko + + * mime-pgp.el (mime-article/check-pgp-signature): Use + `insert-buffer-substring'. + +Thu Mar 27 20:59:00 1997 MORIOKA Tomohiko + + * mime-pgp.el (mime-article/check-pgp-signature): + `mime-article/show-output-buffer' -> `mime-show-echo-buffer'. + + * mime-play.el: `mime-article/show-output-buffer' -> + `mime-show-echo-buffer'. + + * mime-play.el: `mime/output-buffer-window-is-shared-with-bbdb' -> + `mime-echo-window-is-shared-with-bbdb'. + +Thu Mar 27 20:47:14 1997 MORIOKA Tomohiko + + * mime-play.el: Variable + `mime/output-buffer-window-is-shared-with-bbdb' was moved from + mime-def.el. + + * mime-def.el: Variable + `mime/output-buffer-window-is-shared-with-bbdb' was moved to + mime-play.el. + +Thu Mar 27 20:40:57 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-mode): `mime/output-buffer-name' -> + `mime-echo-buffer-name'. + + * mime-play.el: `mime/output-buffer-name' -> + `mime-echo-buffer-name'. + + * mime-pgp.el (mime-article/check-pgp-signature): + `mime/output-buffer-name' -> `mime-echo-buffer-name'. + + * mime-def.el (mime-echo-buffer-name): Renamed from + `mime/output-buffer-name'. + +Fri Mar 21 17:55:10 1997 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-content-end): Abolish unused local + variable `top'. + + * mime-view.el: Function `mime-view-make-preview-buffer' was + abolished. + + * mime-view.el: `mime-view-setup-buffer' -> + `mime-view-setup-buffers'. + + +1997-03-18 MORIOKA Tomohiko + + * MU: Version 0.40.2 was released. + * SEMI: Version 0.75 was released. + +Tue Mar 18 15:28:25 1997 MORIOKA Tomohiko + + * mime-edit.el (mime-edit-translate-single-part-tag): Add + DOC-string. + +Tue Mar 18 15:21:28 1997 MORIOKA Tomohiko + + * mime-view.el: `mime::preview/original-major-mode' -> + `mime-view-original-major-mode'. + +Tue Mar 18 15:17:48 1997 MORIOKA Tomohiko + + * mime-play.el, mime-view.el: `mime::preview/mother-buffer' -> + `mime-mother-buffer'. + +Tue Mar 18 15:12:10 1997 MORIOKA Tomohiko + + * mime-text.el, mime-play.el, mime-edit.el, mime-view.el: + `mime::preview/article-buffer' -> `mime-raw-buffer'. + +Tue Mar 18 14:47:23 1997 MORIOKA Tomohiko + + * mime-tar.el, mime-play.el, mime-pgp.el, mime-bbdb.el, + mime-view.el: `mime::article/preview-buffer' -> + `mime-view-buffer'. + +Tue Mar 18 14:32:53 1997 MORIOKA Tomohiko + + * mime-view.el: Structure `mime::preview-content-info' was + abolished. + + (mime-view-setup-buffer): Return only + `mime::article/preview-buffer'. + + (mime-view-make-preview-buffer): Don't generate + preview-content-list; Return only `mime::article/preview-buffer'. + + (mime-view-display-entity): Don't create + `mime::preview-content-info'. + + (mime-view-mode): Don't set for `mime::preview/content-list'. + +Tue Mar 18 13:56:18 1997 MORIOKA Tomohiko + + * mime-partial.el (mime-combine-message/partials-automatically): + Don't use preview-content-list. + +Tue Mar 18 13:06:09 1997 MORIOKA Tomohiko + + * semi-setup.el: Don't require mime-partial; It is autoloaded. + + * mime-partial.el: `mime-article/grab-message/partials' -> + `mime-combine-message/partials-automatically'. + + * mime-partial.el: `mime-partial/preview-article' -> + `mime-view-partial-message'. + + * mime-partial.el: `mime-partial/preview-article-method-alist' -> + `mime-view-partial-message-method-alist'. + + * mime-play.el + (mime-view-quitting-method-for-mime-show-message-mode): Don't use + preview-content-list. + + * mime-text.el (mime-text-decoder-alist): `mime/show-message-mode' + -> `mime-show-message-mode'. + + * mime-pgp.el (mime-article/view-application/pgp): + `mime/show-message-mode' -> `mime-show-message-mode'. + + * mime-view.el (mime-view-follow-current-entity): New + implementation. + +Tue Mar 18 08:24:07 1997 MORIOKA Tomohiko + + * mime-view.el: `mime-view-follow-content' -> + `mime-view-follow-current-entity'. + + * mime-view.el (mime-view-mode): Don't use preview-content-list to + move to initial point. + + * mime-view.el: Function `mime-preview/cinfo-to-pcinfo' was + abolished. + + * mime-view.el: Function `mime-preview/point-pcinfo' was + abolished. + + * mime-view.el: Function `mime-preview/point-content-number' was + abolished. + + * mime-play.el (mime-view-play-current-entity): New + implementation. + +Mon Mar 17 17:18:29 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-quit): Use variable + `mime::preview/original-major-mode'. + + * mime-view.el (mime-view-show-summary): Use variable + `mime::preview/original-major-mode'. + + * mime-view.el (mime-view-scroll-down-entity): New implementation. + + * mime-view.el (mime-view-scroll-up-entity): New implementation. + +Mon Mar 17 16:19:30 1997 MORIOKA Tomohiko + + * mime-view.el: `mime-view-scroll-down-content' -> + `mime-view-scroll-down-entity'. + + * mime-view.el: `mime-view-scroll-up-content' -> + `mime-view-scroll-up-entity'. + + * mime-view.el (mime-view-move-to-next): New implementation. + +Mon Mar 17 16:03:11 1997 MORIOKA Tomohiko + + * mime-view.el: `mime-view-next-content' -> + `mime-view-move-to-next'. + + * mime-view.el (mime-view-move-to-previous): New implementation. + + * mime-view.el: `mime-view-previous-content' -> + `mime-view-move-to-previous'. + + * mime-view.el: `mime-view-up-content' -> + `mime-view-move-to-upper'. + +Mon Mar 17 15:39:17 1997 MORIOKA Tomohiko + + * mime-view.el, mime-play.el: `mime/show-message-mode' -> + `mime-show-message-mode'. + + * mime-view.el (mime-view-up-content): New implementation. + + * mime-view.el: `mime-preview/display-content' -> + `mime-view-display-entity'. + + * mime-view.el (mime-preview/display-content): Put + `mime-view-raw-buffer' and `mime-view-cinfo' as text-property. + + * mime-view.el: Variable `mime-view-visible-field-regexp' was + abolished. + + * mime-view.el: `mime-preview/cut-header' -> + `mime-view-cut-header'. + + * mime-view.el (mime-view-entity-separator-function): New + implementation. + + * mime-view.el: `mime-preview/default-content-separator' -> + `mime-view-entity-separator-function'. + +Mon Mar 17 13:49:27 1997 MORIOKA Tomohiko + + * mime-view.el (mime-view-header-visible-p): Abolish optional + argument `ctype'. + + * mime-view.el (mime-view-entity-button-function): New + implementation. + + * mime-view.el: Variable + `mime-view-content-button-ignored-ctype-list' was abolished. + + * mime-view.el: `mime-preview/default-content-button-function' -> + `mime-view-entity-button-function'. + + * mime-view.el: Variable `mime-preview/content-button-function' + was abolished. + + * mime-def.el (mime-add-button): New implementation. + + * mime-view.el (mime-view-insert-entity-button): modified. + + * mime-view.el: `mime-preview/insert-content-button' -> + `mime-view-insert-entity-button'. + + * mime-view.el (mime-view-header-visible-p): Don't calculate ctype + is optional argument `ctype' is not nil. + +Mon Mar 17 12:12:01 1997 MORIOKA Tomohiko + + * mime-view.el: `mime-print-entity' -> + `mime-view-print-current-entity'. + + * mime-view.el: `mime-extract-entity' -> + `mime-view-extract-current-entity'. + + * mime-play.el, mime-view.el: `mime-play-entity' -> + `mime-view-play-current-entity'. + + * mime-view.el (mime-play-entity, mime-extract-entity, + mime-print-entity): Add DOC-string. + + * mime-view.el: `mime-view-print-content' -> `mime-print-entity'. + + * mime-view.el: `mime-view-extract-content' -> + `mime-extract-entity'. + + * mime-play.el: Variable `mime-view-decoding-mode' was abolished. + + * mime-play.el: Variable `mime-view-decoding-mode' was moved from + mime-view.el. + + * mime-view.el: Variable `mime-view-decoding-mode' was moved to + mime-play.el. + +Mon Mar 17 05:09:05 1997 MORIOKA Tomohiko + + * mime-view.el: Use `mime-play-entity' instead of + `mime-view-play-content'. + +Mon Mar 17 05:06:33 1997 MORIOKA Tomohiko + + * mime-view.el, mime-play.el: `mime-preview/decode-content' -> + `mime-play-entity'. + + * mime-view.el (mime-view-play-content, mime-view-extract-content, + mime-view-print-content): Modify to use optional argument `mode'. + +Mon Mar 17 04:41:21 1997 MORIOKA Tomohiko + + * mime-play.el (mime-preview/decode-content, + mime-article/decode-content): Add new optional argument `mode'. + +Sun Mar 16 02:23:31 1997 MORIOKA Tomohiko + + * mime-text.el: `mime-charset/maybe-decode-buffer' -> + `mime-text-decode-buffer-maybe'. + + * mime-text.el: `mime-preview/decode-text-buffer' -> + `mime-decode-text-body'. + + * mime-view.el (mime-view-visible-media-type-list): Add + "text/rfc822-headers". + +Sun Mar 16 01:02:03 1997 MORIOKA Tomohiko + + * mime-image.el, mime-view.el: + `mime-view-default-showing-Content-Type-list' -> + `mime-view-visible-media-type-list'. + +Sun Mar 16 00:22:03 1997 MORIOKA Tomohiko + + * mime-play.el: `mime-raw::text-decoder' -> `mime-text-decoder'. + + * mime-pgp.el (mime-article/view-application/pgp): + `mime-charset/decode-buffer' -> `mime-text-decode-buffer'. + + * mime-text.el: `mime-charset/decode-buffer' -> + `mime-text-decode-buffer'. + +Sat Mar 15 23:59:09 1997 MORIOKA Tomohiko + + * mime-pgp.el (mime-article/view-application/pgp): + `mime-raw::text-decoder' -> `mime-text-decoder'. + + * mime-text.el: `mime-raw::text-decoder' -> `mime-text-decoder'. + +Sat Mar 15 23:53:49 1997 MORIOKA Tomohiko + + * mime-text.el: Variable `mime-raw::text-decoder' was moved from + mime-view.el. + + * mime-view.el: Variable `mime-raw::text-decoder' was moved to + mime-text.el. + +Sat Mar 15 22:40:50 1997 MORIOKA Tomohiko + + * mime-pgp.el (mime-article/view-application/pgp): Use + `insert-buffer-substring'. + +Sat Mar 15 22:27:53 1997 MORIOKA Tomohiko + + * mime-pgp.el (mime-article/view-application/pgp): + `mime::article/code-converter' -> `mime-raw::text-decoder'. + + * mime-play.el (mime-article/view-message/rfc822): + `mime::article/code-converter' -> `mime-raw::text-decoder'. + + * mime-text.el (mime-preview/decode-text-buffer): + `mime::article/code-converter' -> `mime-raw::text-decoder'. + + * mime-view.el: `mime::article/code-converter' -> + `mime-raw::text-decoder'. + +Sat Mar 15 21:20:02 1997 MORIOKA Tomohiko + + * mime-pgp.el (mime-article/add-pgp-keys): Abolish unused local + variables `charset' and `mime::article/preview-buffer'. + + * mime-pgp.el (mime-article/add-pgp-keys): Abolish unused local + variable `mode'. + +Sat Mar 15 21:10:43 1997 MORIOKA Tomohiko + + * mime-image.el (mime-preview/filter-for-image): Abolish unused + local variable `charset'. + + * mime-pgp.el (mime-article/check-pgp-signature): Abolish unused + local variable `status'. + + * mime-pgp.el: (mime-article/view-application/pgp, + mime-article/add-pgp-keys): Abolish unused local variable + `cur-buf'. + + * mime-image.el (mime-preview/filter-for-image, + mime-preview/filter-for-application/postscript): Abolish unused + local variable `mode'. + +Sat Mar 15 20:56:19 1997 MORIOKA Tomohiko + + * mime-text.el + (mime-preview/filter-for-text/richtext, + mime-preview/filter-for-text/enriched): Abolish unused local + variable `mode'. + + * mime-text.el (mime-preview/decode-text-buffer): New + implementation. + + * mime-view.el (mime-view-follow-content): Abolish unused + variables `f', `mid', `subj', `reply-to', `cc', `to', `from', `he' + and `hb'. + + * mime-edit.el (mime-edit-goto-tag): Abolish unused variable + `multipart'. + + * mime-file.el (mime-article/extract-file): Abolish unused local + variable `the-buf'. + + * mime-tar.el: Quote *autoconv*. + +Sat Mar 15 20:29:25 1997 MORIOKA Tomohiko + + * mime-partial.el (mime-article/grab-message/partials): Unused + local variable `mother' was abolished. + + * mime-play.el (mime-article/decode-caesar): Unused local variable + `cur-buf' was abolished. + + * mime-play.el (mime-article/decode-message/external-ftp): Unused + local variable `access-type' was abolished; Comment out `mode'. + + * mime-play.el (mime-article/view-message/rfc822): Unused local + variable `cur-buf' was abolished. + + * mime-text.el (mime-preview/filter-for-text/richtext, + mime-preview/filter-for-text/enriched): Unused local variable `m' + was abolished. + + * mime-parse.el (mime-parse-multipart): + Unused local variable `ct' was abolished. + + * eword-encode.el: Require eword-decode. + + * mime-image.el (mime-preview/filter-for-application/postscript): + Unused local variable `m' was abolished. + +Sat Mar 15 19:47:27 1997 MORIOKA Tomohiko + + * mime-pgp.el: (mime-article/view-application/pgp): + `mime-viewer/code-converter-alist' -> `mime-text-decoder-alist'. + + * mime-pgp.el (mime-pgp-command): New variable. + + (mime::article/call-pgp-to-check-signature): Use variable + `mime-pgp-command'. (cf. [tm-en:1259]) + +Sat Mar 15 19:25:25 1997 MORIOKA Tomohiko + + * mime-pgp.el: `mime/viewer-mode' -> `mime-view-mode'. + (cf. [tm-en:1259]) + + +1997-03-14 MORIOKA Tomohiko + + * emu: Version 7.40.1 was released. + * APEL: Version 3.2 was released. + * bitmap-mule: Version 7.17 was released. + * MU: Version 0.40.1 was released. + * MEL: Version 6.3 was released. + * SEMI: Version 0.72 was released. + +Fri Mar 14 08:48:07 1997 MORIOKA Tomohiko + + * SEMI-ELS (semi-modules-to-compile): Add mail-mime-setup.el. + +Fri Mar 14 08:47:06 1997 MORIOKA Tomohiko + + * mail-mime-setup.el: New module. + + * mime-setup.el: Only loads MUA specific setup files. + + * semi-setup.el: Setting for mime-edit, signature and mu-cite were + moved from mime-setup.el. + + * semi-setup.el: Setting for gnus-mime was moved to + gnus-mime/gnus-mime-setup.el. + + * semi-setup.el: Setting for mh-e was moved to emh/emh-setup.el. + + * Makefile: modified for SEMI package. + +Fri Mar 14 07:42:44 1997 MORIOKA Tomohiko + + * SEMI-MK: Don't compile and install other packages. + +Fri Mar 14 06:09:23 1997 MORIOKA Tomohiko + + * mime-edit.el: Definition of `mime-edit-mode' must be previous to + `add-minor-mode'. + + * mime-image.el (mime-preview/filter-for-image): Don't use + `assoc-value'. + +Fri Mar 14 04:49:04 1997 MORIOKA Tomohiko + + * mime-edit.el: Variable `mime-edit-prefix' and `mime-edit-map' + were abolished; Use `mime-edit-mode-map' directly. + + Use "C-c C-m" for enclosure commands. + + Add new binding "C-c C-x s" for `mime-edit-set-sign', "C-c C-x e" + for `mime-edit-set-encrypt'. + +Fri Mar 14 04:41:27 1997 MORIOKA Tomohiko + + * semi-setup.el: Require file-detect. + +Wed Mar 12 07:49:41 1997 MORIOKA Tomohiko + + * SEMI-CFG: Delete variables about other packages. + +Mon Mar 10 15:16:26 1997 MORIOKA Tomohiko + + * mime-def.el: Variable `mime-temp-directory' was moved to + mel/mel.el. + +1997-03-10 MORIOKA Tomohiko + + * SEMI-ELS (semi-modules-to-compile): Delete `mime-ftp'. + + * mime-view.el (mime/content-decoding-condition): Set up for + `mime-article/decode-message/external-ftp'. + + * semi-setup.el: tm-latex.el was abolished. + + * semi-setup.el: tm-ftp is merged to mime-play.el. + + * mime-play.el (mime-article/dired-function): New variable; copied + from tm-ftp.el. + + (mime-article/dired-function-for-one-frame, + mime-article/decode-message/external-ftp): New function; copied + from tm-ftp.el. + +1997-03-07 MORIOKA Tomohiko + + * mime-partial.el (mime-article/grab-message/partials): Don't use + `assoc-value'. + +1997-03-07 MORIOKA Tomohiko + + * mime-play.el: Require filename. + +1997-03-07 MORIOKA Tomohiko + + * mime-setup.el: Don't check `(boundp 'epoch::version)'. + + * mime-setup.el: Use `turn-on-mime-edit' instead of + `mime-edit-mode'. + + * mime-edit.el (mime-edit-decode-buffer): Renamed from + `mime-editor::edit-again'; optional argument `code-conversion' was + changed to `not-decode-text' (behavior was reversed). + (mime-edit-again): modified for `mime-edit-decode-buffer'. + + * mime-edit.el (mime-edit-again-ignored-field-regexp): New + variable. + + * mime-edit.el (mime-edit-again): optional argument + `code-conversion' was changed to `not-decode-text' (behavior was + reversed); optional argument `no-mode' was renamed to + `not-turn-on'; `mail-header-separator' was replaced to null line + before converting. + +1997-03-07 MORIOKA Tomohiko + + * mime-edit.el: `mime-edit-mode' -> `turn-on-mime-edit'; + `mime-edit-toggle-mode' -> `mime-edit-mode'. + + Alias `mime-mode' was abolished. + +1997-03-06 MORIOKA Tomohiko + + * eword-encode.el (eword-encode-header): fixed. + + * mime-edit.el: Comments was modified. + (mime-edit-mode): DOC-string was modified. + + * mime-edit.el: Function `mime-edit-define-menu-for-emacs19' was + abolished. Buffer local variable `mime-edit-mode-old-local-map' + was abolished. + + * mime-edit.el: `mime-edit-minor-mime-map' -> + `mime-edit-mode-map'. + + * mime-edit.el: `mime-edit-mime-map' -> `mime-edit-map'. + + * mime-edit.el: Function `mime-edit-define-keymap' was abolished. + +1997-03-06 MORIOKA Tomohiko + + * mime-edit.el: `mime-prefix' -> `mime-edit-prefix'. + +1997-03-04 MORIOKA Tomohiko + + * semi-setup.el: tm-pgp.el was already renamed to mime-pgp.el. + +1997-03-04 MORIOKA Tomohiko + + * mime-def.el (pgp-function-alist): `tm:mc-' -> `mime-mc-'. + +1997-03-04 MORIOKA Tomohiko + + * mime-def.el (mime-temp-directory): Refer environment variable + "MIME_TMP_DIR" as default value. + +1997-03-04 MORIOKA Tomohiko + + * SEMI-ELS (semi-modules-to-compile): tm-latex.el and tm-html.el + were abolished. + + * mime-tar.el (mime-decode-message/tar), mime-play.el, mime-pgp.el + (mime-article/check-pgp-signature), mime-partial.el + (mime-article/grab-message/partials), mime-image.el, mime-edit.el + (mime-edit-split-and-send), mime-def.el: Variable `mime/tmp-dir' + was renamed to `mime-temp-directory'. + + * mime-edit.el: `mime/edit-again' was renamed to + `mime-edit-again'. + +1997-03-04 MORIOKA Tomohiko + + * mime-text.el, mime-edit.el: `mime/temporary-message-mode' was + renamed to `mime-temp-message-mode'. + + * mime-edit.el: Draft preview feature was abolished. + + * mime-edit.el (mime-transfer-level-string): Fixed DOC-string. + + Buffer local variable `mime/editing-buffer' was renamed to + `mime-edit-buffer'. + + * mime-edit.el (mime-edit-insert-x-emacs-field): New variable. + (mime-edit-x-emacs-value): New variable. + (mime-edit-translate-body): Insert X-Emacs field if variable + `mime-edit-insert-x-emacs-field' is not nil. + +1997-03-03 MORIOKA Tomohiko + + * mime-view.el (mime-preview/insert-content-button): Don't use + function `assoc-value'. + +1997-03-03 MORIOKA Tomohiko + + * mime-bbdb.el: `mime-bbdb-' -> `mime-bbdb/'. + +1997-03-03 MORIOKA Tomohiko + + * SEMI-MK: compile and install emu and apel. + +1997-03-03 MORIOKA Tomohiko + + * SEMI-ELS: tm-bbdb.el was renamed to mime-bbdb.el. + + * mime-bbdb.el: Renamed from tm-bbdb.el. + + * SEMI-CFG (EMU_PREFIX, EMU_DIR): New variable. + (APEL_PREFIX, APEL_DIR, APEL_RELATIVE_DIR): New variable. + (load-path): Add "../apel" instead of "../tl". + + * SEMI-ELS: alist.el was moved to ../apel/. + +1997-03-03 MORIOKA Tomohiko + + * mime-parse.el: Require emu; Function `char-list-to-string' was + abolished. + + * mime-edit.el: Require emu; definitions about visible/invisible + were abolished. + +1997-03-03 MORIOKA Tomohiko + + * eword-encode.el: Require emu; function + `find-non-ascii-charset-string' and + `find-non-ascii-charset-region' were abolished. + + * mime-def.el: Require atype; functions about atype were + abolished. + +1997-03-03 MORIOKA Tomohiko + + * mime-def.el: Require emu; Variable `running-xemacs' was + abolished; Macro `defun-maybe' was abolished; Function `functionp' + was abolished; Variable `charsets-mime-charset-alist', + `default-mime-charset' and `mime-charset-coding-system-alist' were + abolished; Function `mime-charset-to-coding-system', + `charsets-to-mime-charset', `detect-mime-charset-region', + `encode-mime-charset-region', `decode-mime-charset-region', + `encode-mime-charset-string' and `decode-mime-charset-string' were + abolished. + +Sat Mar 1 04:12:37 1997 Tomohiko Morioka + + * mime-def.el (charsets-to-mime-charset): New function; copied + from emu.el. + + * eword-encode.el: Use `char-bytes' instead of `char-length'. + + * mime-def.el (eliminate-top-spaces): New inline-function; copied + from tl-str.el. + + * mime-edit.el: Fixed about definition of visible/invisible + functions for XEmacs. + +Sat Mar 1 03:39:01 1997 Tomohiko Morioka + + * mime-edit.el (enable-invisible, end-of-invisible): New macro; + copied from emu-19.el. + (invisible-region, invisible-p, next-visible-point): New function; + copied from emu-19.el and emu-xemacs.el. + (visible-region): New function; copied from emu-19.el. + + * mime-edit.el (mime-edit-make-boundary): New function. + (mime-edit-translate-body, mime-edit-translate-region): Use + `mime-edit-make-boundary'. + + * mime-edit.el (replace-space-with-underline): New inline + function; copied from tl-str.el. + +Sat Mar 1 02:07:00 1997 Tomohiko Morioka + + * eword-encode.el (find-non-ascii-charset-region): New + inline-function; copied from emu-e20.el. + +Fri Feb 28 06:46:48 1997 Tomohiko Morioka + + * mime-def.el: Require cl. + + * mime-view.el (mouse-button-2): New variable; copied from + emu-19.el and emu-xemacs.el. + + * mime-def.el (defun-maybe): New macro; copied from emu.el. + (functionp): New function; copied from emu.el. + +Fri Feb 28 05:14:54 1997 Tomohiko Morioka + + * mime-play.el: Supports only Emacs/mule API. + + * mime-def.el (field-unify): Fixed. + + * semi-setup.el: Don't require mime-play. + + * mime-def.el: Function `put-fields' were abolished. + + * mime-def.el: atype functions were moved from mime-play.el. + + * mime-play.el: atype functions were moved to mime-def.el. + +Fri Feb 28 04:50:13 1997 Tomohiko Morioka + + * mime-def.el (call-after-loaded): New function; moved from + semi-setup.el. + + * semi-setup.el: Function `call-after-loaded' was moved to + mime-def.el; require mime-def. + +Fri Feb 28 04:44:27 1997 Tomohiko Morioka + + * semi-setup.el: require mime-play instead of mime-view when + compiling. + +Fri Feb 28 04:21:43 1997 Tomohiko Morioka + + * SEMI-MK: BINS were abolished. + + * SEMI-CFG: require cl. + + * SEMI-CFG: Variable `BIN_SRC_DIR' and `BINS' were abolished. + +Fri Feb 28 04:08:12 1997 Tomohiko Morioka + + * SEMI-MK: Renamed from TM-MK. + + * SEMI-CFG: Don't require tl-misc. + + * SEMI-ELS (semi-modules-to-compile): Add alist.el. + +Fri Feb 28 02:33:20 1997 Tomohiko Morioka + + * mime-play.el (field-unify): Fixed. + +Fri Feb 28 02:22:38 1997 Tomohiko Morioka + + * mime-setup.el, mime-image.el, mime-edit.el, mime-play.el: + Require alist. + + * alist.el: New module; separated from tl-list.el. + + * mime-play.el: Function `put-alist' and `del-alist' were moved to + alist.el. + + * mime-play.el (mime-article/coding-system-alist): Use + `no-conversion' instead of *noconv*. + +Thu Feb 27 13:48:48 1997 Tomohiko Morioka + + * mime-parse.el (char-list-to-string): New inline-function; copied + from emu-19.el. + +Thu Feb 27 13:43:38 1997 Tomohiko Morioka + + * mime-parse.el (symbol-concat): New inline-function; copied from + tl-str.el. + + * semi-setup.el: require 'mime-view when compiling. + + * mime-parse.el (regexp-*): New inline-function; copied from + tl-str.el. + +Thu Feb 27 13:28:10 1997 Tomohiko Morioka + + * semi-setup.el (running-xemacs): New variable. + +Thu Feb 27 09:00:33 1997 Tomohiko Morioka + + * mime-play.el: `mime/viewer-mode' -> `mime-view-mode'. + + * mime-def.el: fixed DOC string. + +Thu Feb 27 08:56:45 1997 Tomohiko Morioka + + * eword-decode.el: Don't require emu. + + * mime-def.el (charsets-mime-charset-alist, default-mime-charset, + mime-charset-coding-system-alist): New variable; copied from + emu-e20.el. + (mime-charset-to-coding-system, detect-mime-charset-region, + encode-mime-charset-region, decode-mime-charset-region, + encode-mime-charset-string, decode-mime-charset-string): New + function; copied from emu-e20.el. + + * eword-encode.el (find-non-ascii-charset-string): New + inline-function; copied from emu-e20.el. + +Thu Feb 27 08:36:01 1997 Tomohiko Morioka + + * mime-tar.el: Don't require emu. + +Thu Feb 27 08:34:21 1997 Tomohiko Morioka + + * mime-play.el (put-alist, del-alist): New function; copied from + tl-list.el. + (put-fields, field-unifier-for-default, field-unifier-for-mode, + field-unify, assoc-unify, get-unified-alist, delete-atype, + remove-atype, replace-atype, set-atype): New function; copied from + tl-atype.el. Don't require tl-atype. + +Thu Feb 27 08:18:16 1997 Tomohiko Morioka + + * semi-setup.el (call-after-loaded): New function; imported from + tl-misc.el; Don't require tl-misc. + +Thu Feb 27 08:10:24 1997 Tomohiko Morioka + + * mime-pgp.el: Renamed from tm-pgp.el. + +Thu Feb 27 08:05:45 1997 Tomohiko Morioka + + * mime-def.el (pgp-function-alist): tm-edit-mc.el was renamed to + mime-mc.el. + + * mime-mc.el: Renamed from tm-edit-mc.el. + +Thu Feb 27 06:38:44 1997 Tomohiko Morioka + + * mime-text.el: `tm:mother-button-dispatcher' -> + `mime-button-mother-dispatcher'. + + * mime-def.el, mime-text.el (mime-preview/filter-for-text/plain), + mime-view.el, mime-tar.el (mime-tar-set-properties): + `tm:add-button' -> `mime-add-button'. + + * mime-file.el: Renamed from tm-file.el. + +Wed Feb 26 13:01:25 1997 Tomohiko Morioka + + * eword-decode.el: Must require emu. + + * eword-decode.el (eword-decode-region): Unused local variable + `charset', `encoding' and `text'. + +Wed Feb 26 07:58:29 1997 Tomohiko Morioka + + * eword-decode.el (eword-decode-encoded-word): Use + `add-text-properties' directly. + +Wed Feb 26 07:44:22 1997 Tomohiko Morioka + + * mime-def.el (tm:add-button): Use `add-text-properties' directly. + + * mime-def.el (running-xemacs): New variable; if it is not nil, + require overlay. + + * mime-def.el (regexp-or): New function. + +Wed Feb 26 04:57:33 1997 Tomohiko Morioka + + * mime-tar.el: Renamed from tm-tar.el. + + * mime-view.el (mime-view-define-keymap): `tm:button-dispatcher' + -> `mime-button-dispatcher'. + + * mime-def.el: `tm:button-dispatcher' -> `mime-button-dispatcher'. + + * mime-def.el: `tm:mother-button-dispatcher' -> + `mime-button-mother-dispatcher'. + + * mime-def.el: `semi-data' -> `mime-button-data'. + + * mime-def.el: `semi-callback' -> `mime-button-callback'. + + * mime-def.el: `tm:mouse-face' -> `mime-button-mouse-face'. + + * mime-def.el: `tm:button-face' -> `mime-button-face'. + + * mime-def.el (tm:add-button, tm:button-dispatcher): + `mime-callback' was renamed to `semi-callback'; `mime-data' was + renamed to `semi-data'. + +Wed Feb 26 03:54:17 1997 Tomohiko Morioka + + * mime-def.el (tm:add-button): Use `make-overlay' directly. + + * mime-def.el (tm:add-button): Use `overlay-put' directly. + +Tue Feb 25 07:40:37 1997 Tomohiko Morioka + + * mime-text.el: `tm:browse-url' was renamed to + `mime-text-browse-url'. + + * mime-text.el: Require browse-url. + + * mime-text.el: `tm:URL-regexp' was renamed to + `mime-text-url-regexp'. + + * mime-text.el: Variable `tm:URL-regexp', + `browse-url-browser-function' and function `tm:browse-url' were + moved from mime-def.el. + + * mime-def.el: Variable `tm:URL-regexp', + `browse-url-browser-function' and function `tm:browse-url' were + moved to mime-text.el. + + * eword-decode.el: Variable `tm:warning-face' was renamed to + `eword-warning-face'. + + * eword-decode.el: Variable `tm:warning-face' was moved from + mime-def.el. + + * mime-def.el: Variable `tm:warning-face' was moved to + eword-decode.el. + + * mime-def.el: Function `tm:set-face-region' was abolished. + + * mime-edit.el: `mime-edit-make-charset-default-encoding-alist' -> + `mime-make-charset-default-encoding-alist'. + + * mime-edit.el: `mime-edit-transfer-level' -> + `mime-transfer-level'. + + * mime-edit.el: Function `mime/encoding-name' was renamed to + `mime-encoding-name'. + + * mime-def.el: Function `mime/make-charset-default-encoding-alist' + was abolished. + + * mime-edit.el: Function `mime/encoding-name' was moved from + mime-def.el. + + * mime-def.el: Function `mime/encoding-name' was moved to + mime-edit.el. + +Tue Feb 25 06:15:53 1997 Tomohiko Morioka + + * mime-edit.el: Variable `mime-charset-type-list' was moved from + mime-def.el. + + * mime-def.el: Variable `mime-charset-type-list' was moved to + mime-edit.el. + +Mon Feb 24 10:07:33 1997 Tomohiko Morioka + + * eword-encode.el (eword-encode-header): fixed typo. + +Mon Feb 24 10:04:23 1997 Tomohiko Morioka + + * mime-edit.el (mime-edit-insert-message, mime-edit-insert-mail, + mime-editor::edit-again): Don't use `assoc-value'; Don't require + tl-list. + +Mon Feb 24 10:00:50 1997 Tomohiko Morioka + + * mime-play.el: require tl-atype. + + * mime-view.el: Don't require tl-atype. + +Mon Feb 24 09:58:14 1997 Tomohiko Morioka + + * mime-view.el: Don't require tl-misc. + +Mon Feb 24 09:57:03 1997 Tomohiko Morioka + + * eword-encode.el (eword-encode-header): Use function `assoc-if' + instead of `ASSOC'; require cl instead of tl-list. + + * mime-parse.el (define-structure): New macro; Don't require + tl-misc.el. + + * mime-view.el (mime-preview/insert-content-button): Don't use + function `assoc-value'. + + * mime-view.el: Require cl instead of tl-list. + + * mime-view.el: Don't require tl-str.el. + +Mon Feb 24 09:12:12 1997 Tomohiko Morioka + + * mime-parse.el (define-structure): New macro; Don't require + tl-misc.el. + + * mime-view.el (mime-preview/insert-content-button): Don't use + function `assoc-value'. + + * mime-view.el: Require cl instead of tl-list. + + * mime-view.el: Don't require tl-str.el. + +Mon Feb 24 09:04:48 1997 Tomohiko Morioka + + * eword-decode.el: Constant + `eword-Q-encoding-and-encoded-text-regexp' was abolished. + + * eword-decode.el (quoted-printable-hex-chars, + quoted-printable-octet-regexp, eword-Q-encoded-text-regexp, + eword-Q-encoding-and-encoded-text-regexp): New constant; moved + from mime-def.el. + + * mime-def.el (quoted-printable-hex-chars, + quoted-printable-octet-regexp, eword-Q-encoded-text-regexp, + eword-Q-encoding-and-encoded-text-regexp): Moved to + eword-decode.el. + + * eword-decode.el (base64-token-regexp, + base64-token-padding-regexp, eword-B-encoded-text-regexp): New + constant; moved from mime-def.el. + + * mime-def.el: Constant `base64-token-regexp', + `base64-token-padding-regexp' and `eword-B-encoded-text-regexp' + were moved to eword-decode.el. + + * mime-def.el: Constant `eword-B-encoding-and-encoded-text-regexp' + was abolished. + +Mon Feb 24 08:52:01 1997 Tomohiko Morioka + + * eword-decode.el: Don't require emu. + + * eword-decode.el: Don't require tl-str.el. + + * mime-def.el (get-version-string): New inline-function; imported + from tl-str.el. + +Mon Feb 24 02:42:24 1997 Tomohiko Morioka + + * mime-setup.el: Function `mime/encode-message-header' was renamed + to `eword-encode-header'. + + * mime-edit.el, eword-encode.el: Function + `eword-encode-message-header' was renamed to + `eword-encode-header'. + +Mon Feb 24 02:26:02 1997 Tomohiko Morioka + + * eword-decode.el (eword-decode-header): New optional argument + `SEPARATOR'; Use function `std11-narrow-to-header'. + + * mime-view.el, mime-setup.el, eword-decode.el: Function + `eword-decode-message-header' was renamed to + `eword-decode-header'. + +Mon Feb 24 02:17:11 1997 Tomohiko Morioka + + * mime-edit.el: tm-ew-e.el was renamed to eword-encode.el; + Function `mime/encode-message-header' was renamed to + `eword-encode-message-header'. + +Mon Feb 24 01:59:28 1997 Tomohiko Morioka + + * mime-view.el: Function `mime-eword/decode-string' was renamed to + `eword-decode-string'. + + * mime-def.el: `mime/Q-' -> `eword-Q-'. + + * mime-def.el: `mime/B-' -> `eword-B-'. + +Mon Feb 24 01:46:59 1997 Tomohiko Morioka + + * eword-decode.el: Constant `eword-charset-regexp' was renamed to + `mime-charset-regexp'. + + * mime-def.el: Constant `mime/charset-regexp' was renamed to + `mime-charset-regexp'. + +Mon Feb 24 01:38:18 1997 Tomohiko Morioka + + * mime-view.el: Function `mime/decode-message-header' was renamed to + `eword-decode-message-header'. + + * mime-view.el: tm-ew-d.el was renamed to eword-decode.el. + +Mon Feb 24 01:32:33 1997 Tomohiko Morioka + + * mime-setup.el: tm-ew-d.el was renamed to eword-decode.el; + Function `mime/decode-message-header' was renamed to + `eword-decode-message-header'. + +Sat Feb 22 17:30:15 1997 MORIOKA Tomohiko + + * SEMI-CFG: Renamed from TM-CFG. + + * SEMI-ELS: Renamed from TM-ELS. + + * eword-encode.el: `eword-exist-encoded-word-in-subject' -> + `eword-in-subject-p'. + + * eword-encode.el: `mime/' -> `eword-'. + + * eword-encode.el (eword-generate-X-Nsubject): Don't refer + variable `mime/use-X-Nsubject'. + + * eword-encode.el (eword-generate-X-Nsubject): Renamed from + `mime/generate-X-Nsubject'. + + * eword-encode.el (eword-field-encoding-method-alist): Don't refer + variable `mime/no-encoding-header-fields'. + + * eword-encode.el (eword-field-encoding-method-alist): Renamed + from `mime/field-encoding-method-alist'. + + * eword-encode.el: Renamed from tm-ew-e.el. + + * eword-decode.el: Renamed from tm-ew-d.el. + + * mime-view.el: Don't require tm-def. + + * mime-parse.el: tm-def.el was renamed to mime-def.el. + + * mime-def.el: Renamed from tm-def.el. + +1997-02-22 MORIOKA Tomohiko + + * SEMI-ELS: Renamed from TM-ELS. + +1997-02-22 MORIOKA Tomohiko + + * eword-encode.el: `eword-exist-encoded-word-in-subject' -> + `eword-in-subject-p'. + + * eword-encode.el: `mime/' -> `eword-'. + + * eword-encode.el (eword-generate-X-Nsubject): Don't refer + variable `mime/use-X-Nsubject'. + + * eword-encode.el (eword-generate-X-Nsubject): Renamed from + `mime/generate-X-Nsubject'. + + * eword-encode.el (eword-field-encoding-method-alist): Don't refer + variable `mime/no-encoding-header-fields'. + + * eword-encode.el (eword-field-encoding-method-alist): Renamed + from `mime/field-encoding-method-alist'. + + * eword-encode.el: Renamed from tm-ew-e.el. + + * eword-decode.el: Renamed from tm-ew-d.el. + + * mime-view.el: Don't require tm-def. + + * mime-parse.el: tm-def.el was renamed to mime-def.el. + +1997-02-22 MORIOKA Tomohiko + + * mime-def.el: Renamed from tm-def.el. + +Fri Feb 21 08:04:42 1997 Tomohiko Morioka + + * mime-view.el: Don't `suppress-keymap'. + +Fri Feb 21 07:42:32 1997 Tomohiko Morioka + + * mime-view.el: tm-parse.el was renamed to mime-parse.el. + + * mime-parse.el: Renamed from tm-parse.el. + + * mime-view.el: Key-binding for function + `mime-view-display-x-face' was abolished. + +Fri Feb 21 07:04:51 1997 Tomohiko Morioka + + * mime-setup.el: modified for mime-edit.el. + +Fri Feb 21 07:02:52 1997 Tomohiko Morioka + + * mime-edit.el: `mime-editor/' -> `mime-edit-'. + +Fri Feb 21 06:57:11 1997 Tomohiko Morioka + + * mime-edit.el: based on tm-edit 7.105. + + * semi-setup.el: tm-image.el was renamed to mime-image.el. + + * mime-image.el: Renamed from tm-image.el. + +Fri Feb 21 05:57:53 1997 Tomohiko Morioka + + * semi-setup.el: Renamed from tm-setup.el. + + * mime-setup.el: Setting for GNUS was abolished. + + * mime-setup.el: Variable `mime-setup-use-sc' was abolished. + + * mime-view.el: tm-play.el was renamed to mime-play.el. + + * mime-partial.el: Renamed from tm-partial.el. + + * mime-play.el: Renamed from tm-play.el. + + * mime-view.el: `tm-text' is renamed to `mime-text'. + + * mime-view.el (mime-view-mode): Optional argument `mother-keymap' + was renamed to `default-keymap-or-function'; optional argument + `default-function' was abolished. + + * mime-text.el: `mime-view-code-converter-alist' -> + `mime-text-decoder-alist'. + + * mime-text.el: Renamed from tm-text.el. + +Thu Feb 20 09:02:36 1997 Tomohiko Morioka + + * mime-view.el: `mime/viewer-mode' -> `mime-view-mode'. + + * mime-view.el: Renamed from tm-view.el. + +Thu Jul 11 14:57:42 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-file-types): add for patch. + + * mime-edit.el: rearrangement. + +Wed Jul 10 12:05:05 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/normalize-body): Use function + `encode-mime-charset-region' instead of + `mime-charset-encode-region'. + +Wed Jul 10 11:51:13 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/normalize-body): fixed. + + * mime-edit.el (mime-editor/define-charset): + Argument `charset' was changed to + symbol. + (mime-editor/choose-charset): Changed to return symbol. + (mime-editor/normalize-body): charset was changed to symbol. + +Wed Jul 10 11:22:55 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/make-charset-default-encoding-alist): + New function. + (mime-editor/charset-default-encoding-alist): Use function + `mime-editor/make-charset-default-encoding-alist'. + (mime-editor/toggle-transfer-level): Use function + `mime-editor/make-charset-default-encoding-alist'. + + * mime-edit.el (mime-editor/choose-charset): Use function + `detect-mime-charset-region' instead of + `mime/find-charset-region'. + +Tue Jul 9 13:24:21 1996 MORIOKA Tomohiko + + * mime-edit.el (mime/editor-mode): Don't toggle. + + (mime-editor/toggle-mode): New function. + +Tue Jul 2 14:06:53 1996 Alastair Burt + + * mime-edit.el: I think the following is the best way to handle + tm-edit as a minor mode in XEmacs (at least in 19.14 -- I am not + sure if "add-minor-mode" works the same way in earlier versions). + By clicking on the mode line you can turn mime/editor-mode on or + off. + +Thu Jun 27 14:08:17 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/encrypt-pgp-kazu): Use macro + `as-binary-process'. + + * mime-edit.el (mime-editor/sign-pgp-kazu): Use macro + `as-binary-process'. + +Wed Jun 12 05:58:23 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/split-message-sender-alist): setting + for `mail-mode' was moved to tm-rmail.el. + +Sun Jun 9 06:44:19 1996 MORIOKA Tomohiko + + * mime-edit.el: Variable + `mime-editor/message-default-sender-alist' was abolished. + +Sun Jun 9 06:40:26 1996 MORIOKA Tomohiko + + * mime-edit.el: Variable `mime-editor/window-config-alist' was + abolished. + +Sun Jun 9 06:35:10 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/split-and-send): New implementation. + +Mon Jun 3 17:39:10 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor::edit-again): fixed about multipart. + +Wed May 29 09:57:53 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/define-charset, + mime-editor/set-parameter): Function `mime-set-parameter' was + renamed to `mime-editor/set-parameter'. + + * mime-edit.el (mime-set-parameter): New implementation + + (mime-editor/translate-single-part-tag): New function. + (mime-editor/translate-region): Use function + `mime-editor/translate-single-part-tag'. + +Tue May 28 15:15:33 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor::edit-again): fixed. + + * mime-edit.el (mime/edit-again): fixed. + + * mime-edit.el (mime-editor::edit-again): modified for new tag + rule. + + * mime-edit.el (mime-editor/insert-signature): Use variable + `signature-file-name' instead of `signature'. + + * mime-edit.el (mime-editor/multipart-beginning-regexp): Don't + require begging new-line. + + (defconst mime-editor/multipart-end-regexp): Don't require begging + new-line. + + (mime-editor/find-inmost): modified for new enclosure tag rule. + + (mime-editor/translate-region): modified for new enclosure tag rule. + + (mime-editor/enclose-region): modified for new enclosure tag rule. + +Sun May 26 05:04:20 1996 MORIOKA Tomohiko + + * mime-edit.el: Add `(provide 'tm-edit)'. + + Do `(run-hooks 'tm-edit-load-hook)' if variable + `mime-edit-load-hook' is not bound. + +Sun May 26 02:10:08 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/insert-binary-buffer): fixed. + (mime-editor/normalize-body): fixed. + +Sat May 25 20:47:32 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/normalize-body): fixed. + + (mime-editor/content-end): Used function `invisible-p' and + `next-visible-point'. + +Sat May 25 20:05:20 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/insert-binary-buffer): Use function + `invisible-region' instead of `mime-flag-region'. + (mime-editor/normalize-body): Use function `visible-region' + instead of `mime-flag-region'. + (mime-editor/content-end): New implementation. + +Sat May 25 16:04:28 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/enquote-region): New command; bound to + `C-c C-x q'. + + (mime-editor/menu-list): New item for function + `mime-editor/enquote-region'. + +Sat May 25 15:52:44 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/process-multipart-1): Use function + `string-equal' instead of `string='. + +Sat May 25 15:48:33 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/process-multipart-1): fixed about + condition of next tag inserting. + +Sat May 25 15:36:58 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/enclose-region): fixed for new format. + +Sat May 25 15:15:03 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/insert-partial-header): Comment of + Mime-Version field was modified. + + * mime-edit.el (mime-editor/insert-tag): Don't insert unnecessary + line break. + + * mime-edit.el (mime-editor/version-name): New constant. + + (mime-editor/mime-version-value): Use constant + `mime-editor/version-name'. + + (mime-editor/insert-partial-header): Use constant + `mime-editor/version-name'. + +Fri May 24 15:16:37 1996 MORIOKA Tomohiko + + * mime-edit.el (mime-editor/goto-tag): fixed for a tag without + line break. + (mime-editor/normalize-body): fixed for a tag without line break. + + * mime-edit.el (mime-editor/translate-region): fixed for a part + starting without line break. + + * mime-edit.el (mime-editor/single-part-tag-regexp): It allows any + column. + (mime-editor/quoted-single-part-tag-regexp): New constant. + (mime-editor/enquote-region): New function. + (mime-editor/dequote-region): New function. + (mime-editor/process-multipart-1): Processing for ``quote'' + enclosure was added. + (mime-editor/translate-body): Use function + `mime-editor/dequote-region'. + + (mime-editor/mime-version-value): Comment was renamed. + + * mime-edit.el: Renamed from tm-edit.el diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a5c9677 --- /dev/null +++ b/Makefile @@ -0,0 +1,69 @@ +# +# Makefile for SEMI kernel. +# + +PACKAGE = semi +API = 1.13 +RELEASE = 2 + +TAR = tar +RM = /bin/rm -f +CP = /bin/cp -p + +EMACS = emacs +XEMACS = xemacs +FLAGS = -batch -q -no-site-file -l SEMI-MK + +PREFIX = NONE +EXEC_PREFIX = NONE +LISPDIR = NONE +PACKAGEDIR = NONE +VERSION_SPECIFIC_LISPDIR = NONE + +GOMI = *.elc + +VERSION = $(API).$(RELEASE) +ARC_DIR = /pub/GNU/elisp/semi/semi-$(API)-for-flim-1.12 + + +elc: + $(EMACS) $(FLAGS) -f compile-semi \ + $(PREFIX) $(EXEC_PREFIX) $(LISPDIR) \ + $(VERSION_SPECIFIC_LISPDIR) + +install-elc: elc + $(EMACS) $(FLAGS) -f install-semi \ + $(PREFIX) $(EXEC_PREFIX) $(LISPDIR) \ + $(VERSION_SPECIFIC_LISPDIR) + +install: install-elc + + +package: + $(XEMACS) $(FLAGS) -f compile-semi-package $(PACKAGEDIR) + +install-package: package + $(XEMACS) $(FLAGS) -f install-semi-package $(PACKAGEDIR) + + +clean: + -$(RM) $(GOMI) + + +tar: + cvs commit + sh -c 'cvs tag -RF $(PACKAGE)-`echo $(VERSION) | tr . _`; \ + cd /tmp; \ + cvs -d :pserver:anonymous@chamonix.jaist.ac.jp:/hare/cvs/root \ + export -d $(PACKAGE)-$(VERSION) \ + -r $(PACKAGE)-`echo $(VERSION) | tr . _` \ + semi' + $(RM) /tmp/$(PACKAGE)-$(VERSION)/ftp.in + cd /tmp; $(TAR) cvzf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION) + cd /tmp; $(RM) -r $(PACKAGE)-$(VERSION) + sed "s/VERSION/$(VERSION)/" < ftp.in | sed "s/API/$(API)/" \ + | sed "s/PACKAGE/$(PACKAGE)/" > ftp + +release: + -$(RM) $(ARC_DIR)/$(PACKAGE)-$(VERSION).tar.gz + mv /tmp/$(PACKAGE)-$(VERSION).tar.gz $(ARC_DIR) diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..ad678eb --- /dev/null +++ b/NEWS @@ -0,0 +1,526 @@ +SEMI NEWS --- history of major-changes. +Copyright (C) 1998,1999 Free Software Foundation, Inc. + +* Changes in SEMI 1.13 + +** Function `mime-play-entity' + +Function `mime-play-entity' was renamed from `mime-raw-play-entity' +and changed interface. + +Current interface is: + + mime-play-entity (entity &optional situation ignored-method) + +Please use `situation' if you would like to specify `mode' and +`ignore-examples'. + + +** Now acting-method must not expect to run in raw-buffer + +Function `mime-play-entity' was changed to permit to run in any buffer +(may be called in preview-buffer). So each acting-method is called in +any buffer. + + + +* Changes in SEMI 1.12 + +There are no user-visible changes. + +** New function `eliminate-top-spaces' + +Now mime-edit has it. + + +* Changes in SEMI 1.11 + +** New function `mime-edit-decode-message-in-buffer' + +Add new function `mime-edit-decode-message-in-buffer'. Function +`mime-edit-decode-buffer' was abolished. + + +** Requires FLIM 1.12 API + + +* Changes in SEMI 1.10 + +** Abolish variable `mime-temp-directory' + + FLIM 1.11 and SEMI 1.10 use variable `temporary-file-directory' +instead of `mime-temp-directory'. So environment variable +"MIME_TMP_DIR" and "TM_TMP_DIR" are not effective to specify temporary +directory of FLIM and SEMI. + + +** Abolish function `mime-text-insert-decoded-body' + + SEMI 1.10 uses function `mime-insert-text-content' of FLIM 1.11 API +instead of `mime-text-insert-decoded-body'. + + Now `mime-view-caesar' does not run `mime-text-decode-hook'. + + +* Changes in SEMI 1.9 + +** User option `mime-encoding-list' + + SEMI 1.9 requires FLIM 1.10 API. In FLIM 1.10 API, variable +`mime-file-encoding-method-alist' was abolished. If you want to use +non-standard Content-Transfer-Encoding to insert a file into sending +message, please edit new user option `mime-encoding-list' instead of +`mime-file-encoding-method-alist'. + + +** Constant `mime-user-interface-product' + + Constant `mime-user-interface-version' was renamed to +`mime-user-interface-product'. Notice that data format is changed +too. + + FLIM 1.10 API provides following macros to access a slot of the new +data format: + + mime-product-name (product) + + mime-product-version (product) + + mime-product-code-name (product) + +Please use them to get elements of the constant +`mime-user-interface-product'. + + +* Changes in SEMI 1.8 + +** Don't use "file" command to detect content of entity + + Acting-method to detect content of entity was modified not to use +"file" command. + + Variable `mime-file-content-type-alist' was abolished. Instead of +it, new variable `mime-magic-type-alist' is available to customize. +It is an alist of regexp about magic-number vs. corresponding +media-types. Each element looks like (REGEXP TYPE SUBTYPE). REGEXP +is a regular expression to match against the beginning of the content +of entity. TYPE is symbol to indicate primary type of media-type. +SUBTYPE is symbol to indicate subtype of media-type. + + +** Abolish external X-Face viewer + + +** Abolish obsolete utility for *-field-list and *-field-regexp + + Abolish function `tm:set-fields', `tm:add-fields' and +`tm:delete-fields'. + + +** Change MUA interface of automatic message/partial combining + + Abolish variable `mime-view-partial-message-method-alist'. + + Instead of it, `request-partial-message-method' in acting-situation +is available to specify MUA depended implementation. + + Each element of `mime-view-partial-message-method-alist' were +required to display message at current summary line, and its return +value were ignored. On the other hand, +`request-partial-message-method' is required to return structure of +message at current summary line. Format of it is mime-entity. + + +** User-Agent field + + MIME-Edit inserts User-Agent field instaed of X-Emacs field if +`mime-edit-insert-user-agent-field' is not nil. Contents of +User-Agent is specified by mime-edit-user-agent-value'. + + X-Emacs field related features were abolished. + + +* Changes in SEMI 1.7 + +** Header-presentation-method + + Now MIME-View uses header-presentation-method instead of +header-filter. + + - abolish variable `mime-view-content-header-filter-alist' + + - abolish function `mime-view-cut-header' + + - Rename `mime-view-content-header-filter-hook' to + `mime-display-header-hook' + + +** Abolish `mime-view-ignored-field-regexp' + + Now mime-view uses `mime-view-ignored-field-list' directly in +default header-presentation-method. + + +** Abolish body filter support + + Please use body-presentation-method. + + +** Methods for MUAs + + - Rename `mime-view-following-method-alist' to + `mime-preview-following-method-alist' + + - Rename `mime-method-to-combine-message/partial-pieces' to + `mime-combine-message/partial-pieces-automatically' + + +* Changes in SEMI 1.6 + +** Abolish tm-compatible external method support + + Abolish tm-compatible external method support. Please use mailcap +method instead of it. + + +** Abolish `mime-edit-signing-type' and `mime-edit-encrypting-type' + + C-c C-m C-s encloses as "pgp-signed" which means PGP/MIME signature. + + C-c C-m C-e encloses as "pgp-encrypted" which means PGP/MIME +encryption. + + +** New method to detect content of entity + + Now MIME-View can detect content of entity for +application/octet-stream in default setting. + + It uses "file" command to detect. User can customize +`mime-file-content-type-alist' to specify media-type for output of +"file" command. It is an alist of "file" output patterns +vs. corresponding media-types. Each element looks like (REGEXP TYPE +SUBTYPE). REGEXP is pattern for "file" command output. TYPE is +symbol to indicate primary type of media-type. SUBTYPE is symbol to +indicate subtype of media-type. + + +** New interface to display message + +- Function `mime-view-buffer' +- Function `mime-view-display-message' + + +** Change interface of internal playback method + + Interface of internal playback method was changed to + + (entity situation) + +It is as same as interface of body-presentation-method. + + +** Change interface of `mime-view-entity-button-visible-p' + +** Change interface of `mime-view-insert-entity-button' + + +** `mime-preview-original-major-mode' + + Abolish variable `mime-preview-original-major-mode'. + + Please use function `mime-preview-original-major-mode' instead of +it. + + +** mime-preview-over-to-{previous|next}-method-alist + + `mime-preview-over-to-{previous|next}-method-alist' were renamed +from `mime-view-over-to-{previous|next}-method-alist'. + + +* Changes in SEMI 1.5 + +** mime-w3 + + Add inline text/html preview feature using w3. If +`mime-setup-enable-inline-html' is not nil, semi-setup.el sets up it. + + +** `pgp-elkins' -> `pgp-mime' + + Rename `pgp-elkins' -> `pgp-mime'. Variable +`mime-edit-signing-type' and `mime-edit-encrypting-type' does not +allow `pgp-elkins'. + + +** type-subtype-score + + Now MIME-View chooses one entity to display body in +multipart/alternative. In this mechanism, +`mime-view-type-subtype-score-alist' is used to specify priority of +each entity. + + Variable `mime-view-type-subtype-score-alist' is alist of +TYPE-SUBTYPE vs. SCORE. TYPE-SUBTYPE is cons pair (TYPE . SUBTYPE), +symbol TYPE or t. TYPE and SUBTYPE are symbol. `t' means default. +SCORE is integer. Larger number is larger priority. + + +** text presentation + + Change text presentation mechanism. In anything older than SEMI +1.4, text presentation mechanism is based on filter model. However it +has design problem about conversion between byte representation and +text presentation. So SEMI was changed to use +body-presentation-method to display text entity. In this purpose, old +text decoding features were abolished and introduces news features +(cf. next section). + + +** mime-raw-representation-type and mime-raw-representation-type-alist + + Abolish `mime-text-decoder' and `mime-text-decoder-alist' because of +text presentation mechanism change (cf. previous section). Instead of +it, SEMI introduces variable about representation-type of +mime-raw-buffer. If it is `binary', mime-raw-buffer is as same as +network representation. If it is `cooked', mime-raw-buffer is +code-converted. + + `mime-raw-representation-type-alist' is an alist of major-mode +vs. representation-type. Each element looks like + + (SYMBOL . REPRESENTATION-TYPE). + +SYMBOL is major-mode or t. t means default. + + `mime-raw-representation-type' is a buffer local variable of +mime-raw-buffer. If it is non-nil, it overrides +`mime-raw-representation-type-alist'. + + In addition, `mime-raw-buffer-coding-system-alist' was abolished. +Because representation-type has enough information. + + +* Changes in SEMI 1.4 + +** mailcap + + mailcap was supported to set up 'mime-acting-condition. + + tm-external-method scripts written by born shell were abolished. + + +** mime-add-condition + + New function to set up 'mime-preview-condition and/or +'mime-acting-condition. + + +** signature setting in semi-setup.el + + Abolish MUA depended signature setting. + + Setting for mail-mode were moved to mail-mime-setup.el. + + +* Changes in SEMI 1.3 + +** mime-acting-condition + + Format of variable 'mime-acting-condition was changed from `atype' +to `condition tree'. Its format is as same as +'mime-preview-condition. + + If there are two or more conditions are found when matching, menu +pops up to select method to run. Selected situation will be added to +example database. (cf. mime-acting-situation-examples-file) + +** New variables + +*** mime-view-find-every-acting-situation + + Find every available acting-situation if non-nil. + +*** mime-acting-situation-examples-file + + File name of example about acting-situation demonstrated by + user. + + +* Changes in SEMI 1.2 + +** User setting + +*** hooks + + 'mime-view-plain-text-preview-hook was renamed to +'mime-preview-text/plain-hook. + +*** Variable + + Variable 'mime-view-childrens-header-showing-Content-Type-list was +abolished. Please use 'mime-preview-condition instead. + +*** API about visible-predicates were abolished + + Following functions were abolished: + + mime-view-header-visible-p (entity message-info) + + mime-view-body-visible-p (entity message-info) + + mime-view-entity-separator-visible-p (entity message-info) + +Please use 'mime-preview-condition instead. + + Function 'mime-view-entity-button-visible-p is not abolished, but it +is obsoleted. + +*** mime-preview-condition + + Following are added as pre-defined keys: + + 'childrens-situation default preview-situation for children + 'message-button to specify to display message-button + nil: default (invisible) + 'visible: visible + 'invisible: invisible + 'entity-button to specify to display entity-button + nil: default (visible) + 'visible: visible + 'invisible: invisible + 'header to specify to display header + nil: default (invisible) + 'visible: visible + 'invisible: invisible + +** API + +*** Interface for body-filter + + 'mime-view-filter-for-* was renamed to 'mime-preview-filter-for-*. + + +*** mime-text-decode-body + + Function 'mime-decode-text-body was renamed to +'mime-text-decode-body and changed interface. New interface is +following: + + mime-text-decode-body (SITUATION) + +SITUATION is preview-situation. Content-Transfer-Encoding and +MIME-charset are specified in field of it. + + +* Changes in SEMI 1.1 + +** User setting + +*** Setting variable about visible body + + 'mime-view-visible-media-type-list and +'mime-view-content-filter-alist were abolished. Please use +'mime-preview-condition instead. + + Notice that 'mime-preview-condition is not list of +media-type/subtype string nor association-list. It uses new +data-structure `ctree' (condition-tree; it is introduced to replace +`atype'). Function 'ctree-set-calist-strictly and +'ctree-set-calist-with-default may be useful to modify it (`calist' +(condition-alist) is as same as `atype'). + + +*** API about visible-predicates + + Interface of visible-predicates for entity elements were changed. +New interfaces are following: + + mime-view-entity-button-visible-p (entity message-info) + + mime-view-header-visible-p (entity message-info) + + mime-view-body-visible-p (entity message-info) + + mime-view-entity-separator-visible-p (entity message-info) + + +** API + +*** entity representation + + Structure 'mime-entity-info was renamed to 'mime-entity. So various +functions were renamed too. + + +*** Interface for entity-button generators + + Interface of entity-button generators was changed. New interfaces +is following: + + mime-view-insert-entity-button (entity message-info subject) + + +*** mime-preview-condition and preview-situation + + Conditions about preview generation are unified to +'mime-preview-condition. Namely other variables, such as +'mime-view-visible-media-type-list, 'mime-view-content-filter-alist, +'mime-view-image-converter-alist were abolished. + + Preview-situation is generated from entity information, running +environment and 'mime-preview-condition. These elements are checked +to match with each other. (it is similar to acting-situation) + + Format of preview-situation is association-list. Following key is +pre-defined: + + 'type media-type + 'subtype media-subtype + 'encoding content-transfer-encoding + 'major-mode major-mode of MUA + attribute of Content-Type field. + 'body-presentation-method body-presentation-method + +If 'body-presentation-method is 'with-filter, 'body-filter is used to +specify body-filter function. If 'body-presentation-method is +function, it is called to generate presentation of entity body. + +Body-filter function 'mime-view-filter-for-image refers 'image-format. + +Setting for message/partial button is specified by +'mime-preview-condition instead of hard-coding. + + +*** Interface for body-filter + + Interface of body-filter was changed. New interfaces is following: + + (situation) + +Current pre-defined filters are following: + + mime-view-filter-for-text/plain (situation) + mime-view-filter-for-text/richtext (situation) + mime-view-filter-for-text/enriched (situation) + mime-view-filter-for-image (situation) ; if available + +'mime-view-filter-for-application/postscript was abolished. + + +*** Format of mime-acting-condition (acting-situation) + + Format of `mime-acting-condition' were changed. `type' and +`subtype' are separated and changed to symbol. + + +*** Renaming + +- mime-view-buffer -> mime-preview-buffer + + +Local variables: +mode: outline +paragraph-separate: "[ ]*$" +end: diff --git a/README.en b/README.en new file mode 100644 index 0000000..363cc58 --- /dev/null +++ b/README.en @@ -0,0 +1,250 @@ +[README for SEMI kernel package (English Version)] + +What's SEMI? +============ + + SEMI is a library to provide MIME feature for GNU Emacs. MIME is a + proposed internet standard for including content and headers other + than (ASCII) plain text in messages. + + RFC 2045 : Internet Message Bodies + RFC 2046 : Media Types + RFC 2047 : Message Header Extensions + RFC 2048 : MIME Registration Procedures + RFC 2049 : MIME Conformance + + SEMI has the following features: + + - MIME message viewer (mime-view-mode) (RFC 2045 .. 2049) + - MIME message composer (mime-edit-mode) (RFC 2045 .. 2049) + + MIME message viewer and composer also support following features: + + - filename handling by Content-Disposition field (RFC 1806) + - PGP/MIME security Multiparts (RFC 2015) + - application/pgp (draft-kazu-pgp-mime-00.txt; obsolete) + - text/richtext (RFC 1521; obsolete; preview only) + - text/enriched (RFC 1896) + - External method configuration by mailcap (RFC 1524) + + Notice that this package does not contain MIME extender for any + MUAs. They are released as separated packages. + + +Required environment +==================== + + SEMI supports XEmacs 20.2 or later with mule, and Emacs 20. + + SEMI does not support anything older than Emacs 19.28 or XEmacs + 19.14. SEMI also does not support Emacs 19.29 to 19.34, XEmacs + 19.15 or XEmacs 20.2 without mule, but SEMI may work with them. + + SEMI requires APEL (9.11 or later) and FLIM (1.12.5 or later) + package. Please install them before installing it. APEL package is + available at: + + ftp://ftp.jaist.ac.jp/pub/GNU/elisp/apel/ + + and FLIM package is available at: + + ftp://ftp.jaist.ac.jp/pub/GNU/elisp/flim/ + + PGP/MIME and application/pgp require mailcrypt or tiny-pgp package. + + +Installation +============ + +(a) run in expanded place + + If you don't want to install other directories, please do only + following: + + % make + + You can specify the emacs command name, for example + + % make EMACS=xemacs + + If `EMACS=...' is omitted, EMACS=emacs is used. + +(b) make install + + If you want to install other directories, please do following: + + % make install + + You can specify the emacs command name, for example + + % make install EMACS=xemacs + + If `EMACS=...' is omitted, EMACS=emacs is used. + + You can specify the prefix of the directory tree for Emacs Lisp + programs and shell scripts, for example: + + % make install PREFIX=~/ + + If `PREFIX=...' is omitted, the prefix of the directory tree of the + specified emacs command is used (perhaps /usr/local). + + For example, if PREFIX=/usr/local and EMACS 19.34 is specified, it + will create the following directory tree: + + /usr/local/share/emacs/19.34/site-lisp/ --- emu + /usr/local/share/emacs/site-lisp/apel/ --- APEL + /usr/local/share/emacs/site-lisp/flim/ --- FLIM + /usr/local/share/emacs/site-lisp/semi/ --- SEMI + + You can specify site-lisp directory, for example + + % make install LISPDIR=~/share/emacs/lisp + + If `LISPDIR=...' is omitted, site-lisp directory of the specified + emacs command is used (perhaps /usr/local/share/emacs/site-lisp or + /usr/local/lib/xemacs/site-lisp). + + If the emu modules (included in APEL package) have been installed in + the non-standard directory, you should specify where they will be + found, for example: + + % make install VERSION_SPECIFIC_LISPDIR=~/elisp + +(c) install as a XEmacs package + + If you want to install to XEmacs package directory, please do + following: + + % make install-package + + You can specify the emacs command name, for example + + % make install-package XEMACS=xemacs-21 + + If `XEMACS=...' is omitted, XEMACS=xemacs is used. + + You can specify the package directory, for example: + + % make install PACKAGEDIR=~/.xemacs + + If `PACKAGEDIR=...' is omitted, the first existing package + directory is used. + + Notice that XEmacs package system requires XEmacs 21.0 or later. + +(a,b,c) + + You can specify other optional settings by editing the file + ${archive}/SEMI-CFG. Please read ${archive}/README.en and comments + in ${archive}/SEMI-CFG. + + +Initialization +============== + +(a) load-path + + If you are using Emacs or Mule, please add directory of emu, apel, + flim and semi to load-path. If you install by default setting, you + can write subdirs.el for example: + + -------------------------------------------------------------------- + (normal-top-level-add-to-load-path + '("apel" "flim" "semi")) + -------------------------------------------------------------------- + + If you are using XEmacs, there are no need of setting about + load-path. + +(b) mime-setup + + Please insert the following into your ~/.emacs: + + (load "mime-setup") + + +Documentation +============= + + To get started, please read ${archive}/README.en. + + RFC's 822, 1524, 1806, 1847, 1896, 2015, 2045, 2046, 2047, 2048 and + 2049 are available via anonymous ftp: + + ftp://ftp.merit.edu/internet/documents/rfc/ + + +Mailing lists +============= + + If you write bug-reports and/or suggestions for improvement, please + send them to the tm Mailing List: + + bug-tm-en@chamonix.jaist.ac.jp (English) + bug-tm-ja@chamonix.jaist.ac.jp (Japanese) + + Via the tm ML, you can report SEMI bugs, obtain the latest release + of SEMI, and discuss future enhancements to SEMI. To join the tm + ML, send an empty e-mail to + + tm-en-help@chamonix.jaist.ac.jp (English) + tm-ja-help@chamonix.jaist.ac.jp (Japanese) + + Notice that you should not send mail to author(s), such as + morioka@jaist.ac.jp, directly. Because your problem may occur in + other environments (if not, it might be your problem, not bug of + SEMI). We should discuss in the tm mailing lists. Anyway + direct-mail for authors might be ignored. Please send mail to the + tm mailing lists. + + +CVS based development +===================== + + If you would like to join CVS based development, please send mail to + + cvs@chamonix.jaist.ac.jp + + with your account name and UNIX style crypted password. We hope you + will join the open development. + + +Authors +======= + +Original authors + + MORIOKA Tomohiko + (the author of mime-view and various parts of SEMI) + UMEDA Masanobu + (the author of mime.el of emacs-mime-tools. mime.el is the + origin of mime-edit.el of SEMI) + +Other authors + + Shuhei KOBAYASHI + (a major author of signature.el and a lot of codes) + MASUTANI Yasuhiro + (anonymous ftp codes of mime-play.el) + OKABE Yasuo + (a major author of mime-partial.el and signature.el) + + Steinar Bang + Steven L. Baur + Kevin Broadey + Alastair Burt + Eric Ding + Thierry Emery + Simon Josefsson + Jens Lautenbacher + Carsten Leonhardt + Pekka Marjola + Hisashi Miyashita + Kazuhiro Ohta + Alexandre Oliva + François Pinard + Artur Pioro + Dan Rich + (contribute to evolve mime-image.el with XEmacs) + Katsumi Yamaoka diff --git a/SEMI-CFG b/SEMI-CFG new file mode 100644 index 0000000..c05df10 --- /dev/null +++ b/SEMI-CFG @@ -0,0 +1,178 @@ +;;; -*-Emacs-Lisp-*- + +;; SEMI-CFG: installation setting about SEMI. + +;;; Code: + +(defvar default-load-path load-path) + +(add-to-list 'load-path + (expand-file-name "../../site-lisp/apel" data-directory)) +(add-to-list 'load-path + (expand-file-name "." data-directory)) + +(if (boundp 'LISPDIR) + (progn + (add-to-list 'default-load-path LISPDIR) + (add-to-list 'load-path LISPDIR) + (add-to-list 'load-path (expand-file-name "apel" LISPDIR)) + )) + +(defvar VERSION_SPECIFIC_LISPDIR nil) + +(if VERSION_SPECIFIC_LISPDIR + (add-to-list 'load-path VERSION_SPECIFIC_LISPDIR)) + +(condition-case nil + (require 'install) + (error (error "Please install APEL 8.7 or later."))) + +(add-path "bitmap-mule") +(add-path "flim") + +(add-to-list 'load-path (expand-file-name ".")) + +(or (module-installed-p 'calist) + (error "Please install APEL 8.7 or later.")) +(or (module-installed-p 'mime) + (error "Please install FLIM 1.6.0 or later.")) +(if (module-installed-p 'tm-view) + (message "Please remove tm from load-path.")) + + +;;; @ Please specify optional package directory if you use them. +;;; + +;; It is only necessary to use `add-path' if these packages are not +;; already on the standard load-path of Emacs. + +;; Function `get-latest-path' detect latest version of such package +;; under load-path directories. If you want to use a version of a +;; package instead of latest version, please specify by argument of +;; function `add-path'. + +;; Function `add-path' finds path under load-path directories. If a +;; package does not exist in load-path, please specify by absolutely +;; (`~/' is available), for example +;; (add-path "~/lib/elisp/mailcrypt-3.4") +;; or +;; (add-path "/opt/share/xmule/site-lisp/mailcrypt-3.4") + + +;;; @@ Please specify Mailcrypt path. +;;; + +;; Use latest version installed in load-path. + +(let ((path (get-latest-path "mailcrypt" 'all-paths))) + (if path + (add-path path) + )) + +;; Or please specify path. +;; (add-path "mailcrypt-3.4" 'all-paths) + + +;;; @@ Please specify BBDB path. +;;; + +(let ((path (get-latest-path "bbdb" 'all-paths))) + (when path + (add-path path) + (add-path (expand-file-name "lisp" path)) ; run-in-place installation + )) + +;; Or please specify path. +;; (add-path "bbdb-1.50" 'all-paths) + + +;;; +;;; @@ Please specify Emacs/W3 path. +;;; + +(let ((path (get-latest-path "w3" 'all-paths))) + (when path + (add-path path) + (add-path (expand-file-name "lisp" path)) ; run-in-place installation + )) + +;; Or please specify path. +;; (add-path "w3-4.0pre.20" 'all-paths) + + +;;; +;;; @@ Please specify CUSTOM path. +;;; + +(add-latest-path "custom") + + +;;; @ Please specify prefix of install directory. +;;; + +;; Please specify install path prefix. +;; If it is omitted, shared directory (maybe /usr/local is used). +(defvar PREFIX install-prefix) +;;(setq PREFIX "~/") + +;; Please specify install path prefix for binaries. +(defvar EXEC_PREFIX + (if (or running-emacs-18 running-xemacs) + (expand-file-name "../../.." exec-directory) + (expand-file-name "../../../.." exec-directory) + )) + +;; Please specify emu prefix [optional] +(setq EMU_PREFIX + (if (string-match "XEmacs" emacs-version) + "emu" + "")) + +;; Please specify SEMI prefix [optional] +(setq SEMI_PREFIX "semi") + + +;;; @ executables +;;; + +;; Please specify binary path. +(defvar BIN_DIR (expand-file-name "bin" EXEC_PREFIX)) + +;; Please specify binary path. (for external method scripts) +(setq METHOD_DIR (expand-file-name "share/semi" PREFIX)) + + + + +;;; @ optional settings +;;; + +;; It is generated by automatically. Please set variable `PREFIX'. +;; If you don't like default directory tree, please set it. +(defvar LISPDIR (install-detect-elisp-directory PREFIX)) +;; (setq install-default-elisp-directory "~/lib/emacs/lisp") + +(setq SEMI_KERNEL_DIR (expand-file-name SEMI_PREFIX LISPDIR)) +(setq SETUP_FILE_DIR SEMI_KERNEL_DIR) + +(setq METHOD_SRC_DIR "methods") +(setq METHODS + '("tm-au" "tm-file" "tm-html" "tm-image" "tm-mpeg" + "tm-plain" "tm-ps" + "tmdecode")) + +(defvar PACKAGEDIR + (if (boundp 'early-packages) + (let ((dirs (append (if early-package-load-path + early-packages) + (if late-package-load-path + late-packages) + (if last-package-load-path + last-packages))) + dir) + (while (not (file-exists-p + (setq dir (car dirs)))) + (setq dirs (cdr dirs))) + dir))) + +;;; SEMI-CFG ends here diff --git a/SEMI-ELS b/SEMI-ELS new file mode 100644 index 0000000..6ffa7fc --- /dev/null +++ b/SEMI-ELS @@ -0,0 +1,40 @@ +;;; -*-Emacs-Lisp-*- + +;; SEMI-ELS: list of SEMI modules to install + +;;; Code: + +(setq semi-modules-to-compile + '(signature + semi-def mime-view mime-play mime-partial mime-edit + semi-setup mail-mime-setup)) + +(setq semi-modules-not-to-compile nil) + +(mapcar (function + (lambda (cell) + (let ((c-module (car cell)) + (i-modules (cdr cell)) + ) + (if (module-installed-p c-module) + (setq semi-modules-to-compile + (nconc semi-modules-to-compile i-modules)) + (setq semi-modules-not-to-compile + (nconc semi-modules-not-to-compile i-modules)) + ) + ))) + '((mailcrypt mime-pgp mime-mc) + (bbdb mime-bbdb) + (w3 mime-w3) + )) + +(if (or (string-match "XEmacs" emacs-version) + (featurep 'mule)) + (setq semi-modules-to-compile + (nconc semi-modules-to-compile '(mime-image))) + ) + +(setq semi-modules (append semi-modules-to-compile + semi-modules-not-to-compile)) + +;;; SEMI-ELS ends here diff --git a/SEMI-MK b/SEMI-MK new file mode 100644 index 0000000..6a0de68 --- /dev/null +++ b/SEMI-MK @@ -0,0 +1,100 @@ +;;; -*-Emacs-Lisp-*- + +;; SEMI-MK: installer for SEMI. + +;;; Code: + +(defun config-semi () + (let (prefix exec-prefix lisp-dir version-specific-lisp-dir) + (and (setq prefix (car command-line-args-left)) + (or (string-equal "NONE" prefix) + (defvar PREFIX prefix) + )) + (setq command-line-args-left (cdr command-line-args-left)) + (and (setq exec-prefix (car command-line-args-left)) + (or (string-equal "NONE" exec-prefix) + (defvar EXEC_PREFIX exec-prefix) + )) + (setq command-line-args-left (cdr command-line-args-left)) + (and (setq lisp-dir (car command-line-args-left)) + (or (string-equal "NONE" lisp-dir) + (defvar LISPDIR lisp-dir) + )) + (setq command-line-args-left (cdr command-line-args-left)) + (and (setq version-specific-lisp-dir (car command-line-args-left)) + (or (string-equal "NONE" version-specific-lisp-dir) + (progn + (defvar VERSION_SPECIFIC_LISPDIR version-specific-lisp-dir) + (princ (format "VERSION_SPECIFIC_LISPDIR=%s\n" + VERSION_SPECIFIC_LISPDIR))) + )) + (setq command-line-args-left (cdr command-line-args-left)) + ) + (load-file "SEMI-CFG") + (load-file "SEMI-ELS") + (princ (format "PREFIX=%s\tEXEC_PREFIX=%s +LISPDIR=%s\n" PREFIX EXEC_PREFIX LISPDIR)) + ) + +(defun directory= (dir1 dir2) + (string= (file-name-as-directory dir1)(file-name-as-directory dir2)) + ) + +(defun compile-semi () + (config-semi) + (print load-path) + (compile-elisp-modules semi-modules-to-compile ".") + (compile-elisp-module 'mime-setup ".") + ) + +(defun install-semi () + (config-semi) + (princ (format "%s\n" emacs-version)) + (install-elisp-modules semi-modules "." SEMI_KERNEL_DIR) + (install-elisp-modules '(mime-setup) "." SETUP_FILE_DIR) + ) + +(defun install-execs () + (config-semi) + (install-files METHODS METHOD_SRC_DIR METHOD_DIR nil t) + ) + +(defun config-semi-package () + (let (package-dir) + (and (setq package-dir (car command-line-args-left)) + (or (string= "NONE" package-dir) + (defvar PACKAGEDIR package-dir) + )) + (setq command-line-args-left (cdr command-line-args-left)) + (load-file "SEMI-CFG") + (load-file "SEMI-ELS") + + (princ (format "PACKAGEDIR=%s\n" PACKAGEDIR)) + )) + +(defun compile-semi-package () + (config-semi-package) + + (setq autoload-package-name "semi") + (add-to-list 'command-line-args-left ".") + (batch-update-directory) + + (add-to-list 'command-line-args-left ".") + (Custom-make-dependencies) + + (compile-elisp-modules (append semi-modules-to-compile + '(auto-autoloads custom-load)) + ".") + ) + +(defun install-semi-package () + (config-semi-package) + (install-elisp-modules (append semi-modules + '(mime auto-autoloads custom-load)) + "./" + (expand-file-name SEMI_PREFIX + (expand-file-name "lisp" + PACKAGEDIR))) + ) + +;;; SEMI-MK ends here diff --git a/TODO b/TODO index 4a051ff..4be8a0e 100644 --- a/TODO +++ b/TODO @@ -5,48 +5,9 @@ ** dynamic configuration for 'mime-preview-condition -** multipart/related support +** Don't expect raw-buffer -** Don't use filter-model - - tomo (major developer of SEMI) and akr (major developer of -FLIM-FLAM) discussed about Emacs 20.3 problem related with SEMI and -FLIM. They found essential problem with Emacs 20.3 are: - - - Emacs 20.3 separates string-type to unibyte-string and - multibyte-string. Emacs 20.3 has enough APIs to treat them. - - - Buffer has mode about interpretation of contents. Each mode is - designed to save semantics as characters. Namely buffer contains - unibyte-characters or multibyte-characters. One buffer can not - contain both representations. - - - {decode|encode}-coding-{region|string} run in byte world. So it - is not harmonized with other API. - - - It seems easy to write code in one mode or one world - (unibyte-string or multibyte-string). However it seems not easy - to write inter-mode program, such as SEMI. - - - Byte <-> byte conversion, such as base64, quoted-printable, must - be run only with unibyte-mode. - - - Byte <-> character conversion, such as - {decode|encode}-coding-region, should not be defined in single - buffer. Instead of them, decoder should read from unibyte buffer - and output to multibyte buffer. Similarly, encoder should read - from multibyte buffer and output to unibyte buffer. - `insert-buffer-substring' like API may be suitable. Anyway Emacs - introduces multiple representations, so it should be redesigned - based on multiple representation world model. - - Anyway FLIM should introduce new APIs based on inter-representation -world model. Conventional APIs should be implemented based on new -APIs. - - SEMI should abolish filter model and introduce new methods to -display inline data. These methods should use new FLIM APIs based on -inter-representation world model. +** lazy generating of situations from mime-entity information * MIME-Edit diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..54312ec --- /dev/null +++ b/VERSION @@ -0,0 +1,218 @@ +[SEMI Version names] + +0.72 -------- -------- +0.75 -------- -------- +0.83 -------- -------- +0.87 -------- -------- +0.88 -------- -------- +0.91 -------- -------- +0.92 -------- -------- + +;;------------------------------------------------------------------------- +;; Hokuriku Railway $(BKLN&E4F;(B +;; Ishikawa Line $(B@P@n@~(B +;;------------------------------------------------------------------------- +0.96 Kaga-Ichinomiya $(B2C2l0l$N5\(B ; $(B!JGr;3Hf$(D5/$(B?@ $(B$8$c$$%P%9(B +0.115 Hinomiko $(BF|8f;R(B +0.115.1 Oyanagi $(B>.Lx(B +0.115.2 Inokuchi $(B0f8}(B +0.116 D-Dòhòji-A $(BF;K!;{(B +0.118 Sodani $(BA>C+(B +0.118.1 Shijima $(B;M==K|(B +0.118.2 Otomaru $(B254](B +1.0.0 Nukaj-Dþtaku-mae-A $(B3[=;BpA0(B +1.0.1 Magae $(BGOBX(B +1.0.2 Nonoichi-K-Dòdaimae-A $(BLn!9;T9)BgA0(B +1.1.0 Nonoichi $(BLn!9;T(B +1.1.1 Oshino $(B2!Ln(B +1.1.2 Shin-Nishikanazawa $(B?7@>6bBt(B ; <=> JR $(B@>6bBt(B +1.2.0 Nishiizumi $(B@>@t(B +1.2.1 Nomachi $(BLnD.(B + +;;------------------------------------------------------------------------- +;; West Japan Railway $(B@>F|K\N95RE4F;(B http://www.westjr.co.jp/ +;; Hokuriku Line $(BKLN&K\@~(B +;;------------------------------------------------------------------------- +1.2.2 Naoetsu $(BD>9>DE(B ; = JR $(B?.1[K\@~(B +1.2.3 Tanihama $(BC+IM(B +1.2.4 Arimagawa $(BM-4V@n(B +1.3.0 Nadachi $(BL>N)(B +1.3.1 Tsutsuishi $(BE{@P(B +1.3.2 N-Dò-A $(BG=@8(B +1.3.3 Uramoto $(B1:K\(B +1.3.4 Kajiyashiki $(B3a20I_(B +1.4.0 Itoigawa $(B;e5{@n(B ; = JR $(BBg;e@~(B +1.4.1 -DÒmi-A $(B@D3$(B +1.4.2 Oyashirazu $(B?FITCN(B +1.4.3 Ichiburi $(B;T?6(B +1.4.4 Ecch-Dþ-Miyazaki-A $(B1[Cf5\:j(B +1.4.5 Tomari $(BGq(B +1.4.6 Ny-Dþzen-A $(BF~A1(B +1.5.0 Nishi-Ny-Dþzen-A $(B@>F~A1(B +1.5.1 Ikuji $(B@8CO(B +1.5.2 Kurobe $(B9uIt(B +1.5.3 Uozu $(B5{DE(B ; <=> $(BIY;3COJ}E4F;(B +1.5.4 Higashi-Namerikawa $(BEl3j@n(B +1.6.0 Namerikawa $(B3j@n(B ; <=> $(BIY;3COJ}E4F;(B +1.7.0 Mizuhashi $(B?e66(B +1.7.1 Higashi-Toyama $(BElIY;3(B +1.8.0 Toyama $(BIY;3(B ; = JR $(B9b;3K\@~!"IY;39A@~(B +1.8.1 Kureha $(B8b1)(B +1.8.2 Kosugi $(B>.?y(B +1.8.3 Ecch-Dþ-Daimon-A $(B1[CfBgLg(B +1.8.4 Takaoka $(B9b2,(B ; = JR $(BI98+@~!">kC<@~(B +1.8.5 Nishi-Takaoka $(B@>9b2,(B +1.8.6 Fukuoka $(BJ!2,(B +1.9.0 Isurugi $(B@PF0(B +1.9.1 Kurikara $(B6fMx2@Me(B +1.10.0 Tsubata $(BDEH((B +1.10.1 Morimoto $(B?9K\(B +1.10.2 Higashi-Kanazawa $(BEl6bBt(B +1.11.0 Kanazawa $(B6bBt(B ; <=> $(BKLN&E4F;(B $(BKLE46bBt(B +1.12.0 Nishi-Kanazawa $(B@>6bBt(B ; <=> $(BKLN&E4F;(B $(B?7@>6bBt(B +1.12.1 [JR] Nonoichi [JR] $(BLn!9;T(B +1.13.0 Matt-Dò-A $(B>>G$(B +1.13.1 Kaga-Kasama $(B2C2l3^4V(B +1.13.2 Mikawa $(BH~@n(B +------ Komaiko $(B>.Iq;R(B +------ Terai $(B;{0f(B +------ Meih-Dò-A $(BL@Jv(B +------ Komatsu $(B>.>>(B +: : : +------- Tsuruga $(BFX2l(B ; = JR $(B>.IM@~(B +------- Shin-Hikida $(B?7I%ED(B +------- -DÒmi-Shiotsu-A $(B6a9>1vDE(B ; = JR $(B8P@>@~(B +------- Yogo $(BM>8b(B +------- Kinomoto $(BLZ%NK\(B +------- Takatsuki $(B9b7n(B +------- Kawake $(B2OLS(B +------- Torahime $(B8WI1(B +------- Nagahama $(BD9IM(B +------- Tamura $(BEDB<(B +------- Sakata $(B:dED(B + (Maibara) ($(BJF86(B) ; = JR $(BEl3$F;K\@~(B + + +[WEMI version names] + +;;------------------------------------------------------------------------- +;; East Japan Railway $(BElF|K\N95RE4F;(B http://www.jreast.co.jp/ +;; T-Dòkaidò-A Line $(BEl3$F;K\@~(B +;;------------------------------------------------------------------------- +1.2.0 T-Dòkyò-A $(BEl5~(B +1.2.1 Shinbashi $(B?766(B ; = JR $(B;3 $(B>.ED5^EEE4(B $(B9>%NEg@~!"9>%NEgEEE4(B +1.4.1 Tsujid-Dò-A $(@DT$(BF2(B ; $(B!J!V$(@DT$(B!W(B= J90@B-4454:128b$(B!K(B +1.4.2 Chigasaki $(B3}%v:j(B ; = JR $(BAjLO@~(B +1.4.3 Hiratsuka $(BJ?DM(B +1.4.4 -DÒiso-A $(BBg0k(B +1.4.5 Ninomiya $(BFs5\(B +1.4.6 K-Dòzu-A $(B9qI\DE(B ; = JR $(B8fEB>l@~(B +1.5.0 Kamonomiya $(B3{5\(B +1.5.1 Odawara $(B>.ED86(B ; <=> $(B>.ED5^!"H":,EP;3E4F;!"(B + ; $(B0KF&H":,E4F;(B +1.5.2 Hayakawa $(BAa@n(B +1.5.3 Nebukawa $(B:,I\@n(B +1.5.4 Manazuru $(B??Da(B +1.6.0 Yugawara $(BEr2O86(B +1.7.0 Atami $(BG.3$(B ; = JR $(B0KEl@~(B +;;------------------------------------------------------------------------- +;; Central Japan Railway $(BEl3$N95RE4F;(B +;;------------------------------------------------------------------------- +1.7.1 Kan'nami $(BH!Fn(B +1.8.0 Mishima $(B;0Eg(B ; = $(B0KF&H":,E4F;(B +1.8.1 Numazu $(B>BDE(B ; = JR $(B8fEB>l@~(B +1.8.2 Katahama $(BJRIM(B +1.8.4 Hara $(B86(B +1.8.5 Higashi-Tagonoura $(BElED;R%N1:(B +1.8.6 Yoshiwara $(B5H86(B ; = $(B3YFnE4F;(B +1.9.0 Fuji $(BIY;N(B ; = JR $(B?H1d@~(B +1.9.1 Fujikawa $(BIY;N@n(B +1.10.0 Shin-Kambara $(B?73w86(B +1.10.1 Kambara $(B3w86(B +1.10.2 Yui $(BM3Hf(B +1.11.0 Okitsu $(B6=DE(B +1.12.0 Shimizu $(B@6?e(B +1.12.1 Kusanagi $(BApFe(B +1.13.0 Shizuoka $(B@E2,(B +1.13.1 Abekawa $(B0BG\@n(B +1.13.2 Mochimune $(BMQ=!(B +------ Yaizu $(B>FDE(B +------ Nishi-Yaizu $(B@>>FDE(B +------ Fijieda $(BF#;^(B +------ Rokug-Dò-A $(BO;9g(B +------ Shimada $(BEgED(B +------ Kanaya $(B6bC+(B ; = $(BBg0f@nE4F;(B +------ Kikugawa $(B5F@n(B +------ Kakegawa $(B3]@n(B ; = $(BE7N5IML>8PE4F;(B +------ Fukuroi $(BB^0f(B +------ Iwata $(BHXED(B +------ Toyodach-Dò-A $(BK-EDD.(B +------ Tenry-Dþgawa-A $(BE7N5@n(B +------ Hamamatsu $(BIM>>(B ; = $(B1s=#E4F;(B +------ Takatsuka $(B9bDM(B +------ Maisaka $(BIq:e(B +------ Bentenjima $(BJ[E7Eg(B +------ Araimachi $(B?75oD.(B +------ Wasizu $(BOIDE(B +------ Shinjohara $(B?7=j86(B ; = $(BE7N5IML>8PE4F;(B +------ Futagawa $(BFs2O(B +------ Toyohashi $(BK-66(B ; = JR $(BHSED@~(B +: : : +------ Kanayama $(B6b;3(B ; =$(B!J(BJR $(BCf1{K\@~!K(B +------ Ot-Dòbashi-A $(BHxF,66(B +------ Nagoya $(BL>8E20(B ; = JR $(B4X@>K\@~!J!&Cf1{K\@~!K(B +: : : +------ Gifu $(B4tIl(B ; = JR $(B9b;3K\@~(B +: : : +------ Samegai $(B@C%v0f(B +;;------------------------------------------------------------------------- +;; West Japan Railway $(B@>F|K\N95RE4F;(B http://www.westjr.co.jp/ +;;------------------------------------------------------------------------- +------ Maibara $(BJF86(B ; = JR $(BKLN&K\@~(B +: : : +------ Kusatsu $(BApDE(B ; = JR $(BApDE@~(B +: : : +------ Yamashina $(B;32J(B ; = JR $(B8P@>@~(B +------ Ky-Dòto-A $(B5~ET(B ; = JR $(BF`NI@~!&;31"K\@~(B + ; <=> $(B6aE4(B $(B5~ET@~!"5~ET;T8rDL6I(B $(B1(4]@~(B +: : : +------ -DÒsaka-A $(BBg:e(B ; = JR $(BBg:e4D>u@~(B <=> JR $(BEl@>@~(B $(BKL?7CO(B + ; <=> $(BBg:e;T8rDL6I!":e?@!":e5^(B $(BG_ED(B +: : : +------ K-Dòbe-A $(B?@8M(B ; = JR $(B;3M[K\@~(B + + +[REMI version names] + +;;------------------------------------------------------------------------- +;; West Japan Railway $(B@>F|K\N95RE4F;(B http://www.westjr.co.jp/ +;; Himi Line $(BI98+@~(B +;;------------------------------------------------------------------------- +1.4.0 Himi $(BI98+(B +1.5.0 Shimao $(BEgHx(B +1.6.0 Amaharashi $(B1+@2(B +1.8.0 Ecch-Dþ-Kokubu-A $(B1[Cf9qJ,(B +1.8.1 Fushiki $(BIzLZ(B ; <=> $(B%&%i%8%*%9%C%H%C%/9RO)(B +1.8.2 N-Dòmachi-A $(BG=D.(B +1.8.3 Ecch-Dþ-Nakagawa-A $(B1[CfCf@n(B +1.8.4 Takaoka $(B9b2,(B ; = JR $(BKLN&K\@~!">kC<@~(B + + +[etc.] + +;;------------------------------------------------------------------------- +;; West Japan Railway $(B@>F|K\N95RE4F;(B http://www.westjr.co.jp/ +;; Kosei Line $(B8P@>@~(B +;;------------------------------------------------------------------------- +------- (-DÒmi-Shiotsu)-A ($(B6a9>1vDE(B) ; = JR $(BKLN&K\@~(B +: : : +------- Nishi--DÒtsu-A $(B@>BgDE(B + (Yamashina) ($(B;32J(B) ; = JR $(BEl3$F;K\@~(B diff --git a/ftp.in b/ftp.in new file mode 100644 index 0000000..6c3ad02 --- /dev/null +++ b/ftp.in @@ -0,0 +1,17 @@ +--<>-{ + + It is available from + + ftp://ftp.jaist.ac.jp/pub/GNU/elisp/semi/semi-API-for-flim-1.12 + +--[[message/external-body; + access-type=anon-ftp; + site="ftp.jaist.ac.jp"; + directory="/pub/GNU/elisp/semi/semi-API-for-flim-1.12"; + name="PACKAGE-VERSION.tar.gz"; + mode=image]] +Content-Type: application/octet-stream; + name="PACKAGE-VERSION.tar.gz"; + type=tar; + conversions=gzip +--}-<> diff --git a/mail-mime-setup.el b/mail-mime-setup.el new file mode 100644 index 0000000..710d15b --- /dev/null +++ b/mail-mime-setup.el @@ -0,0 +1,65 @@ +;;; mail-mime-setup.el --- setup file for mail-mode. + +;; Copyright (C) 1994,1995,1996,1997,1998 Free Software Foundation, Inc. + +;; Author: MORIOKA Tomohiko +;; Keywords: mail-mode, MIME, multimedia, multilingual, encoded-word + +;; This file is part of SEMI (Setting for Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'semi-setup) +(require 'alist) + + +(autoload 'turn-on-mime-edit "mime-edit" + "Unconditionally turn on MIME-Edit minor mode." t) + +(autoload 'eword-decode-header "eword-decode" + "Decode MIME encoded-words in header fields." t) + + +;;; @ for mail-mode, RMAIL and VM +;;; + +(add-hook 'mail-setup-hook 'eword-decode-header) +(add-hook 'mail-setup-hook 'turn-on-mime-edit 'append) +(add-hook 'mail-send-hook 'mime-edit-maybe-translate) +(set-alist 'mime-edit-split-message-sender-alist + 'mail-mode (function + (lambda () + (interactive) + (funcall send-mail-function) + ))) + + +;;; @ for signature +;;; + +(if mime-setup-use-signature + (setq mail-signature nil) + ) + + +;;; @ end +;;; + +(provide 'mail-mime-setup) + +;;; mail-mime-setup.el ends here diff --git a/mime-bbdb.el b/mime-bbdb.el new file mode 100644 index 0000000..62bc191 --- /dev/null +++ b/mime-bbdb.el @@ -0,0 +1,303 @@ +;;; mime-bbdb.el --- SEMI shared module for BBDB + +;; Copyright (C) 1995,1996,1997 Shuhei KOBAYASHI +;; Copyright (C) 1997,1998 MORIOKA Tomohiko + +;; Author: Shuhei KOBAYASHI +;; Maintainer: Shuhei KOBAYASHI +;; Keywords: BBDB, MIME, multimedia, multilingual, mail, news + +;; This file is part of SEMI (Suite of Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'path-util) +(require 'std11) +(require 'mime-view) + +(if (module-installed-p 'bbdb-com) + (require 'bbdb-com) + (eval-when-compile + ;; imported from bbdb-1.51 + (defmacro bbdb-pop-up-elided-display () + '(if (boundp 'bbdb-pop-up-elided-display) + bbdb-pop-up-elided-display + bbdb-elided-display)) + (defmacro bbdb-user-mail-names () + "Returns a regexp matching the address of the logged-in user" + '(or bbdb-user-mail-names + (setq bbdb-user-mail-names + (concat "\\b" (regexp-quote (user-login-name)) "\\b")))) + )) + + +;;; @ User Variables +;;; + +(defvar mime-bbdb/use-mail-extr t + "*If non-nil, `mail-extract-address-components' is used. +Otherwise `mime-bbdb/extract-address-components' overrides it.") + +(defvar mime-bbdb/auto-create-p nil + "*If t, create new BBDB records automatically. +If function, then it is called with no arguments to decide whether an +entry should be automatically creaded. + +mime-bbdb uses this variable instead of `bbdb/mail-auto-create-p' or +`bbdb/news-auto-create-p' unless other tm-MUA overrides it.") + +(defvar mime-bbdb/delete-empty-window nil + "*If non-nil, delete empty BBDB window. +All bbdb-MUAs but bbdb-gnus display BBDB window even if it is empty. +If you prefer behavior of bbdb-gnus, set this variable to t. + +For framepop users: If empty, `framepop-banish' is used instead.") + +;;; @ mail-extr +;;; + +(defun mime-bbdb/extract-address-components (str) + (let* ((ret (std11-extract-address-components str)) + (phrase (car ret)) + (address (car (cdr ret))) + (methods mime-bbdb/canonicalize-full-name-methods)) + (while (and phrase methods) + (setq phrase (funcall (car methods) phrase) + methods (cdr methods))) + (if (string= address "") (setq address nil)) + (if (string= phrase "") (setq phrase nil)) + (list phrase address) + )) + +(or mime-bbdb/use-mail-extr + (progn + (require 'mail-extr) ; for `what-domain' + (or (fboundp 'tm:mail-extract-address-components) + (fset 'tm:mail-extract-address-components + (symbol-function 'mail-extract-address-components))) + (fset 'mail-extract-address-components + (symbol-function 'mime-bbdb/extract-address-components)) + )) + + +;;; @ bbdb-extract-field-value +;;; + +(or (fboundp 'tm:bbdb-extract-field-value) + (progn + ;; (require 'bbdb-hooks) ; not provided. + ;; (or (fboundp 'bbdb-extract-field-value) ; defined as autoload + (or (fboundp 'bbdb-header-start) + (load "bbdb-hooks")) + (fset 'tm:bbdb-extract-field-value + (symbol-function 'bbdb-extract-field-value)) + (defun bbdb-extract-field-value (field) + (let ((value (tm:bbdb-extract-field-value field))) + (and value + (eword-decode-string value)))) + )) + + +;;; @ full-name canonicalization methods +;;; + +(defun mime-bbdb/canonicalize-spaces (str) + (let (dest) + (while (string-match "\\s +" str) + (setq dest (cons (substring str 0 (match-beginning 0)) dest)) + (setq str (substring str (match-end 0))) + ) + (or (string= str "") + (setq dest (cons str dest))) + (setq dest (nreverse dest)) + (mapconcat 'identity dest " ") + )) + +(defun mime-bbdb/canonicalize-dots (str) + (let (dest) + (while (string-match "\\." str) + (setq dest (cons (substring str 0 (match-end 0)) dest)) + (setq str (substring str (match-end 0))) + ) + (or (string= str "") + (setq dest (cons str dest))) + (setq dest (nreverse dest)) + (mapconcat 'identity dest " ") + )) + +(defvar mime-bbdb/canonicalize-full-name-methods + '(eword-decode-string + mime-bbdb/canonicalize-dots + mime-bbdb/canonicalize-spaces)) + + +;;; @ BBDB functions for mime-view-mode +;;; + +(defun mime-bbdb/update-record (&optional offer-to-create) + "Return the record corresponding to the current MIME previewing message. +Creating or modifying it as necessary. A record will be created if +mime-bbdb/auto-create-p is non-nil, or if OFFER-TO-CREATE is non-nil and +the user confirms the creation." + (save-excursion + (if (and mime-preview-buffer + (get-buffer mime-preview-buffer)) + (set-buffer mime-preview-buffer)) + (if bbdb-use-pop-up + (mime-bbdb/pop-up-bbdb-buffer offer-to-create) + (let* ((message (get-text-property (point-min) 'mime-view-entity)) + (from (mime-fetch-field 'From message)) + addr) + (if (or (null from) + (null (setq addr (car (mime-read-field 'From message)))) + (string-match (bbdb-user-mail-names) + (std11-address-string addr))) + (setq from (or (mime-fetch-field 'To message) + from)) + ) + (if from + (bbdb-annotate-message-sender + (mime-decode-field-body from 'From) t + (or (bbdb-invoke-hook-for-value mime-bbdb/auto-create-p) + offer-to-create) + offer-to-create)) + )))) + +(defun mime-bbdb/annotate-sender (string) + "Add a line to the end of the Notes field of the BBDB record +corresponding to the sender of this message." + (interactive + (list (if bbdb-readonly-p + (error "The Insidious Big Brother Database is read-only.") + (read-string "Comments: ")))) + (bbdb-annotate-notes (mime-bbdb/update-record t) string)) + +(defun mime-bbdb/edit-notes (&optional arg) + "Edit the notes field or (with a prefix arg) a user-defined field +of the BBDB record corresponding to the sender of this message." + (interactive "P") + (let ((record (or (mime-bbdb/update-record t) + (error "")))) + (bbdb-display-records (list record)) + (if arg + (bbdb-record-edit-property record nil t) + (bbdb-record-edit-notes record t)))) + +(defun mime-bbdb/show-sender () + "Display the contents of the BBDB for the sender of this message. +This buffer will be in bbdb-mode, with associated keybindings." + (interactive) + (let ((record (mime-bbdb/update-record t))) + (if record + (bbdb-display-records (list record)) + (error "unperson")))) + +(defun mime-bbdb/pop-up-bbdb-buffer (&optional offer-to-create) + "Make the *BBDB* buffer be displayed along with the MIME preview window(s), +displaying the record corresponding to the sender of the current message." + (let ((framepop (eq temp-buffer-show-function 'framepop-display-buffer))) + (or framepop + (bbdb-pop-up-bbdb-buffer + (function + (lambda (w) + (let ((b (current-buffer))) + (set-buffer (window-buffer w)) + (prog1 (eq major-mode 'mime-view-mode) + (set-buffer b))))))) + (let ((bbdb-gag-messages t) + (bbdb-use-pop-up nil) + (bbdb-electric-p nil)) + (let ((record (mime-bbdb/update-record offer-to-create)) + (bbdb-elided-display (bbdb-pop-up-elided-display)) + (b (current-buffer))) + (if framepop + (if record + (bbdb-display-records (list record)) + (framepop-banish)) + (bbdb-display-records (if record (list record) nil)) + (if (and (null record) + mime-bbdb/delete-empty-window) + (delete-windows-on (get-buffer "*BBDB*")))) + (set-buffer b) + record)))) + +(defun mime-bbdb/define-keys () + (let ((mime-view-mode-map (current-local-map))) + (define-key mime-view-mode-map ";" 'mime-bbdb/edit-notes) + (define-key mime-view-mode-map ":" 'mime-bbdb/show-sender) + )) + +(add-hook 'mime-view-define-keymap-hook 'mime-bbdb/define-keys) + + +;;; @ for signature.el +;;; + +(defun signature/get-bbdb-sigtype (addr) + "Extract sigtype information from BBDB." + (let ((record (bbdb-search-simple nil addr))) + (and record + (bbdb-record-getprop record 'sigtype)) + )) + +(defun signature/set-bbdb-sigtype (sigtype addr) + "Add sigtype information to BBDB." + (let* ((bbdb-notice-hook nil) + (record (bbdb-annotate-message-sender + addr t + (bbdb-invoke-hook-for-value + bbdb/mail-auto-create-p) + t))) + (if record + (progn + (bbdb-record-putprop record 'sigtype sigtype) + (bbdb-change-record record nil)) + ))) + +(defun signature/get-sigtype-from-bbdb (&optional verbose) + (let* ((to (std11-field-body "To")) + (addr (and to + (car (cdr (mail-extract-address-components to))))) + (sigtype (signature/get-bbdb-sigtype addr)) + return + ) + (if addr + (if verbose + (progn + (setq return (signature/get-sigtype-interactively sigtype)) + (if (and (not (string-equal return sigtype)) + (y-or-n-p + (format "Register \"%s\" for <%s>? " return addr)) + ) + (signature/set-bbdb-sigtype return addr) + ) + return) + (or sigtype + (signature/get-signature-file-name)) + )) + )) + + +;;; @ end +;;; + +(provide 'mime-bbdb) + +(run-hooks 'mime-bbdb-load-hook) + +;;; end of mime-bbdb.el diff --git a/mime-edit.el b/mime-edit.el new file mode 100644 index 0000000..230d16c --- /dev/null +++ b/mime-edit.el @@ -0,0 +1,2796 @@ +;;; mime-edit.el --- Simple MIME Composer for GNU Emacs + +;; Copyright (C) 1993,94,95,96,97,98,99 Free Software Foundation, Inc. + +;; Author: UMEDA Masanobu +;; MORIOKA Tomohiko +;; Created: 1994/08/21 renamed from mime.el +;; Renamed: 1997/2/21 from tm-edit.el +;; Keywords: MIME, multimedia, multilingual, mail, news + +;; This file is part of SEMI (Sophisticated Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + +;; This is an Emacs minor mode for editing Internet multimedia +;; messages formatted in MIME (RFC 2045, 2046, 2047, 2048 and 2049). +;; All messages in this mode are composed in the tagged MIME format, +;; that are described in the following examples. The messages +;; composed in the tagged MIME format are automatically translated +;; into a MIME compliant message when exiting the mode. + +;; Mule (multilingual feature of Emacs 20 and multilingual extension +;; for XEmacs 20) has a capability of handling multilingual text in +;; limited ISO-2022 manner that is based on early experiences in +;; Japanese Internet community and resulted in RFC 1468 (ISO-2022-JP +;; charset for MIME). In order to enable multilingual capability in +;; single text message in MIME, charset of multilingual text written +;; in Mule is declared as either `ISO-2022-JP-2' [RFC 1554]. Mule is +;; required for reading the such messages. + +;; This MIME composer can work with Mail mode, mh-e letter Mode, and +;; News mode. First of all, you need the following autoload +;; definition to load mime-edit-mode automatically: +;; +;; (autoload 'turn-on-mime-edit "mime-edit" +;; "Minor mode for editing MIME message." t) +;; +;; In case of Mail mode (includes VM mode), you need the following +;; hook definition: +;; +;; (add-hook 'mail-mode-hook 'turn-on-mime-edit) +;; (add-hook 'mail-send-hook 'mime-edit-maybe-translate) +;; +;; In case of MH-E, you need the following hook definition: +;; +;; (add-hook 'mh-letter-mode-hook +;; (function +;; (lambda () +;; (turn-on-mime-edit) +;; (make-local-variable 'mail-header-separator) +;; (setq mail-header-separator "--------") +;; )))) +;; (add-hook 'mh-before-send-letter-hook 'mime-edit-maybe-translate) +;; +;; In case of News mode, you need the following hook definition: +;; +;; (add-hook 'news-reply-mode-hook 'turn-on-mime-edit) +;; (add-hook 'news-inews-hook 'mime-edit-maybe-translate) +;; +;; In case of Emacs 19, it is possible to emphasize the message tags +;; using font-lock mode as follows: +;; +;; (add-hook 'mime-edit-mode-hook +;; (function +;; (lambda () +;; (font-lock-mode 1) +;; (setq font-lock-keywords (list mime-edit-tag-regexp)) +;; )))) + +;; The message tag looks like: +;; +;; --[[TYPE/SUBTYPE;PARAMETERS][ENCODING]] +;; +;; The tagged MIME message examples: +;; +;; This is a conventional plain text. It should be translated into +;; text/plain. +;; +;;--[[text/plain]] +;; This is also a plain text. But, it is explicitly specified as is. +;;--[[text/plain; charset=ISO-8859-1]] +;; This is also a plain text. But charset is specified as iso-8859-1. +;; +;; ¡Hola! Buenos días. ¿Cómo está usted? +;;--[[text/enriched]] +;;
This is a richtext.
+;; +;;--[[image/gif][base64]]^M...image encoded in base64 comes here... +;; +;;--[[audio/basic][base64]]^M...audio encoded in base64 comes here... + +;;; Code: + +(require 'sendmail) +(require 'mail-utils) +(require 'mel) +(require 'mime-view) +(require 'signature) +(require 'alist) +(require 'invisible) + + +;;; @ version +;;; + +(eval-and-compile + (defconst mime-edit-version + (concat + (mime-product-name mime-user-interface-product) " " + (mapconcat #'number-to-string + (mime-product-version mime-user-interface-product) ".") + " - \"" (mime-product-code-name mime-user-interface-product) "\""))) + + +;;; @ variables +;;; + +(defgroup mime-edit nil + "MIME edit mode" + :group 'mime) + +(defcustom mime-ignore-preceding-spaces nil + "*Ignore preceding white spaces if non-nil." + :group 'mime-edit + :type 'boolean) + +(defcustom mime-ignore-trailing-spaces nil + "*Ignore trailing white spaces if non-nil." + :group 'mime-edit + :type 'boolean) + +(defcustom mime-ignore-same-text-tag t + "*Ignore preceding text content-type tag that is same with new one. +If non-nil, the text tag is not inserted unless something different." + :group 'mime-edit + :type 'boolean) + +(defcustom mime-auto-hide-body t + "*Hide non-textual body encoded in base64 after insertion if non-nil." + :group 'mime-edit + :type 'boolean) + +(defcustom mime-edit-voice-recorder + (function mime-edit-voice-recorder-for-sun) + "*Function to record a voice message and encode it." + :group 'mime-edit + :type 'function) + +(defcustom mime-edit-mode-hook nil + "*Hook called when enter MIME mode." + :group 'mime-edit + :type 'hook) + +(defcustom mime-edit-translate-hook nil + "*Hook called before translating into a MIME compliant message. +To insert a signature file automatically, call the function +`mime-edit-insert-signature' from this hook." + :group 'mime-edit + :type 'hook) + +(defcustom mime-edit-exit-hook nil + "*Hook called when exit MIME mode." + :group 'mime-edit + :type 'hook) + +(defvar mime-content-types + '(("text" + ;; Charset parameter need not to be specified, since it is + ;; defined automatically while translation. + ("plain" + ;;("charset" "" "ISO-2022-JP" "US-ASCII" "ISO-8859-1" "ISO-8859-8") + ) + ("enriched") + ("html") + ("css") ; rfc2318 + ("xml") ; rfc2376 + ("x-latex") + ("x-rot13-47-48") + ) + ("message" + ("external-body" + ("access-type" + ("anon-ftp" + ("site" "ftp.jaist.ac.jp" "wnoc-fuk.wide.ad.jp" "nic.karrn.ad.jp") + ("directory" "/pub/GNU/elisp/mime") + ("name") + ("mode" "image" "ascii" "local8")) + ("ftp" + ("site") + ("directory") + ("name") + ("mode" "image" "ascii" "local8")) + ("tftp" ("site") ("name")) + ("afs" ("site") ("name")) + ("local-file" ("site") ("name")) + ("mail-server" + ("server" "ftpmail@nic.karrn.ad.jp") + ("subject")) + ("url" ("url")) + )) + ("rfc822") + ("news") + ) + ("application" + ("octet-stream" ("type" "" "tar" "shar")) + ("postscript") + ("x-kiss" ("x-cnf"))) + ("image" + ("gif") + ("jpeg") + ("png") + ("tiff") + ("x-pic") + ("x-mag") + ("x-xwd") + ("x-xbm") + ) + ("audio" ("basic")) + ("video" ("mpeg")) + ) + "*Alist of content-type, subtype, parameters and its values.") + +(defcustom mime-file-types + '( + + ;; Programming languages + + ("\\.cc$" + "application" "octet-stream" (("type" . "C++")) + "7bit" + "attachment" (("filename" . file)) + ) + + ("\\.el$" + "application" "octet-stream" (("type" . "emacs-lisp")) + "7bit" + "attachment" (("filename" . file)) + ) + + ("\\.lsp$" + "application" "octet-stream" (("type" . "common-lisp")) + "7bit" + "attachment" (("filename" . file)) + ) + + ("\\.pl$" + "application" "octet-stream" (("type" . "perl")) + "7bit" + "attachment" (("filename" . file)) + ) + + ;; Text or translated text + + ("\\.txt$" + "text" "plain" nil + nil + "inline" (("filename" . file)) + ) + + ;; .rc : procmail modules pm-xxxx.rc + ;; *rc : other resource files + + ("\\.\\(rc\\|lst\\|log\\|sql\\|mak\\)$\\|\\..*rc$" + "text" "plain" nil + nil + "attachment" (("filename" . file)) + ) + + ("\\.html$" + "text" "html" nil + nil + nil nil) + + ("\\.diff$\\|\\.patch$" + "application" "octet-stream" (("type" . "patch")) + nil + "attachment" (("filename" . file)) + ) + + ("\\.signature" + "text" "plain" nil nil nil nil) + + + ;; Octect binary text + + ("\\.doc$" ;MS Word + "application" "winword" nil + "base64" + "attachment" (("filename" . file)) + ) + + ("\\.pln$" + "text" "plain" nil + nil + "inline" (("filename" . file)) + ) + ("\\.ps$" + "application" "postscript" nil + "quoted-printable" + "attachment" (("filename" . file)) + ) + + ;; Pure binary + + ("\\.jpg$" + "image" "jpeg" nil + "base64" + "inline" (("filename" . file)) + ) + ("\\.gif$" + "image" "gif" nil + "base64" + "inline" (("filename" . file)) + ) + ("\\.png$" + "image" "png" nil + "base64" + "inline" (("filename" . file)) + ) + ("\\.tiff$" + "image" "tiff" nil + "base64" + "inline" (("filename" . file)) + ) + ("\\.pic$" + "image" "x-pic" nil + "base64" + "inline" (("filename" . file)) + ) + ("\\.mag$" + "image" "x-mag" nil + "base64" + "inline" (("filename" . file)) + ) + ("\\.xbm$" + "image" "x-xbm" nil + "base64" + "inline" (("filename" . file)) + ) + ("\\.xwd$" + "image" "x-xwd" nil + "base64" + "inline" (("filename" . file)) + ) + ("\\.au$" + "audio" "basic" nil + "base64" + "attachment" (("filename" . file)) + ) + ("\\.mpg$" + "video" "mpeg" nil + "base64" + "attachment" (("filename" . file)) + ) + ("\\.tar\\.gz$" + "application" "octet-stream" (("type" . "tar+gzip")) + "base64" + "attachment" (("filename" . file)) + ) + ("\\.tgz$" + "application" "octet-stream" (("type" . "tar+gzip")) + "base64" + "attachment" (("filename" . file)) + ) + ("\\.tar\\.Z$" + "application" "octet-stream" (("type" . "tar+compress")) + "base64" + "attachment" (("filename" . file)) + ) + ("\\.taz$" + "application" "octet-stream" (("type" . "tar+compress")) + "base64" + "attachment" (("filename" . file)) + ) + ("\\.gz$" + "application" "octet-stream" (("type" . "gzip")) + "base64" + "attachment" (("filename" . file)) + ) + ("\\.Z$" + "application" "octet-stream" (("type" . "compress")) + "base64" + "attachment" (("filename" . file)) + ) + ("\\.lzh$" + "application" "octet-stream" (("type" . "lha")) + "base64" + "attachment" (("filename" . file)) + ) + ("\\.zip$" + "application" "zip" nil + "base64" + "attachment" (("filename" . file)) + ) + + ;; Rest + + (".*" + "application" "octet-stream" nil + nil + "attachment" (("filename" . file))) + ) + "*Alist of file name, types, parameters, and default encoding. +If encoding is nil, it is determined from its contents." + :type `(repeat + (list regexp + ;; primary-type + (choice :tag "Primary-Type" + ,@(nconc (mapcar (lambda (cell) + (list 'item (car cell)) + ) + mime-content-types) + '(string))) + ;; subtype + (choice :tag "Sub-Type" + ,@(nconc + (apply #'nconc + (mapcar (lambda (cell) + (mapcar (lambda (cell) + (list 'item (car cell)) + ) + (cdr cell))) + mime-content-types)) + '(string))) + ;; parameters + (repeat :tag "Parameters of Content-Type field" + (cons string (choice string symbol))) + ;; content-transfer-encoding + (choice :tag "Encoding" + ,@(cons + '(const nil) + (mapcar (lambda (cell) + (list 'item cell) + ) + (mime-encoding-list)))) + ;; disposition-type + (choice :tag "Disposition-Type" + (item nil) + (item "inline") + (item "attachment") + string) + ;; parameters + (repeat :tag "Parameters of Content-Disposition field" + (cons string (choice string symbol))) + )) + :group 'mime-edit) + + +;;; @@ about charset, encoding and transfer-level +;;; + +(defvar mime-charset-type-list + '((us-ascii 7 nil) + (iso-8859-1 8 "quoted-printable") + (iso-8859-2 8 "quoted-printable") + (iso-8859-3 8 "quoted-printable") + (iso-8859-4 8 "quoted-printable") + (iso-8859-5 8 "quoted-printable") + (koi8-r 8 "quoted-printable") + (iso-8859-7 8 "quoted-printable") + (iso-8859-8 8 "quoted-printable") + (iso-8859-9 8 "quoted-printable") + (iso-2022-jp 7 "base64") + (iso-2022-kr 7 "base64") + (euc-kr 8 "base64") + (cn-gb 8 "base64") + (gb2312 8 "base64") + (cn-big5 8 "base64") + (big5 8 "base64") + (shift_jis 8 "base64") + (iso-2022-jp-2 7 "base64") + (iso-2022-int-1 7 "base64") + )) + +(defvar mime-transfer-level 7 + "*A number of network transfer level. It should be bigger than 7.") +(make-variable-buffer-local 'mime-transfer-level) + +(defsubst mime-encoding-name (transfer-level &optional not-omit) + (cond ((> transfer-level 8) "binary") + ((= transfer-level 8) "8bit") + (not-omit "7bit") + )) + +(defvar mime-transfer-level-string + (mime-encoding-name mime-transfer-level 'not-omit) + "A string formatted version of mime-transfer-level") +(make-variable-buffer-local 'mime-transfer-level-string) + +(put 'iso-2022-jp-2 'mime-charset-comment "RFC1554") +(put 'iso-2022-jp 'mime-charset-comment "RFC1468 with trivial bugfix") + +;;; @@ about content transfer encoding + +(defvar mime-content-transfer-encoding-priority-list + '(nil "8bit" "binary")) + +;;; @@ about message inserting +;;; + +(defvar mime-edit-yank-ignored-field-list + '("Received" "Approved" "Path" "Replied" "Status" + "Xref" "X-UIDL" "X-Filter" "X-Gnus-.*" "X-VM-.*") + "Delete these fields from original message when it is inserted +as message/rfc822 part. +Each elements are regexp of field-name.") + +(defvar mime-edit-yank-ignored-field-regexp + (concat "^" + (apply (function regexp-or) mime-edit-yank-ignored-field-list) + ":")) + +(defvar mime-edit-message-inserter-alist nil) +(defvar mime-edit-mail-inserter-alist nil) + + +;;; @@ about message splitting +;;; + +(defcustom mime-edit-split-message t + "*Split large message if it is non-nil." + :group 'mime-edit + :type 'boolean) + +(defcustom mime-edit-message-default-max-lines 1000 + "*Default maximum lines of a message." + :group 'mime-edit + :type 'integer) + +(defcustom mime-edit-message-max-lines-alist + '((news-reply-mode . 500)) + "Alist of major-mode vs maximum lines of a message. +If it is not specified for a major-mode, +`mime-edit-message-default-max-lines' is used." + :group 'mime-edit + :type 'list) + +(defconst mime-edit-split-ignored-field-regexp + "\\(^Content-\\|^Subject:\\|^Mime-Version:\\|^Message-Id:\\)") + +(defcustom mime-edit-split-blind-field-regexp + "\\(^[BDFbdf]cc:\\|^cc:[ \t]*$\\)" + "*Regular expression to match field-name to be ignored when split sending." + :group 'mime-edit + :type 'regexp) + +(defvar mime-edit-split-message-sender-alist nil) + +(defvar mime-edit-news-reply-mode-server-running nil) + + +;;; @@ about tag +;;; + +(defconst mime-edit-single-part-tag-regexp + "--[[][[]\\([^]]*\\)]\\([[]\\([^]]*\\)]\\|\\)]" + "*Regexp of MIME tag in the form of [[CONTENT-TYPE][ENCODING]].") + +(defconst mime-edit-quoted-single-part-tag-regexp + (concat "- " (substring mime-edit-single-part-tag-regexp 1))) + +(defconst mime-edit-multipart-beginning-regexp "--<<\\([^<>]+\\)>>-{\n") + +(defconst mime-edit-multipart-end-regexp "--}-<<\\([^<>]+\\)>>\n") + +(defconst mime-edit-beginning-tag-regexp + (regexp-or mime-edit-single-part-tag-regexp + mime-edit-multipart-beginning-regexp)) + +(defconst mime-edit-end-tag-regexp + (regexp-or mime-edit-single-part-tag-regexp + mime-edit-multipart-end-regexp)) + +(defconst mime-edit-tag-regexp + (regexp-or mime-edit-single-part-tag-regexp + mime-edit-multipart-beginning-regexp + mime-edit-multipart-end-regexp)) + +(defvar mime-tag-format "--[[%s]]" + "*Control-string making a MIME tag.") + +(defvar mime-tag-format-with-encoding "--[[%s][%s]]" + "*Control-string making a MIME tag with encoding.") + + +;;; @@ multipart boundary +;;; + +(defvar mime-multipart-boundary "Multipart" + "*Boundary of a multipart message.") + + +;;; @@ optional header fields +;;; + +(defvar mime-edit-insert-user-agent-field t + "*If non-nil, insert User-Agent header field.") + +(defvar mime-edit-user-agent-value + (concat (mime-product-name mime-user-interface-product) + "/" + (mapconcat #'number-to-string + (mime-product-version mime-user-interface-product) ".") + " (" + (mime-product-code-name mime-user-interface-product) + ") " + (mime-product-name mime-library-product) + "/" + (mapconcat #'number-to-string + (mime-product-version mime-library-product) ".") + " (" + (mime-product-code-name mime-library-product) + ") " + (if (featurep 'xemacs) + (concat (if (featurep 'mule) "MULE") + " XEmacs" + (if (string-match "\\s +\\\"" emacs-version) + (concat "/" + (substring emacs-version 0 + (match-beginning 0)) + (if (and (boundp 'xemacs-betaname) + ;; It does not exist in XEmacs + ;; versions prior to 20.3. + xemacs-betaname) + (concat " " xemacs-betaname) + "") + " (" xemacs-codename ") (" + system-configuration ")") + " (" emacs-version ")")) + (let ((ver (if (string-match "\\.[0-9]+$" emacs-version) + (substring emacs-version 0 (match-beginning 0)) + emacs-version))) + (if (featurep 'mule) + (if (boundp 'enable-multibyte-characters) + (concat "Emacs/" ver + " (" system-configuration ")" + (if enable-multibyte-characters + (concat " MULE/" mule-version) + " (with unibyte mode)") + (if (featurep 'meadow) + (let ((mver (Meadow-version))) + (if (string-match "^Meadow-" mver) + (concat " Meadow/" + (substring mver + (match-end 0))) + )))) + (concat "MULE/" mule-version + " (based on Emacs " ver ")")) + (concat "Emacs/" ver " (" system-configuration ")"))))) + "Body of User-Agent field. +If variable `mime-edit-insert-user-agent-field' is not nil, it is +inserted into message header.") + + +;;; @ constants +;;; + +(defconst mime-tspecials-regexp "[][()<>@,;:\\\"/?.= \t]" + "*Specify MIME tspecials. +Tspecials means any character that matches with it in header must be quoted.") + +(defconst mime-edit-mime-version-value + (eval-when-compile + (concat "1.0 (generated by " mime-edit-version ")")) + "MIME version number.") + +(defconst mime-edit-mime-version-field-for-message/partial + (eval-when-compile + (concat "MIME-Version: 1.0 (split by " mime-edit-version ")\n")) + "MIME version field for message/partial.") + + +;;; @ keymap and menu +;;; + +(defvar mime-edit-mode-flag nil) +(make-variable-buffer-local 'mime-edit-mode-flag) + +(defvar mime-edit-mode-entity-prefix "\C-c\C-x" + "Keymap prefix for MIME-Edit mode commands to insert entity or set status.") +(defvar mime-edit-mode-entity-map (make-sparse-keymap) + "Keymap for MIME-Edit mode commands to insert entity or set status.") + +(define-key mime-edit-mode-entity-map "\C-t" 'mime-edit-insert-text) +(define-key mime-edit-mode-entity-map "\C-i" 'mime-edit-insert-file) +(define-key mime-edit-mode-entity-map "\C-e" 'mime-edit-insert-external) +(define-key mime-edit-mode-entity-map "\C-v" 'mime-edit-insert-voice) +(define-key mime-edit-mode-entity-map "\C-y" 'mime-edit-insert-message) +(define-key mime-edit-mode-entity-map "\C-m" 'mime-edit-insert-mail) +(define-key mime-edit-mode-entity-map "\C-w" 'mime-edit-insert-signature) +(define-key mime-edit-mode-entity-map "\C-s" 'mime-edit-insert-signature) +(define-key mime-edit-mode-entity-map "\C-k" 'mime-edit-insert-key) +(define-key mime-edit-mode-entity-map "t" 'mime-edit-insert-tag) + +(define-key mime-edit-mode-entity-map "7" 'mime-edit-set-transfer-level-7bit) +(define-key mime-edit-mode-entity-map "8" 'mime-edit-set-transfer-level-8bit) +(define-key mime-edit-mode-entity-map "/" 'mime-edit-set-split) +(define-key mime-edit-mode-entity-map "s" 'mime-edit-set-sign) +(define-key mime-edit-mode-entity-map "v" 'mime-edit-set-sign) +(define-key mime-edit-mode-entity-map "e" 'mime-edit-set-encrypt) +(define-key mime-edit-mode-entity-map "h" 'mime-edit-set-encrypt) +(define-key mime-edit-mode-entity-map "p" 'mime-edit-preview-message) +(define-key mime-edit-mode-entity-map "\C-z" 'mime-edit-exit) +(define-key mime-edit-mode-entity-map "?" 'mime-edit-help) + +(defvar mime-edit-mode-enclosure-prefix "\C-c\C-m" + "Keymap prefix for MIME-Edit mode commands about enclosure.") +(defvar mime-edit-mode-enclosure-map (make-sparse-keymap) + "Keymap for MIME-Edit mode commands about enclosure.") + +(define-key mime-edit-mode-enclosure-map + "\C-a" 'mime-edit-enclose-alternative-region) +(define-key mime-edit-mode-enclosure-map + "\C-p" 'mime-edit-enclose-parallel-region) +(define-key mime-edit-mode-enclosure-map + "\C-m" 'mime-edit-enclose-mixed-region) +(define-key mime-edit-mode-enclosure-map + "\C-d" 'mime-edit-enclose-digest-region) +(define-key mime-edit-mode-enclosure-map + "\C-s" 'mime-edit-enclose-pgp-signed-region) +(define-key mime-edit-mode-enclosure-map + "\C-e" 'mime-edit-enclose-pgp-encrypted-region) +(define-key mime-edit-mode-enclosure-map + "\C-q" 'mime-edit-enclose-quote-region) + +(defvar mime-edit-mode-map (make-sparse-keymap) + "Keymap for MIME-Edit mode commands.") +(define-key mime-edit-mode-map + mime-edit-mode-entity-prefix mime-edit-mode-entity-map) +(define-key mime-edit-mode-map + mime-edit-mode-enclosure-prefix mime-edit-mode-enclosure-map) + +(defconst mime-edit-menu-title "MIME-Edit") + +(defconst mime-edit-menu-list + '((mime-help "Describe MIME editor mode" mime-edit-help) + (file "Insert File" mime-edit-insert-file) + (external "Insert External" mime-edit-insert-external) + (voice "Insert Voice" mime-edit-insert-voice) + (message "Insert Message" mime-edit-insert-message) + (mail "Insert Mail" mime-edit-insert-mail) + (signature "Insert Signature" mime-edit-insert-signature) + (text "Insert Text" mime-edit-insert-text) + (tag "Insert Tag" mime-edit-insert-tag) + (alternative "Enclose as alternative" + mime-edit-enclose-alternative-region) + (parallel "Enclose as parallel" mime-edit-enclose-parallel-region) + (mixed "Enclose as serial" mime-edit-enclose-mixed-region) + (digest "Enclose as digest" mime-edit-enclose-digest-region) + (signed "Enclose as signed" mime-edit-enclose-pgp-signed-region) + (encrypted "Enclose as encrypted" mime-edit-enclose-pgp-encrypted-region) + (quote "Verbatim region" mime-edit-enclose-quote-region) + (key "Insert Public Key" mime-edit-insert-key) + (split "About split" mime-edit-set-split) + (sign "About sign" mime-edit-set-sign) + (encrypt "About encryption" mime-edit-set-encrypt) + (preview "Preview Message" mime-edit-preview-message) + (level "Toggle transfer-level" mime-edit-toggle-transfer-level) + ) + "MIME-edit menubar entry.") + +(cond ((featurep 'xemacs) + ;; modified by Pekka Marjola + ;; 1995/9/5 (c.f. [tm-en:69]) + (defun mime-edit-define-menu-for-xemacs () + "Define menu for XEmacs." + (cond ((featurep 'menubar) + (make-local-variable 'current-menubar) + (set-buffer-menubar current-menubar) + (add-submenu + nil + (cons mime-edit-menu-title + (mapcar (function + (lambda (item) + (vector (nth 1 item)(nth 2 item) + mime-edit-mode-flag) + )) + mime-edit-menu-list))) + ))) + + ;; modified by Steven L. Baur + ;; 1995/12/6 (c.f. [tm-en:209]) + (or (boundp 'mime-edit-popup-menu-for-xemacs) + (setq mime-edit-popup-menu-for-xemacs + (append '("MIME Commands" "---") + (mapcar (function (lambda (item) + (vector (nth 1 item) + (nth 2 item) + t))) + mime-edit-menu-list))) + ) + ) + ((>= emacs-major-version 19) + (define-key mime-edit-mode-map [menu-bar mime-edit] + (cons mime-edit-menu-title + (make-sparse-keymap mime-edit-menu-title))) + (mapcar (function + (lambda (item) + (define-key mime-edit-mode-map + (vector 'menu-bar 'mime-edit (car item)) + (cons (nth 1 item)(nth 2 item)) + ) + )) + (reverse mime-edit-menu-list) + ) + )) + + +;;; @ functions +;;; + +(defvar mime-edit-touched-flag nil) + +;;;###autoload +(defun mime-edit-mode () + "MIME minor mode for editing the tagged MIME message. + +In this mode, basically, the message is composed in the tagged MIME +format. The message tag looks like: + + --[[text/plain; charset=ISO-2022-JP][7bit]] + +The tag specifies the MIME content type, subtype, optional parameters +and transfer encoding of the message following the tag. Messages +without any tag are treated as `text/plain' by default. Charset and +transfer encoding are automatically defined unless explicitly +specified. Binary messages such as audio and image are usually +hidden. The messages in the tagged MIME format are automatically +translated into a MIME compliant message when exiting this mode. + +Available charsets depend on Emacs version being used. The following +lists the available charsets of each emacs. + +Without mule: US-ASCII and ISO-8859-1 (or other charset) are available. +With mule: US-ASCII, ISO-8859-* (except for ISO-8859-5), KOI8-R, + ISO-2022-JP, ISO-2022-JP-2, EUC-KR, CN-GB-2312, + CN-BIG5 and ISO-2022-INT-1 are available. + +ISO-2022-JP-2 and ISO-2022-INT-1 charsets used in mule is expected to +be used to represent multilingual text in intermixed manner. Any +languages that has no registered charset are represented as either +ISO-2022-JP-2 or ISO-2022-INT-1 in mule. + +If you want to use non-ISO-8859-1 charset in Emacs 19 or XEmacs +without mule, please set variable `default-mime-charset'. This +variable must be symbol of which name is a MIME charset. + +If you want to add more charsets in mule, please set variable +`charsets-mime-charset-alist'. This variable must be alist of which +key is list of charset and value is symbol of MIME charset. If name +of coding-system is different as MIME charset, please set variable +`mime-charset-coding-system-alist'. This variable must be alist of +which key is MIME charset and value is coding-system. + +Following commands are available in addition to major mode commands: + +\[make single part\] +\\[mime-edit-insert-text] insert a text message. +\\[mime-edit-insert-file] insert a (binary) file. +\\[mime-edit-insert-external] insert a reference to external body. +\\[mime-edit-insert-voice] insert a voice message. +\\[mime-edit-insert-message] insert a mail or news message. +\\[mime-edit-insert-mail] insert a mail message. +\\[mime-edit-insert-signature] insert a signature file at end. +\\[mime-edit-insert-key] insert PGP public key. +\\[mime-edit-insert-tag] insert a new MIME tag. + +\[make enclosure (maybe multipart)\] +\\[mime-edit-enclose-alternative-region] enclose as multipart/alternative. +\\[mime-edit-enclose-parallel-region] enclose as multipart/parallel. +\\[mime-edit-enclose-mixed-region] enclose as multipart/mixed. +\\[mime-edit-enclose-digest-region] enclose as multipart/digest. +\\[mime-edit-enclose-pgp-signed-region] enclose as PGP signed. +\\[mime-edit-enclose-pgp-encrypted-region] enclose as PGP encrypted. +\\[mime-edit-enclose-quote-region] enclose as verbose mode + (to avoid to expand tags) + +\[other commands\] +\\[mime-edit-set-transfer-level-7bit] set transfer-level as 7. +\\[mime-edit-set-transfer-level-8bit] set transfer-level as 8. +\\[mime-edit-set-split] set message splitting mode. +\\[mime-edit-set-sign] set PGP-sign mode. +\\[mime-edit-set-encrypt] set PGP-encryption mode. +\\[mime-edit-preview-message] preview editing MIME message. +\\[mime-edit-exit] exit and translate into a MIME + compliant message. +\\[mime-edit-help] show this help. +\\[mime-edit-maybe-translate] exit and translate if in MIME mode, + then split. + +Additional commands are available in some major modes: +C-c C-c exit, translate and run the original command. +C-c C-s exit, translate and run the original command. + +The following is a message example written in the tagged MIME format. +TABs at the beginning of the line are not a part of the message: + + This is a conventional plain text. It should be translated + into text/plain. + --[[text/plain]] + This is also a plain text. But, it is explicitly specified as + is. + --[[text/plain; charset=ISO-8859-1]] + This is also a plain text. But charset is specified as + iso-8859-1. + + ¡Hola! Buenos días. ¿Cómo está usted? + --[[text/enriched]] + This is a enriched text. + --[[image/gif][base64]]...image encoded in base64 here... + --[[audio/basic][base64]]...audio encoded in base64 here... + +User customizable variables (not documented all of them): + mime-edit-prefix + Specifies a key prefix for MIME minor mode commands. + + mime-ignore-preceding-spaces + Preceding white spaces in a message body are ignored if non-nil. + + mime-ignore-trailing-spaces + Trailing white spaces in a message body are ignored if non-nil. + + mime-auto-hide-body + Hide a non-textual body message encoded in base64 after insertion + if non-nil. + + mime-transfer-level + A number of network transfer level. It should be bigger than 7. + If you are in 8bit-through environment, please set 8. + + mime-edit-voice-recorder + Specifies a function to record a voice message and encode it. + The function `mime-edit-voice-recorder-for-sun' is for Sun + SparcStations. + + mime-edit-mode-hook + Turning on MIME mode calls the value of mime-edit-mode-hook, if + it is non-nil. + + mime-edit-translate-hook + The value of mime-edit-translate-hook is called just before translating + the tagged MIME format into a MIME compliant message if it is + non-nil. If the hook call the function mime-edit-insert-signature, + the signature file will be inserted automatically. + + mime-edit-exit-hook + Turning off MIME mode calls the value of mime-edit-exit-hook, if it is + non-nil." + (interactive) + (if mime-edit-mode-flag + (mime-edit-exit) + (if mime-edit-touched-flag + (mime-edit-again) + (make-local-variable 'mime-edit-touched-flag) + (setq mime-edit-touched-flag t) + (turn-on-mime-edit) + ))) + + +(cond ((featurep 'xemacs) + (add-minor-mode 'mime-edit-mode-flag + '((" MIME-Edit " mime-transfer-level-string)) + mime-edit-mode-map + nil + 'mime-edit-mode) + ) + (t + (set-alist 'minor-mode-alist + 'mime-edit-mode-flag + '((" MIME-Edit " mime-transfer-level-string))) + (set-alist 'minor-mode-map-alist + 'mime-edit-mode-flag + mime-edit-mode-map) + )) + + +;;;###autoload +(defun turn-on-mime-edit () + "Unconditionally turn on MIME-Edit mode." + (interactive) + (if mime-edit-mode-flag + (error "You are already editing a MIME message.") + (setq mime-edit-mode-flag t) + + ;; Set transfer level into mode line + ;; + (setq mime-transfer-level-string + (mime-encoding-name mime-transfer-level 'not-omit)) + (force-mode-line-update) + + ;; Define menu for XEmacs. + (if (featurep 'xemacs) + (mime-edit-define-menu-for-xemacs) + ) + + (enable-invisible) + + ;; I don't care about saving these. + (setq paragraph-start + (regexp-or mime-edit-single-part-tag-regexp + paragraph-start)) + (setq paragraph-separate + (regexp-or mime-edit-single-part-tag-regexp + paragraph-separate)) + (run-hooks 'mime-edit-mode-hook) + (message + (substitute-command-keys + "Type \\[mime-edit-exit] to exit MIME mode, and type \\[mime-edit-help] to get help.")) + )) + +;;;###autoload +(defalias 'edit-mime 'turn-on-mime-edit) ; for convenience + + +(defun mime-edit-exit (&optional nomime no-error) + "Translate the tagged MIME message into a MIME compliant message. +With no argument encode a message in the buffer into MIME, otherwise +just return to previous mode." + (interactive "P") + (if (not mime-edit-mode-flag) + (if (null no-error) + (error "You aren't editing a MIME message.") + ) + (if (not nomime) + (progn + (run-hooks 'mime-edit-translate-hook) + (mime-edit-translate-buffer))) + ;; Restore previous state. + (setq mime-edit-mode-flag nil) + (if (and (featurep 'xemacs) + (featurep 'menubar)) + (delete-menu-item (list mime-edit-menu-title)) + ) + (end-of-invisible) + (set-buffer-modified-p (buffer-modified-p)) + (run-hooks 'mime-edit-exit-hook) + (message "Exit MIME editor mode.") + )) + +(defun mime-edit-maybe-translate () + (interactive) + (mime-edit-exit nil t) + (call-interactively 'mime-edit-maybe-split-and-send) + ) + +(defun mime-edit-help () + "Show help message about MIME mode." + (interactive) + (with-output-to-temp-buffer "*Help*" + (princ "MIME editor mode:\n") + (princ (documentation 'mime-edit-mode)) + (print-help-return-message))) + +(defun mime-edit-insert-text (&optional subtype) + "Insert a text message. +Charset is automatically obtained from the `charsets-mime-charset-alist'. +If optional argument SUBTYPE is not nil, text/SUBTYPE tag is inserted." + (interactive) + (let ((ret (mime-edit-insert-tag "text" subtype nil))) + (when ret + (if (looking-at mime-edit-single-part-tag-regexp) + (progn + ;; Make a space between the following message. + (insert "\n") + (forward-char -1) + )) + (if (and (member (cadr ret) '("enriched")) + (fboundp 'enriched-mode)) + (enriched-mode t) + (if (boundp 'enriched-mode) + (enriched-mode -1) + )) + ))) + +(defun mime-edit-insert-file (file &optional verbose) + "Insert a message from a file." + (interactive "fInsert file as MIME message: \nP") + (let* ((guess (mime-find-file-type file)) + (type (nth 0 guess)) + (subtype (nth 1 guess)) + (parameters (nth 2 guess)) + (encoding (nth 3 guess)) + (disposition-type (nth 4 guess)) + (disposition-params (nth 5 guess)) + ) + (if verbose + (setq type (mime-prompt-for-type type) + subtype (mime-prompt-for-subtype type subtype) + )) + (if (or (interactive-p) verbose) + (setq encoding (mime-prompt-for-encoding encoding)) + ) + (if (or (consp parameters) (stringp disposition-type)) + (let ((rest parameters) cell attribute value) + (setq parameters "") + (while rest + (setq cell (car rest)) + (setq attribute (car cell)) + (setq value (cdr cell)) + (if (eq value 'file) + (setq value (std11-wrap-as-quoted-string + (file-name-nondirectory file))) + ) + (setq parameters (concat parameters "; " attribute "=" value)) + (setq rest (cdr rest)) + ) + (if disposition-type + (progn + (setq parameters + (concat parameters "\n" + "Content-Disposition: " disposition-type)) + (setq rest disposition-params) + (while rest + (setq cell (car rest)) + (setq attribute (car cell)) + (setq value (cdr cell)) + (if (eq value 'file) + (setq value (std11-wrap-as-quoted-string + (file-name-nondirectory file))) + ) + (setq parameters + (concat parameters "; " attribute "=" value)) + (setq rest (cdr rest)) + ) + )) + )) + (mime-edit-insert-tag type subtype parameters) + (mime-edit-insert-binary-file file encoding) + )) + +(defun mime-edit-insert-external () + "Insert a reference to external body." + (interactive) + (mime-edit-insert-tag "message" "external-body" nil ";\n\t") + ;;(forward-char -1) + ;;(insert "Content-Description: " (read-string "Content-Description: ") "\n") + ;;(forward-line 1) + (let* ((pritype (mime-prompt-for-type)) + (subtype (mime-prompt-for-subtype pritype)) + (parameters (mime-prompt-for-parameters pritype subtype ";\n\t"))) + (and pritype + subtype + (insert "Content-Type: " + pritype "/" subtype (or parameters "") "\n"))) + (if (and (not (eobp)) + (not (looking-at mime-edit-single-part-tag-regexp))) + (insert (mime-make-text-tag) "\n"))) + +(defun mime-edit-insert-voice () + "Insert a voice message." + (interactive) + (let ((encoding + (completing-read + "What transfer encoding: " + (mime-encoding-alist) nil t nil))) + (mime-edit-insert-tag "audio" "basic" nil) + (mime-edit-define-encoding encoding) + (save-restriction + (narrow-to-region (1- (point))(point)) + (unwind-protect + (funcall mime-edit-voice-recorder encoding) + (progn + (insert "\n") + (invisible-region (point-min)(point-max)) + (goto-char (point-max)) + ))))) + +(defun mime-edit-insert-signature (&optional arg) + "Insert a signature file." + (interactive "P") + (let ((signature-insert-hook + (function + (lambda () + (let ((items (mime-find-file-type signature-file-name))) + (apply (function mime-edit-insert-tag) + (car items) (cadr items) (list (caddr items)))) + ))) + ) + (insert-signature arg) + )) + + +;; Insert a new tag around a point. + +(defun mime-edit-insert-tag (&optional pritype subtype parameters delimiter) + "Insert new MIME tag and return a list of PRITYPE, SUBTYPE, and PARAMETERS. +If nothing is inserted, return nil." + (interactive) + (let ((p (point))) + (mime-edit-goto-tag) + (if (and (re-search-forward mime-edit-tag-regexp nil t) + (< (match-beginning 0) p) + (< p (match-end 0)) + ) + (goto-char (match-beginning 0)) + (goto-char p) + )) + (let ((oldtag nil) + (newtag nil) + (current (point)) + ) + (setq pritype + (or pritype + (mime-prompt-for-type))) + (setq subtype + (or subtype + (mime-prompt-for-subtype pritype))) + (setq parameters + (or parameters + (mime-prompt-for-parameters pritype subtype delimiter))) + ;; Make a new MIME tag. + (setq newtag (mime-make-tag pritype subtype parameters)) + ;; Find an current MIME tag. + (setq oldtag + (save-excursion + (if (mime-edit-goto-tag) + (buffer-substring (match-beginning 0) (match-end 0)) + ;; Assume content type is 'text/plan'. + (mime-make-tag "text" "plain") + ))) + ;; We are only interested in TEXT. + (if (and oldtag + (not (mime-test-content-type + (mime-edit-get-contype oldtag) "text"))) + (setq oldtag nil)) + ;; Make a new tag. + (if (or (not oldtag) ;Not text + (or mime-ignore-same-text-tag + (not (string-equal oldtag newtag)))) + (progn + ;; Mark the beginning of the tag for convenience. + (push-mark (point) 'nomsg) + (insert newtag "\n") + (list pritype subtype parameters) ;New tag is created. + ) + ;; Restore previous point. + (goto-char current) + nil ;Nothing is created. + ) + )) + +(defun mime-edit-insert-binary-file (file &optional encoding) + "Insert binary FILE at point. +Optional argument ENCODING specifies an encoding method such as base64." + (let* ((tagend (1- (point))) ;End of the tag + (hide-p (and mime-auto-hide-body + (stringp encoding) + (not + (let ((en (downcase encoding))) + (or (string-equal en "7bit") + (string-equal en "8bit") + (string-equal en "binary") + ))))) + ) + (save-restriction + (narrow-to-region tagend (point)) + (mime-insert-encoded-file file encoding) + (if hide-p + (progn + (invisible-region (point-min) (point-max)) + (goto-char (point-max)) + ) + (goto-char (point-max)) + )) + (or hide-p + (looking-at mime-edit-tag-regexp) + (= (point)(point-max)) + (mime-edit-insert-tag "text" "plain") + ) + ;; Define encoding even if it is 7bit. + (if (stringp encoding) + (save-excursion + (goto-char tagend) ; Make sure which line the tag is on. + (mime-edit-define-encoding encoding) + )) + )) + + +;; Commands work on a current message flagment. + +(defun mime-edit-goto-tag () + "Search for the beginning of the tagged MIME message." + (let ((current (point))) + (if (looking-at mime-edit-tag-regexp) + t + ;; At first, go to the end. + (cond ((re-search-forward mime-edit-beginning-tag-regexp nil t) + (goto-char (1- (match-beginning 0))) ;For multiline tag + ) + (t + (goto-char (point-max)) + )) + ;; Then search for the beginning. + (re-search-backward mime-edit-end-tag-regexp nil t) + (or (looking-at mime-edit-beginning-tag-regexp) + ;; Restore previous point. + (progn + (goto-char current) + nil + )) + ))) + +(defun mime-edit-content-beginning () + "Return the point of the beginning of content." + (save-excursion + (let ((beg (save-excursion + (beginning-of-line) (point)))) + (if (mime-edit-goto-tag) + (let ((top (point))) + (goto-char (match-end 0)) + (if (and (= beg top) + (= (following-char) ?\^M)) + (point) + (forward-line 1) + (point))) + ;; Default text/plain tag. + (goto-char (point-min)) + (re-search-forward + (concat "\n" (regexp-quote mail-header-separator) + (if mime-ignore-preceding-spaces + "[ \t\n]*\n" "\n")) nil 'move) + (point)) + ))) + +(defun mime-edit-content-end () + "Return the point of the end of content." + (save-excursion + (if (mime-edit-goto-tag) + (progn + (goto-char (match-end 0)) + (if (invisible-p (point)) + (next-visible-point (point)) + ;; Move to the end of this text. + (if (re-search-forward mime-edit-tag-regexp nil 'move) + ;; Don't forget a multiline tag. + (goto-char (match-beginning 0)) + ) + (point) + )) + ;; Assume the message begins with text/plain. + (goto-char (mime-edit-content-beginning)) + (if (re-search-forward mime-edit-tag-regexp nil 'move) + ;; Don't forget a multiline tag. + (goto-char (match-beginning 0))) + (point)) + )) + +(defun mime-edit-define-charset (charset) + "Set charset of current tag to CHARSET." + (save-excursion + (if (mime-edit-goto-tag) + (let ((tag (buffer-substring (match-beginning 0) (match-end 0)))) + (delete-region (match-beginning 0) (match-end 0)) + (insert + (mime-create-tag + (mime-edit-set-parameter + (mime-edit-get-contype tag) + "charset" + (let ((comment (get charset 'mime-charset-comment))) + (if comment + (concat (upcase (symbol-name charset)) " (" comment ")") + (upcase (symbol-name charset))))) + (mime-edit-get-encoding tag))) + )))) + +(defun mime-edit-define-encoding (encoding) + "Set encoding of current tag to ENCODING." + (save-excursion + (if (mime-edit-goto-tag) + (let ((tag (buffer-substring (match-beginning 0) (match-end 0)))) + (delete-region (match-beginning 0) (match-end 0)) + (insert (mime-create-tag (mime-edit-get-contype tag) encoding))) + ))) + +(defun mime-edit-choose-charset () + "Choose charset of a text following current point." + (detect-mime-charset-region (point) (mime-edit-content-end)) + ) + +(defun mime-make-text-tag (&optional subtype) + "Make a tag for a text after current point. +Subtype of text type can be specified by an optional argument SUBTYPE. +Otherwise, it is obtained from mime-content-types." + (let* ((pritype "text") + (subtype (or subtype + (car (car (cdr (assoc pritype mime-content-types))))))) + ;; Charset should be defined later. + (mime-make-tag pritype subtype))) + + +;; Tag handling functions + +(defun mime-make-tag (pritype subtype &optional parameters encoding) + "Make a tag of MIME message of PRITYPE, SUBTYPE and optional PARAMETERS." + (mime-create-tag (concat (or pritype "") "/" (or subtype "") + (or parameters "")) + encoding)) + +(defun mime-create-tag (contype &optional encoding) + "Make a tag with CONTENT-TYPE and optional ENCODING." + (format (if encoding mime-tag-format-with-encoding mime-tag-format) + contype encoding)) + +(defun mime-edit-get-contype (tag) + "Return Content-Type (including parameters) of TAG." + (and (stringp tag) + (or (string-match mime-edit-single-part-tag-regexp tag) + (string-match mime-edit-multipart-beginning-regexp tag) + (string-match mime-edit-multipart-end-regexp tag) + ) + (substring tag (match-beginning 1) (match-end 1)) + )) + +(defun mime-edit-get-encoding (tag) + "Return encoding of TAG." + (and (stringp tag) + (string-match mime-edit-single-part-tag-regexp tag) + (match-beginning 3) + (not (= (match-beginning 3) (match-end 3))) + (substring tag (match-beginning 3) (match-end 3)))) + +(defun mime-get-parameter (contype parameter) + "For given CONTYPE return value for PARAMETER. +Nil if no such parameter." + (if (string-match + (concat + ";[ \t\n]*" + (regexp-quote parameter) + "[ \t\n]*=[ \t\n]*\\([^\" \t\n;]*\\|\"[^\"]*\"\\)\\([ \t\n]*;\\|$\\)") + contype) + (substring contype (match-beginning 1) (match-end 1)) + nil ;No such parameter + )) + +(defun mime-edit-set-parameter (contype parameter value) + "For given CONTYPE set PARAMETER to VALUE." + (let (ctype opt-fields) + (if (string-match "\n[^ \t\n\r]+:" contype) + (setq ctype (substring contype 0 (match-beginning 0)) + opt-fields (substring contype (match-beginning 0))) + (setq ctype contype) + ) + (if (string-match + (concat + ";[ \t\n]*\\(" + (regexp-quote parameter) + "[ \t\n]*=[ \t\n]*\\([^\" \t\n;]*\\|\"[^\"]*\"\\)\\)[ \t\n]*\\(;\\|$\\)") + ctype) + ;; Change value + (concat (substring ctype 0 (match-beginning 1)) + parameter "=" value + (substring contype (match-end 1)) + opt-fields) + (concat ctype "; " parameter "=" value opt-fields) + ))) + +(defun mime-strip-parameters (contype) + "Return primary content-type and subtype without parameters for CONTYPE." + (if (string-match "^[ \t]*\\([^; \t\n]*\\)" contype) + (substring contype (match-beginning 1) (match-end 1)) nil)) + +(defun mime-test-content-type (contype type &optional subtype) + "Test if CONTYPE is a TYPE and an optional SUBTYPE." + (and (stringp contype) + (stringp type) + (string-match + (concat "^[ \t]*" (downcase type) "/" (downcase (or subtype ""))) + (downcase contype)))) + + +;; Basic functions + +(defun mime-find-file-type (file) + "Guess Content-Type, subtype, and parameters from FILE." + (let ((guess nil) + (guesses mime-file-types)) + (while (and (not guess) guesses) + (if (string-match (car (car guesses)) file) + (setq guess (cdr (car guesses)))) + (setq guesses (cdr guesses))) + guess + )) + +(defun mime-prompt-for-type (&optional default) + "Ask for Content-type." + (let ((type "")) + ;; Repeat until primary content type is specified. + (while (string-equal type "") + (setq type + (completing-read "What content type: " + mime-content-types + nil + 'require-match ;Type must be specified. + default + )) + (if (string-equal type "") + (progn + (message "Content type is required.") + (beep) + (sit-for 1) + )) + ) + type)) + +(defun mime-prompt-for-subtype (type &optional default) + "Ask for subtype of media-type TYPE." + (let ((subtypes (cdr (assoc type mime-content-types)))) + (or (and default + (assoc default subtypes)) + (setq default (car (car subtypes))) + )) + (let* ((answer + (completing-read + (if default + (concat + "What content subtype: (default " default ") ") + "What content subtype: ") + (cdr (assoc type mime-content-types)) + nil + 'require-match ;Subtype must be specified. + nil + ))) + (if (string-equal answer "") default answer))) + +(defun mime-prompt-for-parameters (pritype subtype &optional delimiter) + "Ask for Content-type parameters of Content-Type PRITYPE and SUBTYPE. +Optional DELIMITER specifies parameter delimiter (';' by default)." + (let* ((delimiter (or delimiter "; ")) + (parameters + (mapconcat + (function identity) + (delq nil + (mime-prompt-for-parameters-1 + (cdr (assoc subtype + (cdr (assoc pritype mime-content-types)))))) + delimiter + ))) + (if (and (stringp parameters) + (not (string-equal parameters ""))) + (concat delimiter parameters) + "" ;"" if no parameters + ))) + +(defun mime-prompt-for-parameters-1 (optlist) + (apply (function append) + (mapcar (function mime-prompt-for-parameter) optlist))) + +(defun mime-prompt-for-parameter (parameter) + "Ask for PARAMETER. +Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))." + (let* ((prompt (car parameter)) + (choices (mapcar (function + (lambda (e) + (if (consp e) e (list e)))) + (cdr parameter))) + (default (car (car choices))) + (answer nil)) + (if choices + (progn + (setq answer + (completing-read + (concat "What " prompt + ": (default " + (if (string-equal default "") "\"\"" default) + ") ") + choices nil nil "")) + ;; If nothing is selected, use default. + (if (string-equal answer "") + (setq answer default))) + (setq answer + (read-string (concat "What " prompt ": ")))) + (cons (if (and answer + (not (string-equal answer ""))) + (concat prompt "=" + ;; Note: control characters ignored! + (if (string-match mime-tspecials-regexp answer) + (concat "\"" answer "\"") answer))) + (mime-prompt-for-parameters-1 (cdr (assoc answer (cdr parameter))))) + )) + +(defun mime-prompt-for-encoding (default) + "Ask for Content-Transfer-Encoding." + (let (encoding) + (while (string= + (setq encoding + (completing-read + "What transfer encoding: " + (mime-encoding-alist) nil t default) + ) + "")) + encoding)) + + +;;; @ Translate the tagged MIME messages into a MIME compliant message. +;;; + +(defvar mime-edit-translate-buffer-hook + '(mime-edit-pgp-enclose-buffer + mime-edit-translate-body + mime-edit-translate-header)) + +(defun mime-edit-translate-header () + "Encode the message header into network representation." + (eword-encode-header 'code-conversion) + (run-hooks 'mime-edit-translate-header-hook) + ) + +(defun mime-edit-translate-buffer () + "Encode the tagged MIME message in current buffer in MIME compliant message." + (interactive) + (if (catch 'mime-edit-error + (save-excursion + (run-hooks 'mime-edit-translate-buffer-hook) + )) + (progn + (undo) + (error "Translation error!") + ))) + +(defun mime-edit-find-inmost () + (goto-char (point-min)) + (if (re-search-forward mime-edit-multipart-beginning-regexp nil t) + (let ((bb (match-beginning 0)) + (be (match-end 0)) + (type (buffer-substring (match-beginning 1)(match-end 1))) + end-exp eb) + (setq end-exp (format "--}-<<%s>>\n" type)) + (widen) + (if (re-search-forward end-exp nil t) + (setq eb (match-beginning 0)) + (setq eb (point-max)) + ) + (narrow-to-region be eb) + (goto-char be) + (if (re-search-forward mime-edit-multipart-beginning-regexp nil t) + (progn + (narrow-to-region (match-beginning 0)(point-max)) + (mime-edit-find-inmost) + ) + (widen) + (list type bb be eb) + )))) + +(defun mime-edit-process-multipart-1 (boundary) + (let ((ret (mime-edit-find-inmost))) + (if ret + (let ((type (car ret)) + (bb (nth 1 ret))(be (nth 2 ret)) + (eb (nth 3 ret)) + ) + (narrow-to-region bb eb) + (delete-region bb be) + (setq bb (point-min)) + (setq eb (point-max)) + (widen) + (goto-char eb) + (if (looking-at mime-edit-multipart-end-regexp) + (let ((beg (match-beginning 0)) + (end (match-end 0)) + ) + (delete-region beg end) + (or (looking-at mime-edit-beginning-tag-regexp) + (eobp) + (insert (concat (mime-make-text-tag) "\n")) + ))) + (cond ((string-equal type "quote") + (mime-edit-enquote-region bb eb) + ) + ((string-equal type "pgp-signed") + (mime-edit-sign-pgp-mime bb eb boundary) + ) + ((string-equal type "pgp-encrypted") + (mime-edit-encrypt-pgp-mime bb eb boundary) + ) + ((string-equal type "kazu-signed") + (mime-edit-sign-pgp-kazu bb eb boundary) + ) + ((string-equal type "kazu-encrypted") + (mime-edit-encrypt-pgp-kazu bb eb boundary) + ) + (t + (setq boundary + (nth 2 (mime-edit-translate-region bb eb + boundary t))) + (goto-char bb) + (insert + (format "--[[multipart/%s; + boundary=\"%s\"][7bit]]\n" + type boundary)) + )) + boundary)))) + +(defun mime-edit-enquote-region (beg end) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (goto-char beg) + (while (re-search-forward mime-edit-single-part-tag-regexp nil t) + (let ((tag (buffer-substring (match-beginning 0)(match-end 0)))) + (replace-match (concat "- " (substring tag 1))) + ))))) + +(defun mime-edit-dequote-region (beg end) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (goto-char beg) + (while (re-search-forward + mime-edit-quoted-single-part-tag-regexp nil t) + (let ((tag (buffer-substring (match-beginning 0)(match-end 0)))) + (replace-match (concat "-" (substring tag 2))) + ))))) + +(defun mime-edit-sign-pgp-mime (beg end boundary) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (let* ((ret + (mime-edit-translate-region beg end boundary)) + (ctype (car ret)) + (encoding (nth 1 ret)) + (pgp-boundary (concat "pgp-sign-" boundary))) + (goto-char beg) + (insert (format "Content-Type: %s\n" ctype)) + (if encoding + (insert (format "Content-Transfer-Encoding: %s\n" encoding)) + ) + (insert "\n") + (or (as-binary-process + (funcall (pgp-function 'mime-sign) + (point-min)(point-max) nil nil pgp-boundary)) + (throw 'mime-edit-error 'pgp-error) + ) + )))) + +(defvar mime-edit-encrypt-recipient-fields-list '("To" "cc")) + +(defun mime-edit-make-encrypt-recipient-header () + (let* ((names mime-edit-encrypt-recipient-fields-list) + (values + (std11-field-bodies (cons "From" names) + nil mail-header-separator)) + (from (prog1 + (car values) + (setq values (cdr values)))) + (header (and (stringp from) + (if (string-equal from "") + "" + (format "From: %s\n" from) + ))) + recipients) + (while (and names values) + (let ((name (car names)) + (value (car values)) + ) + (and (stringp value) + (or (string-equal value "") + (progn + (setq header (concat header name ": " value "\n") + recipients (if recipients + (concat recipients " ," value) + value)) + )))) + (setq names (cdr names) + values (cdr values)) + ) + (vector from recipients header) + )) + +(defun mime-edit-encrypt-pgp-mime (beg end boundary) + (save-excursion + (save-restriction + (let (from recipients header) + (let ((ret (mime-edit-make-encrypt-recipient-header))) + (setq from (aref ret 0) + recipients (aref ret 1) + header (aref ret 2)) + ) + (narrow-to-region beg end) + (let* ((ret + (mime-edit-translate-region beg end boundary)) + (ctype (car ret)) + (encoding (nth 1 ret)) + (pgp-boundary (concat "pgp-" boundary))) + (goto-char beg) + (insert header) + (insert (format "Content-Type: %s\n" ctype)) + (if encoding + (insert (format "Content-Transfer-Encoding: %s\n" encoding)) + ) + (insert "\n") + (or (funcall (pgp-function 'encrypt) + recipients (point-min) (point-max) from) + (throw 'mime-edit-error 'pgp-error) + ) + (goto-char beg) + (insert (format "--[[multipart/encrypted; + boundary=\"%s\"; + protocol=\"application/pgp-encrypted\"][7bit]] +--%s +Content-Type: application/pgp-encrypted + +--%s +Content-Type: application/octet-stream +Content-Transfer-Encoding: 7bit + +" pgp-boundary pgp-boundary pgp-boundary)) + (goto-char (point-max)) + (insert (format "\n--%s--\n" pgp-boundary)) + ))))) + +(defun mime-edit-sign-pgp-kazu (beg end boundary) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (let* ((ret + (mime-edit-translate-region beg end boundary)) + (ctype (car ret)) + (encoding (nth 1 ret))) + (goto-char beg) + (insert (format "Content-Type: %s\n" ctype)) + (if encoding + (insert (format "Content-Transfer-Encoding: %s\n" encoding)) + ) + (insert "\n") + (or (as-binary-process + (funcall (pgp-function 'traditional-sign) + beg (point-max))) + (throw 'mime-edit-error 'pgp-error) + ) + (goto-char beg) + (insert + "--[[application/pgp; format=mime][7bit]]\n") + )) + )) + +(defun mime-edit-encrypt-pgp-kazu (beg end boundary) + (save-excursion + (let (recipients header) + (let ((ret (mime-edit-make-encrypt-recipient-header))) + (setq recipients (aref ret 1) + header (aref ret 2)) + ) + (save-restriction + (narrow-to-region beg end) + (let* ((ret + (mime-edit-translate-region beg end boundary)) + (ctype (car ret)) + (encoding (nth 1 ret))) + (goto-char beg) + (insert header) + (insert (format "Content-Type: %s\n" ctype)) + (if encoding + (insert (format "Content-Transfer-Encoding: %s\n" encoding)) + ) + (insert "\n") + (or (as-binary-process + (funcall (pgp-function 'encrypt) + recipients beg (point-max) nil 'maybe) + ) + (throw 'mime-edit-error 'pgp-error) + ) + (goto-char beg) + (insert + "--[[application/pgp; format=mime][7bit]]\n") + )) + ))) + +(defsubst replace-space-with-underline (str) + (mapconcat (function + (lambda (arg) + (char-to-string + (if (eq arg ?\ ) + ?_ + arg)))) str "") + ) + +(defun mime-edit-make-boundary () + (concat mime-multipart-boundary "_" + (replace-space-with-underline (current-time-string)) + )) + +(defun mime-edit-translate-body () + "Encode the tagged MIME body in current buffer in MIME compliant message." + (interactive) + (save-excursion + (let ((boundary (mime-edit-make-boundary)) + (i 1) + ret) + (while (mime-edit-process-multipart-1 + (format "%s-%d" boundary i)) + (setq i (1+ i)) + ) + (save-restriction + ;; We are interested in message body. + (let* ((beg + (progn + (goto-char (point-min)) + (re-search-forward + (concat "\n" (regexp-quote mail-header-separator) + (if mime-ignore-preceding-spaces + "[ \t\n]*\n" "\n")) nil 'move) + (point))) + (end + (progn + (goto-char (point-max)) + (and mime-ignore-trailing-spaces + (re-search-backward "[^ \t\n]\n" beg t) + (forward-char 1)) + (point)))) + (setq ret (mime-edit-translate-region + beg end + (format "%s-%d" boundary i))) + )) + (mime-edit-dequote-region (point-min)(point-max)) + (let ((contype (car ret)) ;Content-Type + (encoding (nth 1 ret)) ;Content-Transfer-Encoding + ) + ;; Insert User-Agent field + (and mime-edit-insert-user-agent-field + (or (mail-position-on-field "User-Agent") + (insert mime-edit-user-agent-value) + )) + ;; Make primary MIME headers. + (or (mail-position-on-field "MIME-Version") + (insert mime-edit-mime-version-value)) + ;; Remove old Content-Type and other fields. + (save-restriction + (goto-char (point-min)) + (search-forward (concat "\n" mail-header-separator "\n") nil t) + (narrow-to-region (point-min) (point)) + (goto-char (point-min)) + (mime-delete-field "Content-Type") + (mime-delete-field "Content-Transfer-Encoding")) + ;; Then, insert Content-Type and Content-Transfer-Encoding fields. + (mail-position-on-field "Content-Type") + (insert contype) + (if encoding + (progn + (mail-position-on-field "Content-Transfer-Encoding") + (insert encoding))) + )))) + +(defun mime-edit-translate-single-part-tag (boundary &optional prefix) + "Translate single-part-tag to MIME header." + (if (re-search-forward mime-edit-single-part-tag-regexp nil t) + (let* ((beg (match-beginning 0)) + (end (match-end 0)) + (tag (buffer-substring beg end))) + (delete-region beg end) + (let ((contype (mime-edit-get-contype tag)) + (encoding (mime-edit-get-encoding tag))) + (insert (concat prefix "--" boundary "\n")) + (save-restriction + (narrow-to-region (point)(point)) + (insert "Content-Type: " contype "\n") + (if encoding + (insert "Content-Transfer-Encoding: " encoding "\n")) + (eword-encode-header) + ) + (cons (and contype + (downcase contype)) + (and encoding + (downcase encoding)))) + ))) + +(defun mime-edit-translate-region (beg end &optional boundary multipart) + (or boundary + (setq boundary (mime-edit-make-boundary)) + ) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (let ((tag nil) ;MIME tag + (contype nil) ;Content-Type + (encoding nil) ;Content-Transfer-Encoding + (nparts 0)) ;Number of body parts + ;; Normalize the body part by inserting appropriate message + ;; tags for every message contents. + (mime-edit-normalize-body) + ;; Counting the number of Content-Type. + (goto-char (point-min)) + (while (re-search-forward mime-edit-single-part-tag-regexp nil t) + (setq nparts (1+ nparts))) + ;; Begin translation. + (cond + ((and (<= nparts 1)(not multipart)) + ;; It's a singular message. + (goto-char (point-min)) + (while (re-search-forward + mime-edit-single-part-tag-regexp nil t) + (setq tag + (buffer-substring (match-beginning 0) (match-end 0))) + (delete-region (match-beginning 0) (1+ (match-end 0))) + (setq contype (mime-edit-get-contype tag)) + (setq encoding (mime-edit-get-encoding tag)) + )) + (t + ;; It's a multipart message. + (goto-char (point-min)) + (let ((prio mime-content-transfer-encoding-priority-list) + part-info nprio) + (when (setq part-info + (mime-edit-translate-single-part-tag boundary)) + (and (setq nprio (member (cdr part-info) prio)) + (setq prio nprio)) + (while (setq part-info + (mime-edit-translate-single-part-tag boundary "\n")) + (and (setq nprio (member (cdr part-info) prio)) + (setq prio nprio)))) + ;; Define Content-Type as "multipart/mixed". + (setq contype + (concat "multipart/mixed;\n boundary=\"" boundary "\"")) + (setq encoding (car prio)) + ;; Insert the trailer. + (goto-char (point-max)) + (insert "\n--" boundary "--\n") + ))) + (list contype encoding boundary nparts) + )))) + +(defun mime-edit-normalize-body () + "Normalize the body part by inserting appropriate message tags." + ;; Insert the first MIME tags if necessary. + (goto-char (point-min)) + (if (not (looking-at mime-edit-single-part-tag-regexp)) + (insert (mime-make-text-tag) "\n")) + ;; Check each tag, and add new tag or correct it if necessary. + (goto-char (point-min)) + (while (re-search-forward mime-edit-single-part-tag-regexp nil t) + (let* ((tag (buffer-substring (match-beginning 0) (match-end 0))) + (contype (mime-edit-get-contype tag)) + (charset (mime-get-parameter contype "charset")) + (encoding (mime-edit-get-encoding tag))) + ;; Remove extra whitespaces after the tag. + (if (looking-at "[ \t]+$") + (delete-region (match-beginning 0) (match-end 0))) + (let ((beg (point)) + (end (mime-edit-content-end)) + ) + (if (= end (point-max)) + nil + (goto-char end) + (or (looking-at mime-edit-beginning-tag-regexp) + (eobp) + (insert (mime-make-text-tag) "\n") + )) + (visible-region beg end) + (goto-char beg) + ) + (cond + ((mime-test-content-type contype "message") + ;; Content-type "message" should be sent as is. + (forward-line 1) + ) + ((mime-test-content-type contype "text") + ;; Define charset for text if necessary. + (setq charset (if charset + (intern (downcase charset)) + (mime-edit-choose-charset))) + (mime-edit-define-charset charset) + (cond ((string-equal contype "text/x-rot13-47-48") + (save-excursion + (forward-line) + (mule-caesar-region (point) (mime-edit-content-end)) + )) + ((string-equal contype "text/enriched") + (save-excursion + (let ((beg (progn + (forward-line) + (point))) + (end (mime-edit-content-end)) + ) + ;; Patch for hard newlines + ;; (save-excursion + ;; (goto-char beg) + ;; (while (search-forward "\n" end t) + ;; (put-text-property (match-beginning 0) + ;; (point) + ;; 'hard t))) + ;; End patch for hard newlines + (enriched-encode beg end nil) + (goto-char beg) + (if (search-forward "\n\n") + (delete-region beg (match-end 0)) + ) + )))) + ;; Point is now on current tag. + ;; Define encoding and encode text if necessary. + (or encoding ;Encoding is not specified. + (let* ((encoding + (let (bits conv) + (let ((ret (cdr (assq charset mime-charset-type-list)))) + (if ret + (setq bits (car ret) + conv (nth 1 ret)) + (setq bits 8 + conv "quoted-printable"))) + (if (<= bits mime-transfer-level) + (mime-encoding-name bits) + conv))) + (beg (mime-edit-content-beginning))) + (encode-mime-charset-region beg (mime-edit-content-end) + charset) + ;; Protect "From " in beginning of line + (save-restriction + (narrow-to-region beg (mime-edit-content-end)) + (goto-char beg) + (let (case-fold-search) + (if (re-search-forward "^From " nil t) + (unless encoding + (if (memq charset '(iso-2022-jp + iso-2022-jp-2 + iso-2022-int-1 + x-ctext)) + (while (progn + (replace-match "\e(BFrom ") + (re-search-forward "^From " nil t) + )) + (setq encoding "quoted-printable") + ))))) + ;; canonicalize line break code + (or (member encoding '(nil "7bit" "8bit" "quoted-printable")) + (save-restriction + (narrow-to-region beg (mime-edit-content-end)) + (goto-char beg) + (while (re-search-forward "\\(\\=\\|[^\r]\\)\n" nil t) + (replace-match "\\1\r\n")))) + (goto-char beg) + (mime-encode-region beg (mime-edit-content-end) + (or encoding "7bit")) + (mime-edit-define-encoding encoding) + )) + (goto-char (mime-edit-content-end)) + ) + ((null encoding) ;Encoding is not specified. + ;; Application, image, audio, video, and any other + ;; unknown content-type without encoding should be + ;; encoded. + (let* ((encoding "base64") ;Encode in BASE64 by default. + (beg (mime-edit-content-beginning)) + (end (mime-edit-content-end))) + (mime-encode-region beg end encoding) + (mime-edit-define-encoding encoding)) + (forward-line 1) + )) + ))) + +(defun mime-delete-field (field) + "Delete header FIELD." + (let ((regexp (format "^%s:[ \t]*" field))) + (goto-char (point-min)) + (while (re-search-forward regexp nil t) + (delete-region (match-beginning 0) + (progn (forward-line 1) (point))) + ))) + + +;;; +;;; Platform dependent functions +;;; + +;; Sun implementations + +(defun mime-edit-voice-recorder-for-sun (encoding) + "Record voice in a buffer using Sun audio device, +and insert data encoded as ENCODING." + (message "Start the recording on %s. Type C-g to finish the recording..." + (system-name)) + (mime-insert-encoded-file "/dev/audio" encoding) + ) + + +;;; @ Other useful commands. +;;; + +;; Message forwarding commands as content-type "message/rfc822". + +(defun mime-edit-insert-message (&optional message) + (interactive) + (let ((inserter (cdr (assq major-mode mime-edit-message-inserter-alist)))) + (if (and inserter (fboundp inserter)) + (progn + (mime-edit-insert-tag "message" "rfc822") + (funcall inserter message) + ) + (message "Sorry, I don't have message inserter for your MUA.") + ))) + +(defun mime-edit-insert-mail (&optional message) + (interactive) + (let ((inserter (cdr (assq major-mode mime-edit-mail-inserter-alist)))) + (if (and inserter (fboundp inserter)) + (progn + (mime-edit-insert-tag "message" "rfc822") + (funcall inserter message) + ) + (message "Sorry, I don't have mail inserter for your MUA.") + ))) + +(defun mime-edit-inserted-message-filter () + (save-excursion + (save-restriction + (let ((header-start (point)) + (case-fold-search t) + beg end) + ;; for Emacs 18 + ;; (if (re-search-forward "^$" (marker-position (mark-marker))) + (if (re-search-forward "^$" (mark t)) + (narrow-to-region header-start (match-beginning 0)) + ) + (goto-char header-start) + (while (and (re-search-forward + mime-edit-yank-ignored-field-regexp nil t) + (setq beg (match-beginning 0)) + (setq end (1+ (std11-field-end))) + ) + (delete-region beg end) + ) + )))) + + +;;; @ multipart enclosure +;;; + +(defun mime-edit-enclose-region-internal (type beg end) + (save-excursion + (goto-char beg) + (save-restriction + (narrow-to-region beg end) + (insert (format "--<<%s>>-{\n" type)) + (goto-char (point-max)) + (insert (format "--}-<<%s>>\n" type)) + (goto-char (point-max)) + ) + (or (looking-at mime-edit-beginning-tag-regexp) + (eobp) + (insert (mime-make-text-tag) "\n") + ) + )) + +(defun mime-edit-enclose-quote-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'quote beg end) + ) + +(defun mime-edit-enclose-mixed-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'mixed beg end) + ) + +(defun mime-edit-enclose-parallel-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'parallel beg end) + ) + +(defun mime-edit-enclose-digest-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'digest beg end) + ) + +(defun mime-edit-enclose-alternative-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'alternative beg end) + ) + +(defun mime-edit-enclose-pgp-signed-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'pgp-signed beg end) + ) + +(defun mime-edit-enclose-pgp-encrypted-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'pgp-encrypted beg end) + ) + +(defun mime-edit-enclose-kazu-signed-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'kazu-signed beg end) + ) + +(defun mime-edit-enclose-kazu-encrypted-region (beg end) + (interactive "*r") + (mime-edit-enclose-region-internal 'kazu-encrypted beg end) + ) + +(defun mime-edit-insert-key (&optional arg) + "Insert a pgp public key." + (interactive "P") + (mime-edit-insert-tag "application" "pgp-keys") + (mime-edit-define-encoding "7bit") + (funcall (pgp-function 'insert-key)) + ) + + +;;; @ flag setting +;;; + +(defun mime-edit-set-split (arg) + (interactive + (list + (y-or-n-p "Do you want to enable split? ") + )) + (setq mime-edit-split-message arg) + (if arg + (message "This message is enabled to split.") + (message "This message is not enabled to split.") + )) + +(defun mime-edit-toggle-transfer-level (&optional transfer-level) + "Toggle transfer-level is 7bit or 8bit through. + +Optional TRANSFER-LEVEL is a number of transfer-level, 7 or 8." + (interactive) + (if (numberp transfer-level) + (setq mime-transfer-level transfer-level) + (if (< mime-transfer-level 8) + (setq mime-transfer-level 8) + (setq mime-transfer-level 7) + )) + (message (format "Current transfer-level is %d bit" + mime-transfer-level)) + (setq mime-transfer-level-string + (mime-encoding-name mime-transfer-level 'not-omit)) + (force-mode-line-update) + ) + +(defun mime-edit-set-transfer-level-7bit () + (interactive) + (mime-edit-toggle-transfer-level 7) + ) + +(defun mime-edit-set-transfer-level-8bit () + (interactive) + (mime-edit-toggle-transfer-level 8) + ) + + +;;; @ pgp +;;; + +(defvar mime-edit-pgp-processing nil) +(make-variable-buffer-local 'mime-edit-pgp-processing) + +(defun mime-edit-set-sign (arg) + (interactive + (list + (y-or-n-p "Do you want to sign? ") + )) + (if arg + (progn + (setq mime-edit-pgp-processing 'sign) + (message "This message will be signed.") + ) + (if (eq mime-edit-pgp-processing 'sign) + (setq mime-edit-pgp-processing nil) + ) + (message "This message will not be signed.") + )) + +(defun mime-edit-set-encrypt (arg) + (interactive + (list + (y-or-n-p "Do you want to encrypt? ") + )) + (if arg + (progn + (setq mime-edit-pgp-processing 'encrypt) + (message "This message will be encrypt.") + ) + (if (eq mime-edit-pgp-processing 'encrypt) + (setq mime-edit-pgp-processing nil) + ) + (message "This message will not be encrypt.") + )) + +(defun mime-edit-pgp-enclose-buffer () + (let ((beg (save-excursion + (goto-char (point-min)) + (if (search-forward (concat "\n" mail-header-separator "\n")) + (match-end 0) + ))) + (end (point-max)) + ) + (if beg + (cond ((eq mime-edit-pgp-processing 'sign) + (mime-edit-enclose-pgp-signed-region beg end) + ) + ((eq mime-edit-pgp-processing 'encrypt) + (mime-edit-enclose-pgp-encrypted-region beg end) + )) + ))) + + +;;; @ split +;;; + +(defun mime-edit-insert-partial-header (fields subject + id number total separator) + (insert fields) + (insert (format "Subject: %s (%d/%d)\n" subject number total)) + (insert mime-edit-mime-version-field-for-message/partial) + (insert (format "\ +Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n" + id number total separator)) + ) + +(defun mime-edit-split-and-send + (&optional cmd lines mime-edit-message-max-length) + (interactive) + (or lines + (setq lines + (count-lines (point-min) (point-max))) + ) + (or mime-edit-message-max-length + (setq mime-edit-message-max-length + (or (cdr (assq major-mode mime-edit-message-max-lines-alist)) + mime-edit-message-default-max-lines)) + ) + (let* ((mime-edit-draft-file-name + (or (buffer-file-name) + (make-temp-name + (expand-file-name "mime-draft" temporary-file-directory)))) + (separator mail-header-separator) + (id (concat "\"" + (replace-space-with-underline (current-time-string)) + "@" (system-name) "\""))) + (run-hooks 'mime-edit-before-split-hook) + (let ((the-buf (current-buffer)) + (copy-buf (get-buffer-create " *Original Message*")) + (header (std11-header-string-except + mime-edit-split-ignored-field-regexp separator)) + (subject (mail-fetch-field "subject")) + (total (+ (/ lines mime-edit-message-max-length) + (if (> (mod lines mime-edit-message-max-length) 0) + 1))) + (command + (or cmd + (cdr + (assq major-mode + mime-edit-split-message-sender-alist)) + (function + (lambda () + (interactive) + (error "Split sender is not specified for `%s'." major-mode) + )) + )) + (mime-edit-partial-number 1) + data) + (save-excursion + (set-buffer copy-buf) + (erase-buffer) + (insert-buffer the-buf) + (save-restriction + (if (re-search-forward + (concat "^" (regexp-quote separator) "$") nil t) + (let ((he (match-beginning 0))) + (replace-match "") + (narrow-to-region (point-min) he) + )) + (goto-char (point-min)) + (while (re-search-forward mime-edit-split-blind-field-regexp nil t) + (delete-region (match-beginning 0) + (1+ (std11-field-end))) + ))) + (while (< mime-edit-partial-number total) + (erase-buffer) + (save-excursion + (set-buffer copy-buf) + (setq data (buffer-substring + (point-min) + (progn + (goto-line mime-edit-message-max-length) + (point)) + )) + (delete-region (point-min)(point)) + ) + (mime-edit-insert-partial-header + header subject id mime-edit-partial-number total separator) + (insert data) + (save-excursion + (message (format "Sending %d/%d..." + mime-edit-partial-number total)) + (call-interactively command) + (message (format "Sending %d/%d... done" + mime-edit-partial-number total)) + ) + (setq mime-edit-partial-number + (1+ mime-edit-partial-number)) + ) + (erase-buffer) + (save-excursion + (set-buffer copy-buf) + (setq data (buffer-string)) + (erase-buffer) + ) + (mime-edit-insert-partial-header + header subject id mime-edit-partial-number total separator) + (insert data) + (save-excursion + (message (format "Sending %d/%d..." + mime-edit-partial-number total)) + (message (format "Sending %d/%d... done" + mime-edit-partial-number total)) + ) + ))) + +(defun mime-edit-maybe-split-and-send (&optional cmd) + (interactive) + (run-hooks 'mime-edit-before-send-hook) + (let ((mime-edit-message-max-length + (or (cdr (assq major-mode mime-edit-message-max-lines-alist)) + mime-edit-message-default-max-lines)) + (lines (count-lines (point-min) (point-max))) + ) + (if (and (> lines mime-edit-message-max-length) + mime-edit-split-message) + (mime-edit-split-and-send cmd lines mime-edit-message-max-length) + ))) + + +;;; @ preview message +;;; + +(defvar mime-edit-buffer nil) ; buffer local variable + +(defun mime-edit-preview-message () + "preview editing MIME message." + (interactive) + (let* ((str (buffer-string)) + (separator mail-header-separator) + (the-buf (current-buffer)) + (buf-name (buffer-name)) + (temp-buf-name (concat "*temp-article:" buf-name "*")) + (buf (get-buffer temp-buf-name)) + ) + (if buf + (progn + (switch-to-buffer buf) + (erase-buffer) + ) + (setq buf (get-buffer-create temp-buf-name)) + (switch-to-buffer buf) + ) + (insert str) + (setq major-mode 'mime-temp-message-mode) + (make-local-variable 'mail-header-separator) + (setq mail-header-separator separator) + (make-local-variable 'mime-edit-buffer) + (setq mime-edit-buffer the-buf) + + (run-hooks 'mime-edit-translate-hook) + (mime-edit-translate-buffer) + (goto-char (point-min)) + (if (re-search-forward + (concat "^" (regexp-quote separator) "$")) + (replace-match "") + ) + (mime-view-buffer) + )) + +(defun mime-edit-quitting-method () + "Quitting method for mime-view." + (let ((temp mime-raw-buffer) + buf) + (mime-preview-kill-buffer) + (set-buffer temp) + (setq buf mime-edit-buffer) + (kill-buffer temp) + (switch-to-buffer buf) + )) + +(set-alist 'mime-preview-quitting-method-alist + 'mime-temp-message-mode + #'mime-edit-quitting-method) + + +;;; @ edit again +;;; + +(defvar mime-edit-again-ignored-field-regexp + (concat "^\\(" "Content-.*\\|Mime-Version" + (if mime-edit-insert-user-agent-field "\\|User-Agent") + "\\):") + "Regexp for deleted header fields when `mime-edit-again' is called.") + +(defsubst eliminate-top-spaces (string) + "Eliminate top sequence of space or tab in STRING." + (if (string-match "^[ \t]+" string) + (substring string (match-end 0)) + string)) + +(defun mime-edit-decode-multipart-in-buffer (content-type not-decode-text) + (let* ((subtype (mime-content-type-subtype content-type)) + (boundary (mime-content-type-parameter content-type "boundary")) + (boundary-pat (concat "\n--" (regexp-quote boundary) "[ \t]*\n"))) + (re-search-forward boundary-pat nil t) + (let ((bb (match-beginning 0)) eb tag) + (setq tag (format "\n--<<%s>>-{\n" subtype)) + (goto-char bb) + (insert tag) + (setq bb (+ bb (length tag))) + (re-search-forward + (concat "\n--" (regexp-quote boundary) "--[ \t]*\n") + nil t) + (setq eb (match-beginning 0)) + (replace-match (format "--}-<<%s>>\n" subtype)) + (save-restriction + (narrow-to-region bb eb) + (goto-char (point-min)) + (while (re-search-forward boundary-pat nil t) + (let ((beg (match-beginning 0)) + end) + (delete-region beg (match-end 0)) + (save-excursion + (if (re-search-forward boundary-pat nil t) + (setq end (match-beginning 0)) + (setq end (point-max)) + ) + (save-restriction + (narrow-to-region beg end) + (mime-edit-decode-message-in-buffer + (if (eq subtype 'digest) + (eval-when-compile + (make-mime-content-type 'message 'rfc822)) + ) + not-decode-text) + (goto-char (point-max)) + )))) + )) + (goto-char (point-min)) + (or (= (point-min) 1) + (delete-region (point-min) + (if (search-forward "\n\n" nil t) + (match-end 0) + (point-min) + ))) + )) + +(defun mime-edit-decode-single-part-in-buffer (content-type not-decode-text) + (let* ((type (mime-content-type-primary-type content-type)) + (subtype (mime-content-type-subtype content-type)) + (ctype (format "%s/%s" type subtype)) + charset + (pstr (let ((bytes (+ 14 (length ctype)))) + (mapconcat (function + (lambda (attr) + (if (string= (car attr) "charset") + (progn + (setq charset (cdr attr)) + "") + (let* ((str (concat (car attr) + "=" (cdr attr))) + (bs (length str))) + (setq bytes (+ bytes bs 2)) + (if (< bytes 76) + (concat "; " str) + (setq bytes (+ bs 1)) + (concat ";\n " str) + ) + )))) + (mime-content-type-parameters content-type) ""))) + encoding + encoded + (limit (save-excursion + (if (search-forward "\n\n" nil t) + (1- (point)))))) + (save-excursion + (if (re-search-forward + "^Content-Transfer-Encoding:" limit t) + (let ((beg (match-beginning 0)) + (hbeg (match-end 0)) + (end (std11-field-end limit))) + (setq encoding + (downcase + (eliminate-top-spaces + (std11-unfold-string + (buffer-substring hbeg end))))) + (if (or charset (eq type 'text)) + (progn + (delete-region beg (1+ end)) + (goto-char (point-min)) + (if (search-forward "\n\n" nil t) + (progn + (mime-decode-region + (match-end 0)(point-max) encoding) + (setq encoded t + encoding nil) + ))))))) + (if (or encoded (not not-decode-text)) + (decode-mime-charset-region (point-min)(point-max) + (or charset default-mime-charset)) + ) + (let ((he (if (re-search-forward "^$" nil t) + (match-end 0) + (point-min) + ))) + (if (and (eq type 'text) + (eq subtype 'x-rot13-47-48)) + (mule-caesar-region he (point-max)) + ) + (if (= (point-min) 1) + (progn + (goto-char he) + (insert + (concat "\n" + (mime-create-tag + (format "%s/%s%s" type subtype pstr) + encoding))) + ) + (delete-region (point-min) he) + (insert + (mime-create-tag (format "%s/%s%s" type subtype pstr) + encoding)) + )) + )) + +;;;###autoload +(defun mime-edit-decode-message-in-buffer (&optional default-content-type + not-decode-text) + (save-excursion + (goto-char (point-min)) + (let ((ctl (or (mime-read-Content-Type) + default-content-type))) + (if ctl + (let ((type (mime-content-type-primary-type ctl))) + (cond + ((and (eq type 'application) + (eq (mime-content-type-subtype ctl) 'pgp-signature)) + (delete-region (point-min)(point-max)) + ) + ((eq type 'multipart) + (mime-edit-decode-multipart-in-buffer ctl not-decode-text) + ) + (t + (mime-edit-decode-single-part-in-buffer ctl not-decode-text) + ))) + (or not-decode-text + (decode-mime-charset-region (point-min) (point-max) + default-mime-charset)) + ) + (save-restriction + (std11-narrow-to-header) + (goto-char (point-min)) + (while (re-search-forward mime-edit-again-ignored-field-regexp nil t) + (delete-region (match-beginning 0) (1+ (std11-field-end))) + )) + (mime-decode-header-in-buffer (not not-decode-text)) + ))) + +;;;###autoload +(defun mime-edit-again (&optional not-decode-text no-separator not-turn-on) + "Convert current buffer to MIME-Edit buffer and turn on MIME-Edit mode. +Content-Type and Content-Transfer-Encoding header fields will be +converted to MIME-Edit tags." + (interactive) + (goto-char (point-min)) + (if (search-forward + (concat "\n" (regexp-quote mail-header-separator) "\n") + nil t) + (replace-match "\n\n") + ) + (mime-edit-decode-message-in-buffer nil not-decode-text) + (goto-char (point-min)) + (or no-separator + (and (re-search-forward "^$") + (replace-match mail-header-separator) + )) + (or not-turn-on + (turn-on-mime-edit) + )) + + +;;; @ end +;;; + +(provide 'mime-edit) + +(run-hooks 'mime-edit-load-hook) + +;;; mime-edit.el ends here diff --git a/mime-image.el b/mime-image.el new file mode 100644 index 0000000..d5e4aa0 --- /dev/null +++ b/mime-image.el @@ -0,0 +1,177 @@ +;;; mime-image.el --- mime-view filter to display images + +;; Copyright (C) 1995,1996,1997,1998 MORIOKA Tomohiko +;; Copyright (C) 1996 Dan Rich + +;; Author: MORIOKA Tomohiko +;; Dan Rich +;; Maintainer: MORIOKA Tomohiko +;; Created: 1995/12/15 +;; Renamed: 1997/2/21 from tm-image.el + +;; Keywords: image, picture, X-Face, MIME, multimedia, mail, news + +;; This file is part of SEMI (Showy Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU XEmacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: +;; If you use this program with MULE, please install +;; etl8x16-bitmap.bdf font included in tl package. + +;;; Code: + +(require 'mime-view) +(require 'alist) + +(cond ((featurep 'xemacs) + (require 'images) + + (defun-maybe image-inline-p (format) + (or (memq format image-native-formats) + (find-if (function + (lambda (native) + (image-converter-chain format native) + )) + image-native-formats) + )) + + (image-register-netpbm-utilities) + (image-register-converter 'pic 'ppm "pictoppm") + (image-register-converter 'mag 'ppm "magtoppm") + + (defun bitmap-insert-xbm-file (file) + (let ((gl (make-glyph (list (cons 'x file)))) + (e (make-extent (point) (point))) + ) + (set-extent-end-glyph e gl) + )) + + ;; + ;; X-Face + ;; + (autoload 'highlight-headers "highlight-headers") + + (defun mime-preview-x-face-function-use-highlight-headers () + (highlight-headers (point-min) (re-search-forward "^$" nil t) t) + ) + + (add-hook 'mime-display-header-hook + 'mime-preview-x-face-function-use-highlight-headers) + + ) + ((featurep 'mule) + ;; for MULE 2.* or mule merged EMACS + (require 'x-face-mule) + + (defvar image-native-formats '(xbm)) + + (defun-maybe image-inline-p (format) + (memq format image-native-formats) + ) + + (defun-maybe image-normalize (format data) + (and (eq format 'xbm) + (vector 'xbm ':data data) + )) + + ;; + ;; X-Face + ;; + (if (exec-installed-p uncompface-program exec-path) + (add-hook 'mime-display-header-hook + 'x-face-decode-message-header) + ) + )) + +(or (fboundp 'image-invalid-glyph-p) + (defsubst image-invalid-glyph-p (glyph) + (or (null (aref glyph 0)) + (null (aref glyph 2)) + (equal (aref glyph 2) "") + )) + ) + +(mapcar (function + (lambda (rule) + (let ((type (car rule)) + (subtype (nth 1 rule)) + (format (nth 2 rule))) + (if (image-inline-p format) + (ctree-set-calist-strictly + 'mime-preview-condition + (list (cons 'type type)(cons 'subtype subtype) + '(body . visible) + (cons 'body-presentation-method #'mime-display-image) + (cons 'image-format format)) + ))))) + '((image jpeg jpeg) + (image gif gif) + (image tiff tiff) + (image x-tiff tiff) + (image xbm xbm) + (image x-xbm xbm) + (image x-xpixmap xpm) + (image x-pic pic) + (image x-mag mag) + (image png png) + )) + + +;;; @ content filter for images +;;; +;; (for XEmacs 19.12 or later) + +(defun mime-display-image (entity situation) + (message "Decoding image...") + (let ((gl (image-normalize (cdr (assq 'image-format situation)) + (mime-entity-content entity)))) + (cond ((image-invalid-glyph-p gl) + (setq gl nil) + (message "Invalid glyph!") + ) + ((eq (aref gl 0) 'xbm) + (let ((xbm-file + (make-temp-name + (expand-file-name "tm" temporary-file-directory)))) + (with-temp-buffer + (insert (aref gl 2)) + (write-region (point-min)(point-max) xbm-file) + ) + (message "Decoding image...") + (bitmap-insert-xbm-file xbm-file) + (delete-file xbm-file) + ) + (message "Decoding image... done") + ) + (t + (setq gl (make-glyph gl)) + (let ((e (make-extent (point) (point)))) + (set-extent-end-glyph e gl) + ) + (message "Decoding image... done") + )) + ) + (insert "\n") + ) + + +;;; @ end +;;; + +(provide 'mime-image) + +;;; mime-image.el ends here diff --git a/mime-mc.el b/mime-mc.el new file mode 100644 index 0000000..7e5cb26 --- /dev/null +++ b/mime-mc.el @@ -0,0 +1,164 @@ +;;; mime-mc.el --- Mailcrypt interface for SEMI + +;; Copyright (C) 1996,1997,1998 MORIOKA Tomohiko + +;; Author: MORIOKA Tomohiko +;; Keywords: PGP, security, MIME, multimedia, mail, news + +;; This file is part of SEMI (Secure Emacs MIME Interface). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'mailcrypt) +(eval-and-compile (load "mc-pgp")) + +(defun mime-mc-pgp-generic-parser (result) + (let ((ret (mc-pgp-generic-parser result))) + (if (consp ret) + (vector (car ret)(cdr ret)) + ))) + +(defun mime-mc-process-region + (beg end passwd program args parser &optional buffer boundary) + (let ((obuf (current-buffer)) + (process-connection-type nil) + mybuf result rgn proc) + (unwind-protect + (progn + (setq mybuf (or buffer (generate-new-buffer " *mailcrypt temp"))) + (set-buffer mybuf) + (erase-buffer) + (set-buffer obuf) + (buffer-disable-undo mybuf) + (setq proc + (apply 'start-process "*PGP*" mybuf program args)) + (if passwd + (progn + (process-send-string proc (concat passwd "\n")) + (or mc-passwd-timeout (mc-deactivate-passwd t)))) + (process-send-region proc beg end) + (process-send-eof proc) + (while (eq 'run (process-status proc)) + (accept-process-output proc 5)) + (setq result (process-exit-status proc)) + ;; Hack to force a status_notify() in Emacs 19.29 + (delete-process proc) + (set-buffer mybuf) + (goto-char (point-max)) + (if (re-search-backward "\nProcess \\*PGP.*\n\\'" nil t) + (delete-region (match-beginning 0) (match-end 0))) + (goto-char (point-min)) + ;; CRNL -> NL + (while (search-forward "\r\n" nil t) + (replace-match "\n")) + ;; Hurm. FIXME; must get better result codes. + (if (stringp result) + (error "%s exited abnormally: '%s'" program result) + (setq rgn (funcall parser result)) + ;; If the parser found something, migrate it + (if (consp rgn) + (progn + (set-buffer obuf) + (if boundary + (save-restriction + (narrow-to-region beg end) + (goto-char beg) + (insert (format "--%s\n" boundary)) + (goto-char (point-max)) + (insert (format "\n--%s +Content-Type: application/pgp-signature +Content-Transfer-Encoding: 7bit + +" boundary)) + (insert-buffer-substring mybuf (car rgn) (cdr rgn)) + (goto-char (point-max)) + (insert (format "\n--%s--\n" boundary)) + ) + (delete-region beg end) + (goto-char beg) + (insert-buffer-substring mybuf (car rgn) (cdr rgn)) + ) + (set-buffer mybuf) + (delete-region (car rgn) (cdr rgn))))) + ;; Return nil on failure and exit code on success + (if rgn result)) + ;; Cleanup even on nonlocal exit + (if (and proc (eq 'run (process-status proc))) + (interrupt-process proc)) + (set-buffer obuf) + (or buffer (null mybuf) (kill-buffer mybuf))))) + +(defun mime-mc-pgp-sign-region (start end &optional id unclear boundary) + ;; (if (not (boundp 'mc-pgp-user-id)) + ;; (load "mc-pgp") + ;; ) + (let ((process-environment process-environment) + (buffer (get-buffer-create mc-buffer-name)) + passwd args key + (parser (function mc-pgp-generic-parser)) + (pgp-path mc-pgp-path) + ) + (setq key (mc-pgp-lookup-key (or id mc-pgp-user-id))) + (setq passwd + (mc-activate-passwd + (cdr key) + (format "PGP passphrase for %s (%s): " (car key) (cdr key)))) + (setenv "PGPPASSFD" "0") + (setq args + (cons + (if boundary + "-fbast" + "-fast") + (list "+verbose=1" "+language=en" + (format "+clearsig=%s" (if unclear "off" "on")) + "+batchmode" "-u" (cdr key)))) + (if mc-pgp-comment + (setq args (cons (format "+comment=%s" mc-pgp-comment) args)) + ) + (message "Signing as %s ..." (car key)) + (if (mime-mc-process-region + start end passwd pgp-path args parser buffer boundary) + (progn + (if boundary + (progn + (goto-char (point-min)) + (insert + (format "\ +--[[multipart/signed; protocol=\"application/pgp-signature\"; + boundary=\"%s\"; micalg=pgp-md5][7bit]]\n" boundary)) + )) + (message "Signing as %s ... Done." (car key)) + t) + nil))) + +(defun mime-mc-pgp-encrypt-region (recipients start end &optional id sign) + (let ((mc-pgp-always-sign (if (eq sign 'maybe) + mc-pgp-always-sign + 'never))) + (mc-pgp-encrypt-region + (mc-split "\\([ \t\n]*,[ \t\n]*\\)+" recipients) + start end id nil) + )) + + +;;; @ end +;;; + +(provide 'mime-mc) + +;;; mime-mc.el ends here diff --git a/mime-partial.el b/mime-partial.el new file mode 100644 index 0000000..14b3ff9 --- /dev/null +++ b/mime-partial.el @@ -0,0 +1,98 @@ +;;; mime-partial.el --- Grabbing all MIME "message/partial"s. + +;; Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc. + +;; Author: OKABE Yasuo @ Kyoto University +;; MORIOKA Tomohiko +;; Keywords: message/partial, MIME, multimedia, mail, news + +;; This file is part of SEMI (Suite of Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'mime-view) +(require 'mime-play) + +(defun mime-combine-message/partial-pieces-automatically (entity situation) + "Internal method for mime-view to combine message/partial messages +automatically." + (interactive) + (let* ((id (cdr (assoc "id" situation))) + (target (cdr (assq 'major-mode situation))) + (subject-buf (eval (cdr (assq 'summary-buffer-exp situation)))) + subject-id + (root-dir (expand-file-name + (concat "m-prts-" (user-login-name)) + temporary-file-directory)) + (request-partial-message-method + (cdr (assq 'request-partial-message-method situation))) + full-file) + (setq root-dir (concat root-dir "/" (replace-as-filename id))) + (setq full-file (concat root-dir "/FULL")) + + (if (null target) + (error "%s is not supported. Sorry." target) + ) + + ;; if you can't parse the subject line, try simple decoding method + (if (or (file-exists-p full-file) + (not (y-or-n-p "Merge partials?")) + ) + (mime-store-message/partial-piece entity situation) + (setq subject-id (mime-read-field 'Subject entity)) + (if (string-match "[0-9\n]+" subject-id) + (setq subject-id (substring subject-id 0 (match-beginning 0))) + ) + (save-excursion + (set-buffer subject-buf) + (while (search-backward subject-id nil t)) + (catch 'tag + (while t + (let* ((message + ;; request message at the cursor in Subject buffer. + (save-window-excursion + (funcall request-partial-message-method) + )) + (situation (mime-entity-situation message)) + (the-id (cdr (assoc "id" situation)))) + (when (string= the-id id) + (save-excursion + (set-buffer (mime-entity-buffer message)) + (mime-store-message/partial-piece message situation) + ) + (if (file-exists-p full-file) + (throw 'tag nil) + )) + (if (not (progn + (end-of-line) + (search-forward subject-id nil t) + )) + (error "not found") + ) + )) + ))))) + + +;;; @ end +;;; + +(provide 'mime-partial) + +(run-hooks 'mime-partial-load-hook) + +;;; mime-partial.el ends here diff --git a/mime-pgp.el b/mime-pgp.el new file mode 100644 index 0000000..fd0203a --- /dev/null +++ b/mime-pgp.el @@ -0,0 +1,254 @@ +;;; mime-pgp.el --- mime-view internal methods for PGP. + +;; Copyright (C) 1995,1996,1997,1998,1999 MORIOKA Tomohiko + +;; Author: MORIOKA Tomohiko +;; Created: 1995/12/7 +;; Renamed: 1997/2/27 from tm-pgp.el +;; Keywords: PGP, security, MIME, multimedia, mail, news + +;; This file is part of SEMI (Secure Emacs MIME Interface). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + +;; This module is based on + +;; [security-multipart] RFC 1847: "Security Multiparts for MIME: +;; Multipart/Signed and Multipart/Encrypted" by +;; Jim Galvin , Sandy Murphy , +;; Steve Crocker and +;; Ned Freed (1995/10) + +;; [PGP/MIME] RFC 2015: "MIME Security with Pretty Good Privacy +;; (PGP)" by Michael Elkins (1996/6) + +;; [PGP-kazu] draft-kazu-pgp-mime-00.txt: "PGP MIME Integration" +;; by Kazuhiko Yamamoto (1995/10; +;; expired) + +;;; Code: + +(require 'mime-play) + + +;;; @ Internal method for multipart/signed +;;; +;;; It is based on RFC 1847 (security-multipart). + +(defun mime-verify-multipart/signed (entity situation) + "Internal method to verify multipart/signed." + (mime-play-entity + (nth 1 (mime-entity-children entity)) ; entity-info of signature + (list (assq 'mode situation)) ; play-mode + )) + + +;;; @ internal method for application/pgp +;;; +;;; It is based on draft-kazu-pgp-mime-00.txt (PGP-kazu). + +(defun mime-view-application/pgp (entity situation) + (let* ((p-win (or (get-buffer-window (current-buffer)) + (get-largest-window))) + (new-name + (format "%s-%s" (buffer-name) (mime-entity-number entity))) + (mother (current-buffer)) + representation-type) + (set-buffer (get-buffer-create new-name)) + (erase-buffer) + (mime-insert-entity entity) + (cond ((progn + (goto-char (point-min)) + (re-search-forward "^-+BEGIN PGP SIGNED MESSAGE-+$" nil t)) + (funcall (pgp-function 'verify)) + (goto-char (point-min)) + (delete-region + (point-min) + (and + (re-search-forward "^-+BEGIN PGP SIGNED MESSAGE-+\n\n") + (match-end 0))) + (delete-region + (and (re-search-forward "^-+BEGIN PGP SIGNATURE-+") + (match-beginning 0)) + (point-max)) + (goto-char (point-min)) + (while (re-search-forward "^- -" nil t) + (replace-match "-") + ) + (setq representation-type (if (mime-entity-cooked-p entity) + 'cooked)) + ) + ((progn + (goto-char (point-min)) + (re-search-forward "^-+BEGIN PGP MESSAGE-+$" nil t)) + (as-binary-process (funcall (pgp-function 'decrypt))) + (goto-char (point-min)) + (delete-region (point-min) + (and + (search-forward "\n\n") + (match-end 0))) + (setq representation-type 'binary) + )) + (setq major-mode 'mime-show-message-mode) + (save-window-excursion (mime-view-buffer nil nil mother + nil representation-type)) + (set-window-buffer p-win mime-preview-buffer) + )) + + +;;; @ Internal method for application/pgp-signature +;;; +;;; It is based on RFC 2015 (PGP/MIME). + +(defvar mime-pgp-command "pgp" + "*Name of the PGP command.") + +(defvar mime-pgp-default-language 'en + "*Symbol of language for pgp. +It should be ISO 639 2 letter language code such as en, ja, ...") + +(defvar mime-pgp-good-signature-regexp-alist + '((en . "Good signature from user.*$")) + "Alist of language vs regexp to detect ``Good signature''.") + +(defvar mime-pgp-key-expected-regexp-alist + '((en . "Key matching expected Key ID \\(\\S +\\) not found")) + "Alist of language vs regexp to detect ``Key expected''.") + +(defun mime-pgp-check-signature (output-buffer orig-file) + (save-excursion + (set-buffer output-buffer) + (erase-buffer)) + (let* ((lang (or mime-pgp-default-language 'en)) + (status (call-process-region (point-min)(point-max) + mime-pgp-command + nil output-buffer nil + orig-file (format "+language=%s" lang))) + (regexp (cdr (assq lang mime-pgp-good-signature-regexp-alist)))) + (if (= status 0) + (save-excursion + (set-buffer output-buffer) + (goto-char (point-min)) + (message + (cond ((not (stringp regexp)) + "Please specify right regexp for specified language") + ((re-search-forward regexp nil t) + (buffer-substring (match-beginning 0) (match-end 0))) + (t "Bad signature"))) + )))) + +(defun mime-verify-application/pgp-signature (entity situation) + "Internal method to check PGP/MIME signature." + (let* ((entity-node-id (mime-entity-node-id entity)) + (mother (mime-entity-parent entity)) + (knum (car entity-node-id)) + (onum (if (> knum 0) + (1- knum) + (1+ knum))) + (orig-entity (nth onum (mime-entity-children mother))) + (basename (expand-file-name "tm" temporary-file-directory)) + (orig-file (make-temp-name basename)) + (sig-file (concat orig-file ".sig")) + ) + (mime-write-entity orig-entity orig-file) + (save-excursion (mime-show-echo-buffer)) + (mime-write-entity-content entity sig-file) + (or (mime-pgp-check-signature mime-echo-buffer-name orig-file) + (let (pgp-id) + (save-excursion + (set-buffer mime-echo-buffer-name) + (goto-char (point-min)) + (let ((regexp (cdr (assq (or mime-pgp-default-language 'en) + mime-pgp-key-expected-regexp-alist)))) + (cond ((not (stringp regexp)) + (message + "Please specify right regexp for specified language") + ) + ((re-search-forward regexp nil t) + (setq pgp-id + (concat "0x" (buffer-substring-no-properties + (match-beginning 1) + (match-end 1)))) + )))) + (if (and pgp-id + (y-or-n-p + (format "Key %s not found; attempt to fetch? " pgp-id)) + ) + (progn + (funcall (pgp-function 'fetch-key) (cons nil pgp-id)) + (mime-pgp-check-signature mime-echo-buffer-name orig-file) + )) + )) + (let ((other-window-scroll-buffer mime-echo-buffer-name)) + (scroll-other-window 8) + ) + (delete-file orig-file) + (delete-file sig-file) + )) + + +;;; @ Internal method for application/pgp-encrypted +;;; +;;; It is based on RFC 2015 (PGP/MIME). + +(defun mime-decrypt-application/pgp-encrypted (entity situation) + (let* ((entity-node-id (mime-entity-node-id entity)) + (mother (mime-entity-parent entity)) + (knum (car entity-node-id)) + (onum (if (> knum 0) + (1- knum) + (1+ knum))) + (orig-entity (nth onum (mime-entity-children mother)))) + (mime-view-application/pgp orig-entity situation) + )) + + +;;; @ Internal method for application/pgp-keys +;;; +;;; It is based on RFC 2015 (PGP/MIME). + +(defun mime-add-application/pgp-keys (entity situation) + (let* ((start (mime-entity-point-min entity)) + (end (mime-entity-point-max entity)) + (entity-number (mime-raw-point-to-entity-number start)) + (new-name (format "%s-%s" (buffer-name) entity-number)) + (encoding (cdr (assq 'encoding situation))) + str) + (setq str (buffer-substring start end)) + (switch-to-buffer new-name) + (setq buffer-read-only nil) + (erase-buffer) + (insert str) + (goto-char (point-min)) + (if (re-search-forward "^\n" nil t) + (delete-region (point-min) (match-end 0)) + ) + (mime-decode-region (point-min)(point-max) encoding) + (funcall (pgp-function 'snarf-keys)) + (kill-buffer (current-buffer)) + )) + + +;;; @ end +;;; + +(provide 'mime-pgp) + +(run-hooks 'mime-pgp-load-hook) + +;;; mime-pgp.el ends here diff --git a/mime-play.el b/mime-play.el new file mode 100644 index 0000000..47ea860 --- /dev/null +++ b/mime-play.el @@ -0,0 +1,773 @@ +;;; mime-play.el --- Playback processing module for mime-view.el + +;; Copyright (C) 1994,1995,1996,1997,1998,1999 Free Software Foundation, Inc. + +;; Author: MORIOKA Tomohiko +;; Created: 1995/9/26 (separated from tm-view.el) +;; Renamed: 1997/2/21 from tm-play.el +;; Keywords: MIME, multimedia, mail, news + +;; This file is part of SEMI (Secretariat of Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'mime-view) +(require 'alist) +(require 'filename) +(require 'ccl) + +(eval-when-compile + (condition-case nil + (require 'bbdb) + (error (defvar bbdb-buffer-name nil))) + ) + +(defvar mime-acting-situation-example-list nil) + +(defvar mime-acting-situation-example-list-max-size 16) + +(defun mime-save-acting-situation-examples () + (let* ((file mime-acting-situation-examples-file) + (buffer (get-buffer-create " *mime-example*"))) + (unwind-protect + (save-excursion + (set-buffer buffer) + (setq buffer-file-name file) + (erase-buffer) + (insert ";;; " (file-name-nondirectory file) "\n") + (insert "\n;; This file is generated automatically by " + mime-view-version "\n\n") + (insert ";;; Code:\n\n") + (pp `(setq mime-acting-situation-example-list + ',mime-acting-situation-example-list) + (current-buffer)) + (insert "\n;;; " + (file-name-nondirectory file) + " ends here.\n") + (save-buffer)) + (kill-buffer buffer)))) + +(add-hook 'kill-emacs-hook 'mime-save-acting-situation-examples) + +(defun mime-reduce-acting-situation-examples () + (let ((len (length mime-acting-situation-example-list)) + i ir ic j jr jc ret + dest d-i d-j + (max-sim 0) sim + min-det-ret det-ret + min-det-org det-org + min-freq freq) + (setq i 0 + ir mime-acting-situation-example-list) + (while (< i len) + (setq ic (car ir) + j 0 + jr mime-acting-situation-example-list) + (while (< j len) + (unless (= i j) + (setq jc (car jr)) + (setq ret (mime-compare-situation-with-example (car ic)(car jc)) + sim (car ret) + det-ret (+ (length (car ic))(length (car jc))) + det-org (length (cdr ret)) + freq (+ (cdr ic)(cdr jc))) + (cond ((< max-sim sim) + (setq max-sim sim + min-det-ret det-ret + min-det-org det-org + min-freq freq + d-i i + d-j j + dest (cons (cdr ret) freq)) + ) + ((= max-sim sim) + (cond ((> min-det-ret det-ret) + (setq min-det-ret det-ret + min-det-org det-org + min-freq freq + d-i i + d-j j + dest (cons (cdr ret) freq)) + ) + ((= min-det-ret det-ret) + (cond ((> min-det-org det-org) + (setq min-det-org det-org + min-freq freq + d-i i + d-j j + dest (cons (cdr ret) freq)) + ) + ((= min-det-org det-org) + (cond ((> min-freq freq) + (setq min-freq freq + d-i i + d-j j + dest (cons (cdr ret) freq)) + )) + )) + )) + )) + ) + (setq jr (cdr jr) + j (1+ j))) + (setq ir (cdr ir) + i (1+ i))) + (if (> d-i d-j) + (setq i d-i + d-i d-j + d-j i)) + (setq jr (nthcdr (1- d-j) mime-acting-situation-example-list)) + (setcdr jr (cddr jr)) + (if (= d-i 0) + (setq mime-acting-situation-example-list + (cdr mime-acting-situation-example-list)) + (setq ir (nthcdr (1- d-i) mime-acting-situation-example-list)) + (setcdr ir (cddr ir)) + ) + (if (setq ir (assoc (car dest) mime-acting-situation-example-list)) + (setcdr ir (+ (cdr ir)(cdr dest))) + (setq mime-acting-situation-example-list + (cons dest mime-acting-situation-example-list)) + ))) + + +;;; @ content decoder +;;; + +;;;###autoload +(defun mime-preview-play-current-entity (&optional ignore-examples mode) + "Play current entity. +It decodes current entity to call internal or external method. The +method is selected from variable `mime-acting-condition'. +If IGNORE-EXAMPLES (C-u prefix) is specified, this function ignores +`mime-acting-situation-example-list'. +If MODE is specified, play as it. Default MODE is \"play\"." + (interactive "P") + (let ((entity (get-text-property (point) 'mime-view-entity))) + (if entity + (let ((situation (list (cons 'mode (or mode "play"))))) + (if ignore-examples + (setq situation + (cons (cons 'ignore-examples ignore-examples) + situation))) + (mime-play-entity entity situation) + )))) + +(defun mime-sort-situation (situation) + (sort situation + #'(lambda (a b) + (let ((a-t (car a)) + (b-t (car b)) + (order '((type . 1) + (subtype . 2) + (mode . 3) + (method . 4) + (major-mode . 5) + (disposition-type . 6) + )) + a-order b-order) + (if (symbolp a-t) + (let ((ret (assq a-t order))) + (if ret + (setq a-order (cdr ret)) + (setq a-order 7) + )) + (setq a-order 8) + ) + (if (symbolp b-t) + (let ((ret (assq b-t order))) + (if ret + (setq b-order (cdr ret)) + (setq b-order 7) + )) + (setq b-order 8) + ) + (if (= a-order b-order) + (string< (format "%s" a-t)(format "%s" b-t)) + (< a-order b-order)) + ))) + ) + +(defsubst mime-delq-null-situation (situations field + &optional ignored-value) + (let (dest) + (while situations + (let* ((situation (car situations)) + (cell (assq field situation))) + (if cell + (or (eq (cdr cell) ignored-value) + (setq dest (cons situation dest)) + ))) + (setq situations (cdr situations))) + dest)) + +(defun mime-compare-situation-with-example (situation example) + (let ((example (copy-alist example)) + (match 0)) + (while situation + (let* ((cell (car situation)) + (key (car cell)) + (ecell (assoc key example))) + (when ecell + (if (equal cell ecell) + (setq match (1+ match)) + (setq example (delq ecell example)) + )) + ) + (setq situation (cdr situation)) + ) + (cons match example) + )) + +;;;###autoload +(defun mime-play-entity (entity &optional situation ignored-method) + "Play entity specified by ENTITY. +It decodes the entity to call internal or external method. The method +is selected from variable `mime-acting-condition'. If MODE is +specified, play as it. Default MODE is \"play\"." + (let (method ret) + (setq ret + (mime-delq-null-situation + (ctree-find-calist mime-acting-condition + (mime-entity-situation entity situation) + mime-view-find-every-acting-situation) + 'method ignored-method)) + (or (assq 'ignore-examples situation) + (if (cdr ret) + (let ((rest ret) + (max-score 0) + (max-escore 0) + max-examples + max-situations) + (while rest + (let ((situation (car rest)) + (examples mime-acting-situation-example-list)) + (while examples + (let* ((ret + (mime-compare-situation-with-example + situation (caar examples))) + (ret-score (car ret))) + (cond ((> ret-score max-score) + (setq max-score ret-score + max-escore (cdar examples) + max-examples (list (cdr ret)) + max-situations (list situation)) + ) + ((= ret-score max-score) + (cond ((> (cdar examples) max-escore) + (setq max-escore (cdar examples) + max-examples (list (cdr ret)) + max-situations (list situation)) + ) + ((= (cdar examples) max-escore) + (setq max-examples + (cons (cdr ret) max-examples)) + (or (member situation max-situations) + (setq max-situations + (cons situation max-situations))) + ))))) + (setq examples (cdr examples)))) + (setq rest (cdr rest))) + (when max-situations + (setq ret max-situations) + (while max-examples + (let* ((example (car max-examples)) + (cell + (assoc example mime-acting-situation-example-list))) + (if cell + (setcdr cell (1+ (cdr cell))) + (setq mime-acting-situation-example-list + (cons (cons example 0) + mime-acting-situation-example-list)) + )) + (setq max-examples (cdr max-examples)) + ))))) + (cond ((cdr ret) + (setq ret (select-menu-alist + "Methods" + (mapcar (function + (lambda (situation) + (cons + (format "%s" + (cdr (assq 'method situation))) + situation))) + ret))) + (setq ret (mime-sort-situation ret)) + (add-to-list 'mime-acting-situation-example-list (cons ret 0)) + ) + (t + (setq ret (car ret)) + )) + (setq method (cdr (assq 'method ret))) + (cond ((and (symbolp method) + (fboundp method)) + (funcall method entity ret) + ) + ((stringp method) + (mime-activate-mailcap-method entity ret) + ) + ;; ((and (listp method)(stringp (car method))) + ;; (mime-activate-external-method entity ret) + ;; ) + (t + (mime-show-echo-buffer "No method are specified for %s\n" + (mime-entity-type/subtype entity)) + )) + )) + + +;;; @ external decoder +;;; + +(defvar mime-mailcap-method-filename-alist nil) + +(defun mime-activate-mailcap-method (entity situation) + (let ((method (cdr (assoc 'method situation))) + (name (mime-entity-safe-filename entity))) + (setq name + (if (and name (not (string= name ""))) + (expand-file-name name temporary-file-directory) + (make-temp-name + (expand-file-name "EMI" temporary-file-directory)) + )) + (mime-write-entity-content entity name) + (message "External method is starting...") + (let ((process + (let ((command + (mailcap-format-command + method + (cons (cons 'filename name) situation)))) + (start-process command mime-echo-buffer-name + shell-file-name shell-command-switch command) + ))) + (set-alist 'mime-mailcap-method-filename-alist process name) + (set-process-sentinel process 'mime-mailcap-method-sentinel) + ) + )) + +(defun mime-mailcap-method-sentinel (process event) + (let ((file (cdr (assq process mime-mailcap-method-filename-alist)))) + (if (file-exists-p file) + (delete-file file) + )) + (remove-alist 'mime-mailcap-method-filename-alist process) + (message (format "%s %s" process event))) + +(defvar mime-echo-window-is-shared-with-bbdb + (module-installed-p 'bbdb) + "*If non-nil, mime-echo window is shared with BBDB window.") + +(defvar mime-echo-window-height + (function + (lambda () + (/ (window-height) 5) + )) + "*Size of mime-echo window. +It allows function or integer. If it is function, +`mime-show-echo-buffer' calls it to get height of mime-echo window. +Otherwise `mime-show-echo-buffer' uses it as height of mime-echo +window.") + +(defun mime-show-echo-buffer (&rest forms) + "Show mime-echo buffer to display MIME-playing information." + (get-buffer-create mime-echo-buffer-name) + (let ((the-win (selected-window)) + (win (get-buffer-window mime-echo-buffer-name))) + (unless win + (unless (and mime-echo-window-is-shared-with-bbdb + (condition-case nil + (setq win (get-buffer-window bbdb-buffer-name)) + (error nil))) + (select-window (get-buffer-window (or mime-preview-buffer + (current-buffer)))) + (setq win (split-window-vertically + (- (window-height) + (if (functionp mime-echo-window-height) + (funcall mime-echo-window-height) + mime-echo-window-height) + ))) + ) + (set-window-buffer win mime-echo-buffer-name) + ) + (select-window win) + (goto-char (point-max)) + (if forms + (insert (apply (function format) forms)) + ) + (select-window the-win) + )) + + +;;; @ file name +;;; + +(defvar mime-view-file-name-char-regexp "[A-Za-z0-9+_-]") + +(defvar mime-view-file-name-regexp-1 + (concat mime-view-file-name-char-regexp "+\\." + mime-view-file-name-char-regexp "+")) + +(defvar mime-view-file-name-regexp-2 + (concat (regexp-* mime-view-file-name-char-regexp) + "\\(\\." mime-view-file-name-char-regexp "+\\)*")) + +(defun mime-entity-safe-filename (entity) + (let ((filename + (or (mime-entity-filename entity) + (let ((subj + (or (mime-read-field 'Content-Description entity) + (mime-read-field 'Subject entity)))) + (if (and subj + (or (string-match mime-view-file-name-regexp-1 subj) + (string-match mime-view-file-name-regexp-2 subj))) + (substring subj (match-beginning 0)(match-end 0)) + ))))) + (if filename + (replace-as-filename filename) + ))) + + +;;; @ file extraction +;;; + +(defun mime-save-content (entity situation) + (let* ((name (mime-entity-safe-filename entity)) + (filename (if (and name (not (string-equal name ""))) + (expand-file-name name + (save-window-excursion + (call-interactively + (function + (lambda (dir) + (interactive "DDirectory: ") + dir))))) + (save-window-excursion + (call-interactively + (function + (lambda (file) + (interactive "FFilename: ") + (expand-file-name file))))))) + ) + (if (file-exists-p filename) + (or (yes-or-no-p (format "File %s exists. Save anyway? " filename)) + (error ""))) + (mime-write-entity-content entity filename) + )) + + +;;; @ file detection +;;; + +(defvar mime-magic-type-alist + '(("^\377\330\377[\340\356]..JFIF" image jpeg) + ("^\211PNG" image png) + ("^GIF8[79]" image gif) + ("^II\\*\000" image tiff) + ("^MM\000\\*" image tiff) + ("^MThd" audio midi) + ("^\000\000\001\263" video mpeg) + ) + "*Alist of regexp about magic-number vs. corresponding media-types. +Each element looks like (REGEXP TYPE SUBTYPE). +REGEXP is a regular expression to match against the beginning of the +content of entity. +TYPE is symbol to indicate primary type of media-type. +SUBTYPE is symbol to indicate subtype of media-type.") + +(defun mime-detect-content (entity situation) + (let (type subtype) + (let ((mdata (mime-entity-content entity)) + (rest mime-magic-type-alist)) + (while (not (let ((cell (car rest))) + (if cell + (if (string-match (car cell) mdata) + (setq type (nth 1 cell) + subtype (nth 2 cell)) + ) + t))) + (setq rest (cdr rest)))) + (if type + (mime-play-entity + entity + (put-alist 'type type + (put-alist 'subtype subtype + (del-alist 'method + (copy-alist situation)))) + 'mime-detect-content) + )) + ) + + +;;; @ mail/news message +;;; + +(defun mime-preview-quitting-method-for-mime-show-message-mode () + "Quitting method for mime-view. +It is registered to variable `mime-preview-quitting-method-alist'." + (let ((mother mime-mother-buffer) + (win-conf mime-preview-original-window-configuration) + ) + (kill-buffer mime-raw-buffer) + (mime-preview-kill-buffer) + (set-window-configuration win-conf) + (pop-to-buffer mother) + )) + +(defun mime-view-message/rfc822 (entity situation) + (let* ((new-name + (format "%s-%s" (buffer-name) (mime-entity-number entity))) + (mother (current-buffer)) + (children (car (mime-entity-children entity)))) + (set-buffer (get-buffer-create new-name)) + (erase-buffer) + (mime-insert-entity children) + (setq mime-message-structure children) + (setq major-mode 'mime-show-message-mode) + (mime-view-buffer (current-buffer) nil mother + nil (if (mime-entity-cooked-p entity) 'cooked)) + )) + + +;;; @ message/partial +;;; + +(defun mime-store-message/partial-piece (entity cal) + (goto-char (mime-entity-point-min entity)) + (let* ((root-dir + (expand-file-name + (concat "m-prts-" (user-login-name)) temporary-file-directory)) + (id (cdr (assoc "id" cal))) + (number (cdr (assoc "number" cal))) + (total (cdr (assoc "total" cal))) + file + (mother mime-preview-buffer) + ) + (or (file-exists-p root-dir) + (make-directory root-dir) + ) + (setq id (replace-as-filename id)) + (setq root-dir (concat root-dir "/" id)) + (or (file-exists-p root-dir) + (make-directory root-dir) + ) + (setq file (concat root-dir "/FULL")) + (if (file-exists-p file) + (let ((full-buf (get-buffer-create "FULL")) + (pwin (or (get-buffer-window mother) + (get-largest-window))) + ) + (save-window-excursion + (set-buffer full-buf) + (erase-buffer) + (as-binary-input-file (insert-file-contents file)) + (setq major-mode 'mime-show-message-mode) + (mime-view-buffer (current-buffer) nil mother) + ) + (set-window-buffer pwin + (save-excursion + (set-buffer full-buf) + mime-preview-buffer)) + (select-window pwin) + ) + (setq file (concat root-dir "/" number)) + (mime-write-entity-body entity file) + (let ((total-file (concat root-dir "/CT"))) + (setq total + (if total + (progn + (or (file-exists-p total-file) + (save-excursion + (set-buffer + (get-buffer-create mime-temp-buffer-name)) + (erase-buffer) + (insert total) + (write-region (point-min)(point-max) total-file) + (kill-buffer (current-buffer)) + )) + (string-to-number total) + ) + (and (file-exists-p total-file) + (save-excursion + (set-buffer (find-file-noselect total-file)) + (prog1 + (and (re-search-forward "[0-9]+" nil t) + (string-to-number + (buffer-substring (match-beginning 0) + (match-end 0))) + ) + (kill-buffer (current-buffer)) + ))) + ))) + (if (and total (> total 0)) + (catch 'tag + (save-excursion + (set-buffer (get-buffer-create mime-temp-buffer-name)) + (let ((full-buf (current-buffer))) + (erase-buffer) + (let ((i 1)) + (while (<= i total) + (setq file (concat root-dir "/" (int-to-string i))) + (or (file-exists-p file) + (throw 'tag nil) + ) + (as-binary-input-file (insert-file-contents file)) + (goto-char (point-max)) + (setq i (1+ i)) + )) + (as-binary-output-file + (write-region (point-min)(point-max) + (expand-file-name "FULL" root-dir))) + (let ((i 1)) + (while (<= i total) + (let ((file (format "%s/%d" root-dir i))) + (and (file-exists-p file) + (delete-file file) + )) + (setq i (1+ i)) + )) + (let ((file (expand-file-name "CT" root-dir))) + (and (file-exists-p file) + (delete-file file) + )) + (save-window-excursion + (setq major-mode 'mime-show-message-mode) + (mime-view-buffer (current-buffer) nil mother) + ) + (let ((pwin (or (get-buffer-window mother) + (get-largest-window))) + (pbuf (save-excursion + (set-buffer full-buf) + mime-preview-buffer))) + (set-window-buffer pwin pbuf) + (select-window pwin) + ))))) + ))) + + +;;; @ message/external-body +;;; + +(defvar mime-raw-dired-function + (if (and (>= emacs-major-version 19) window-system) + (function dired-other-frame) + (function mime-raw-dired-function-for-one-frame) + )) + +(defun mime-raw-dired-function-for-one-frame (dir) + (let ((win (or (get-buffer-window mime-preview-buffer) + (get-largest-window)))) + (select-window win) + (dired dir) + )) + +(defun mime-view-message/external-anon-ftp (entity cal) + (let* ((site (cdr (assoc "site" cal))) + (directory (cdr (assoc "directory" cal))) + (name (cdr (assoc "name" cal))) + (pathname (concat "/anonymous@" site ":" directory))) + (message (concat "Accessing " (expand-file-name name pathname) " ...")) + (funcall mime-raw-dired-function pathname) + (goto-char (point-min)) + (search-forward name) + )) + +(defvar mime-raw-browse-url-function mime-browse-url-function) + +(defun mime-view-message/external-url (entity cal) + (let ((url (cdr (assoc "url" cal)))) + (message (concat "Accessing " url " ...")) + (funcall mime-raw-browse-url-function url))) + + +;;; @ rot13-47 +;;; + +(define-ccl-program translate-string + '(4 + (loop + (read-multibyte-character r1 r2) + (translate-character r0 r1 r2) + (write-multibyte-character r1 r2) + (repeat)))) + +(defun mime-view-caesar (entity situation) + "Internal method for mime-view to display ROT13-47-48 message." + (let ((buf (get-buffer-create + (format "%s-%s" (buffer-name) (mime-entity-number entity))))) + (with-current-buffer buf + (setq buffer-read-only nil) + (erase-buffer) + (let ((enable-character-translation nil)) + (mime-insert-text-content entity)) + (mule-caesar-region (point-min) (point-max)) + (let ((str (buffer-string)) + (status (make-vector 9 nil)) + (table + (catch 'tbl + (let ((i 0) e) + (while (and (< i (length translation-table-vector)) + (setq e (aref translation-table-vector i))) + (if (eq (cdr e) standard-translation-table-for-decode) + (throw 'tbl i)) + (setq i (1+ i))) + nil)))) + (when table + (aset status 0 table) + (delete-region (point-min) (point-max)) + (insert (ccl-execute-on-string + 'translate-string + status + str)))) + (set-buffer-modified-p nil) + ) + (let ((win (get-buffer-window (current-buffer)))) + (or (eq (selected-window) win) + (select-window (or win (get-largest-window))) + )) + (view-buffer buf) + (goto-char (point-min)) + )) + + +;;; @ end +;;; + +(provide 'mime-play) + +(let* ((file mime-acting-situation-examples-file) + (buffer (get-buffer-create " *mime-example*"))) + (if (file-readable-p file) + (unwind-protect + (save-excursion + (set-buffer buffer) + (erase-buffer) + (insert-file-contents file) + (eval-buffer) + ;; format check + (condition-case nil + (let ((i 0)) + (while (and (> (length mime-acting-situation-example-list) + mime-acting-situation-example-list-max-size) + (< i 16)) + (mime-reduce-acting-situation-examples) + (setq i (1+ i)) + )) + (error (setq mime-acting-situation-example-list nil))) + ) + (kill-buffer buffer)))) + +;;; mime-play.el ends here diff --git a/mime-setup.el b/mime-setup.el new file mode 100644 index 0000000..dae2871 --- /dev/null +++ b/mime-setup.el @@ -0,0 +1,47 @@ +;;; mime-setup.el --- setup file for MIME viewer and composer. + +;; Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc. + +;; Author: MORIOKA Tomohiko +;; Keywords: MIME, multimedia, multilingual, mail, news + +;; This file is part of SEMI (Setting for Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(load "mail-mime-setup") + +(condition-case nil + (load "gnus-mime-setup") + (error (message "gnus-mime-setup is not found.")) + ) + +(condition-case nil + (load "emh-setup") + (error (message "emh-setup is not found.")) + ) + + +;;; @ end +;;; + +(provide 'mime-setup) + +(run-hooks 'mime-setup-load-hook) + +;;; mime-setup.el ends here diff --git a/mime-view.el b/mime-view.el new file mode 100644 index 0000000..41e8abe --- /dev/null +++ b/mime-view.el @@ -0,0 +1,1439 @@ +;;; mime-view.el --- interactive MIME viewer for GNU Emacs + +;; Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc. + +;; Author: MORIOKA Tomohiko +;; Created: 1994/07/13 +;; Renamed: 1994/08/31 from tm-body.el +;; Renamed: 1997/02/19 from tm-view.el +;; Keywords: MIME, multimedia, mail, news + +;; This file is part of SEMI (Sample of Elastic MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'emu) +(require 'mime) +(require 'semi-def) +(require 'calist) +(require 'alist) +(require 'mailcap) + + +;;; @ version +;;; + +(defconst mime-view-version + (concat (mime-product-name mime-user-interface-product) " MIME-View " + (mapconcat #'number-to-string + (mime-product-version mime-user-interface-product) ".") + " (" (mime-product-code-name mime-user-interface-product) ")")) + + +;;; @ variables +;;; + +(defgroup mime-view nil + "MIME view mode" + :group 'mime) + +(defcustom mime-view-find-every-acting-situation t + "*Find every available acting-situation if non-nil." + :group 'mime-view + :type 'boolean) + +(defcustom mime-acting-situation-examples-file "~/.mime-example" + "*File name of example about acting-situation demonstrated by user." + :group 'mime-view + :type 'file) + + +;;; @ in raw-buffer (representation space) +;;; + +(defvar mime-preview-buffer nil + "MIME-preview buffer corresponding with the (raw) buffer.") +(make-variable-buffer-local 'mime-preview-buffer) + + +(defvar mime-raw-representation-type-alist + '((mime-show-message-mode . binary) + (mime-temp-message-mode . binary) + (t . cooked) + ) + "Alist of major-mode vs. representation-type of mime-raw-buffer. +Each element looks like (SYMBOL . REPRESENTATION-TYPE). SYMBOL is +major-mode or t. t means default. REPRESENTATION-TYPE must be +`binary' or `cooked'.") + + +(defun mime-raw-find-entity-from-point (point &optional message-info) + "Return entity from POINT in mime-raw-buffer. +If optional argument MESSAGE-INFO is not specified, +`mime-message-structure' is used." + (or message-info + (setq message-info mime-message-structure)) + (if (and (<= (mime-entity-point-min message-info) point) + (<= point (mime-entity-point-max message-info))) + (let ((children (mime-entity-children message-info))) + (catch 'tag + (while children + (let ((ret + (mime-raw-find-entity-from-point point (car children)))) + (if ret + (throw 'tag ret) + )) + (setq children (cdr children))) + message-info)))) + + +;;; @ in preview-buffer (presentation space) +;;; + +(defvar mime-mother-buffer nil + "Mother buffer corresponding with the (MIME-preview) buffer. +If current MIME-preview buffer is generated by other buffer, such as +message/partial, it is called `mother-buffer'.") +(make-variable-buffer-local 'mime-mother-buffer) + +(defvar mime-raw-buffer nil + "Raw buffer corresponding with the (MIME-preview) buffer.") +(make-variable-buffer-local 'mime-raw-buffer) + +(defvar mime-preview-original-window-configuration nil + "Window-configuration before mime-view-mode is called.") +(make-variable-buffer-local 'mime-preview-original-window-configuration) + +(defun mime-preview-original-major-mode (&optional recursive) + "Return major-mode of original buffer. +If optional argument RECURSIVE is non-nil and current buffer has +mime-mother-buffer, it returns original major-mode of the +mother-buffer." + (if (and recursive mime-mother-buffer) + (save-excursion + (set-buffer mime-mother-buffer) + (mime-preview-original-major-mode recursive) + ) + (save-excursion + (set-buffer + (mime-entity-buffer + (get-text-property (point-min) 'mime-view-entity))) + major-mode))) + + +;;; @ entity information +;;; + +(defun mime-entity-situation (entity &optional situation) + "Return situation of ENTITY." + (let (rest param name) + ;; Content-Type + (unless (assq 'type situation) + (setq rest (or (mime-entity-content-type entity) + (make-mime-content-type 'text 'plain)) + situation (cons (car rest) situation) + rest (cdr rest)) + ) + (unless (assq 'subtype situation) + (or rest + (setq rest (or (cdr (mime-entity-content-type entity)) + '((subtype . plain))))) + (setq situation (cons (car rest) situation) + rest (cdr rest)) + ) + (while rest + (setq param (car rest)) + (or (assoc (car param) situation) + (setq situation (cons param situation))) + (setq rest (cdr rest))) + + ;; Content-Disposition + (setq rest nil) + (unless (assq 'disposition-type situation) + (setq rest (mime-entity-content-disposition entity)) + (if rest + (setq situation (cons (cons 'disposition-type + (mime-content-disposition-type rest)) + situation) + rest (mime-content-disposition-parameters rest)) + )) + (while rest + (setq param (car rest) + name (car param)) + (if (cond ((string= name "filename") + (if (assq 'filename situation) + nil + (setq name 'filename))) + ((string= name "creation-date") + (if (assq 'creation-date situation) + nil + (setq name 'creation-date))) + ((string= name "modification-date") + (if (assq 'modification-date situation) + nil + (setq name 'modification-date))) + ((string= name "read-date") + (if (assq 'read-date situation) + nil + (setq name 'read-date))) + ((string= name "size") + (if (assq 'size situation) + nil + (setq name 'size))) + (t (setq name (cons 'disposition name)) + (if (assoc name situation) + nil + name))) + (setq situation + (cons (cons name (cdr param)) + situation))) + (setq rest (cdr rest))) + + ;; Content-Transfer-Encoding + (or (assq 'encoding situation) + (setq situation + (cons (cons 'encoding (or (mime-entity-encoding entity) + "7bit")) + situation))) + + ;; major-mode + (or (assq 'major-mode situation) + (setq situation + (cons (cons 'major-mode + (with-current-buffer (mime-entity-buffer entity) + major-mode)) + situation))) + + situation)) + +(defun mime-view-entity-title (entity) + (or (mime-read-field 'Content-Description entity) + (mime-read-field 'Subject entity) + (mime-entity-filename entity) + "")) + + +(defsubst mime-raw-point-to-entity-node-id (point &optional message-info) + "Return entity-node-id from POINT in mime-raw-buffer. +If optional argument MESSAGE-INFO is not specified, +`mime-message-structure' is used." + (mime-entity-node-id (mime-raw-find-entity-from-point point message-info))) + +(defsubst mime-raw-point-to-entity-number (point &optional message-info) + "Return entity-number from POINT in mime-raw-buffer. +If optional argument MESSAGE-INFO is not specified, +`mime-message-structure' is used." + (mime-entity-number (mime-raw-find-entity-from-point point message-info))) + +(defun mime-raw-flatten-message-info (&optional message-info) + "Return list of entity in mime-raw-buffer. +If optional argument MESSAGE-INFO is not specified, +`mime-message-structure' is used." + (or message-info + (setq message-info mime-message-structure)) + (let ((dest (list message-info)) + (rcl (mime-entity-children message-info))) + (while rcl + (setq dest (nconc dest (mime-raw-flatten-message-info (car rcl)))) + (setq rcl (cdr rcl))) + dest)) + + +;;; @ presentation of preview +;;; + +;;; @@ entity-button +;;; + +;;; @@@ predicate function +;;; + +(defun mime-view-entity-button-visible-p (entity) + "Return non-nil if header of ENTITY is visible. +Please redefine this function if you want to change default setting." + (let ((media-type (mime-entity-media-type entity)) + (media-subtype (mime-entity-media-subtype entity))) + (or (not (eq media-type 'application)) + (and (not (eq media-subtype 'x-selection)) + (or (not (eq media-subtype 'octet-stream)) + (let ((mother-entity (mime-entity-parent entity))) + (or (not (eq (mime-entity-media-type mother-entity) + 'multipart)) + (not (eq (mime-entity-media-subtype mother-entity) + 'encrypted))) + ) + ))))) + +;;; @@@ entity button generator +;;; + +(defun mime-view-insert-entity-button (entity) + "Insert entity-button of ENTITY." + (let ((entity-node-id (mime-entity-node-id entity)) + (params (mime-entity-parameters entity)) + (subject (mime-view-entity-title entity))) + (mime-insert-button + (let ((access-type (assoc "access-type" params)) + (num (or (cdr (assoc "x-part-number" params)) + (if (consp entity-node-id) + (mapconcat (function + (lambda (num) + (format "%s" (1+ num)) + )) + (reverse entity-node-id) ".") + "0")) + )) + (cond (access-type + (let ((server (assoc "server" params))) + (setq access-type (cdr access-type)) + (if server + (format "%s %s ([%s] %s)" + num subject access-type (cdr server)) + (let ((site (cdr (assoc "site" params))) + (dir (cdr (assoc "directory" params))) + (url (cdr (assoc "url" params))) + ) + (if url + (format "%s %s ([%s] %s)" + num subject access-type url) + (format "%s %s ([%s] %s:%s)" + num subject access-type site dir)) + ))) + ) + (t + (let ((media-type (mime-entity-media-type entity)) + (media-subtype (mime-entity-media-subtype entity)) + (charset (cdr (assoc "charset" params))) + (encoding (mime-entity-encoding entity))) + (concat + num " " subject + (let ((rest + (format " <%s/%s%s%s>" + media-type media-subtype + (if charset + (concat "; " charset) + "") + (if encoding + (concat " (" encoding ")") + "")))) + (if (>= (+ (current-column)(length rest))(window-width)) + "\n\t") + rest))) + ))) + (function mime-preview-play-current-entity)) + )) + + +;;; @@ entity-header +;;; + +(defvar mime-header-presentation-method-alist nil + "Alist of major mode vs. corresponding header-presentation-method functions. +Each element looks like (SYMBOL . FUNCTION). +SYMBOL must be major mode in raw-buffer or t. t means default. +Interface of FUNCTION must be (ENTITY SITUATION).") + +(defvar mime-view-ignored-field-list + '(".*Received:" ".*Path:" ".*Id:" "^References:" + "^Replied:" "^Errors-To:" + "^Lines:" "^Sender:" ".*Host:" "^Xref:" + "^Content-Type:" "^Precedence:" + "^Status:" "^X-VM-.*:") + "All fields that match this list will be hidden in MIME preview buffer. +Each elements are regexp of field-name.") + +(defvar mime-view-visible-field-list '("^Dnas.*:" "^Message-Id:") + "All fields that match this list will be displayed in MIME preview buffer. +Each elements are regexp of field-name.") + + +;;; @@ entity-body +;;; + +;;; @@@ predicate function +;;; + +(defun mime-calist::field-match-method-as-default-rule (calist + field-type field-value) + (let ((s-field (assq field-type calist))) + (cond ((null s-field) + (cons (cons field-type field-value) calist) + ) + (t calist)))) + +(define-calist-field-match-method + 'header #'mime-calist::field-match-method-as-default-rule) + +(define-calist-field-match-method + 'body #'mime-calist::field-match-method-as-default-rule) + + +(defvar mime-preview-condition nil + "Condition-tree about how to display entity.") + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . application)(subtype . octet-stream) + (encoding . nil) + (body . visible))) +(ctree-set-calist-strictly + 'mime-preview-condition '((type . application)(subtype . octet-stream) + (encoding . "7bit") + (body . visible))) +(ctree-set-calist-strictly + 'mime-preview-condition '((type . application)(subtype . octet-stream) + (encoding . "8bit") + (body . visible))) + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . application)(subtype . pgp) + (body . visible))) + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . application)(subtype . x-latex) + (body . visible))) + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . application)(subtype . x-selection) + (body . visible))) + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . application)(subtype . x-comment) + (body . visible))) + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . message)(subtype . delivery-status) + (body . visible))) + +(ctree-set-calist-strictly + 'mime-preview-condition + '((body . visible) + (body-presentation-method . mime-display-text/plain))) + +(ctree-set-calist-strictly + 'mime-preview-condition + '((type . nil) + (body . visible) + (body-presentation-method . mime-display-text/plain))) + +(ctree-set-calist-strictly + 'mime-preview-condition + '((type . text)(subtype . enriched) + (body . visible) + (body-presentation-method . mime-display-text/enriched))) + +(ctree-set-calist-strictly + 'mime-preview-condition + '((type . text)(subtype . richtext) + (body . visible) + (body-presentation-method . mime-display-text/richtext))) + +(ctree-set-calist-strictly + 'mime-preview-condition + '((type . text)(subtype . x-vcard) + (body . visible) + (body-presentation-method . mime-display-text/x-vcard))) + +(ctree-set-calist-strictly + 'mime-preview-condition + '((type . application)(subtype . x-postpet) + (body . visible) + (body-presentation-method . mime-display-application/x-postpet))) + +(ctree-set-calist-strictly + 'mime-preview-condition + '((type . text)(subtype . t) + (body . visible) + (body-presentation-method . mime-display-text/plain))) + +(ctree-set-calist-strictly + 'mime-preview-condition + '((type . multipart)(subtype . alternative) + (body . visible) + (body-presentation-method . mime-display-multipart/alternative))) + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . message)(subtype . partial) + (body-presentation-method + . mime-display-message/partial-button))) + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . message)(subtype . rfc822) + (body-presentation-method . nil) + (childrens-situation (header . visible) + (entity-button . invisible)))) + +(ctree-set-calist-strictly + 'mime-preview-condition '((type . message)(subtype . news) + (body-presentation-method . nil) + (childrens-situation (header . visible) + (entity-button . invisible)))) + + +;;; @@@ entity presentation +;;; + +(defun mime-display-text/plain (entity situation) + (save-restriction + (narrow-to-region (point-max)(point-max)) + (mime-insert-text-content entity) + (run-hooks 'mime-text-decode-hook) + (goto-char (point-max)) + (if (not (eq (char-after (1- (point))) ?\n)) + (insert "\n") + ) + (mime-add-url-buttons) + (run-hooks 'mime-display-text/plain-hook) + )) + +(defun mime-display-text/richtext (entity situation) + (save-restriction + (narrow-to-region (point-max)(point-max)) + (mime-insert-text-content entity) + (run-hooks 'mime-text-decode-hook) + (let ((beg (point-min))) + (remove-text-properties beg (point-max) '(face nil)) + (richtext-decode beg (point-max)) + ))) + +(defun mime-display-text/enriched (entity situation) + (save-restriction + (narrow-to-region (point-max)(point-max)) + (mime-insert-text-content entity) + (run-hooks 'mime-text-decode-hook) + (let ((beg (point-min))) + (remove-text-properties beg (point-max) '(face nil)) + (enriched-decode beg (point-max)) + ))) + +(defun mime-display-text/x-vcard (entity situation) + (save-restriction + (narrow-to-region (point-max)(point-max)) + (insert (string-as-multibyte (mime-entity-content entity))) + (goto-char (point-min)) + (while (re-search-forward + "\\(;\\(encoding=\\)?quoted-printable:\\)\\(\\(=[0-9A-F][0-9A-F]\\|=\r?\n\\|[^\r\n]\\)*\\)" + nil t) + (replace-match + (concat + (buffer-substring (match-beginning 1) (match-end 1)) + (string-as-multibyte + (mime-decode-string + (decode-coding-string + (buffer-substring (match-beginning 3) (match-end 3)) 'raw-text-dos) + "quoted-printable"))) + t t)) + (decode-coding-region (point-min) (point-max) 'undecided) + (goto-char (point-max)) + (if (not (eq (char-after (1- (point))) ?\n)) + (insert "\n")) + (mime-add-url-buttons) + (run-hooks 'mime-display-text/x-vcard-hook) + )) + +(defun mime-display-application/x-postpet (entity situation) + (save-restriction + (narrow-to-region (point-max)(point-max)) + (let ((contents (string-as-unibyte (mime-entity-content entity))) + (p 0) l + petname owner pettype from) + (setq p (+ p 30)) + (setq petname (decode-mime-charset-string (substring contents (1+ p) (setq p (+ p 1 (char-int (aref contents p))))) 'shift_jis)) + (setq owner (decode-mime-charset-string (substring contents (1+ p) (setq p (+ p 1 (char-int (aref contents p))))) 'shift_jis)) + (setq pettype (substring contents p (setq p (+ p 4)))) + (setq p (+ p 78)) + (setq from (substring contents (1+ p) (setq p (+ p 1 (char-int (aref contents p)))))) + (insert "Petname: " petname "\n" + "Owner: " owner "\n" + "Pettype: " pettype "\n" + "From: " from "\n") + (run-hooks 'mime-display-application/x-postpet-hook)))) + +(defvar mime-view-announcement-for-message/partial + (if (and (>= emacs-major-version 19) window-system) + "\ +\[[ This is message/partial style split message. ]] +\[[ Please press `v' key in this buffer ]] +\[[ or click here by mouse button-2. ]]" + "\ +\[[ This is message/partial style split message. ]] +\[[ Please press `v' key in this buffer. ]]" + )) + +(defun mime-display-message/partial-button (&optional entity situation) + (save-restriction + (goto-char (point-max)) + (if (not (search-backward "\n\n" nil t)) + (insert "\n") + ) + (goto-char (point-max)) + (narrow-to-region (point-max)(point-max)) + (insert mime-view-announcement-for-message/partial) + (mime-add-button (point-min)(point-max) + #'mime-preview-play-current-entity) + )) + +(defun mime-display-multipart/mixed (entity situation) + (let ((children (mime-entity-children entity)) + (default-situation + (cdr (assq 'childrens-situation situation)))) + (while children + (mime-display-entity (car children) nil default-situation) + (setq children (cdr children)) + ))) + +(defcustom mime-view-type-subtype-score-alist + '(((text . enriched) . 3) + ((text . richtext) . 2) + ((text . plain) . 1) + (t . 0)) + "Alist MEDIA-TYPE vs corresponding score. +MEDIA-TYPE must be (TYPE . SUBTYPE), TYPE or t. t means default." + :group 'mime-view + :type '(repeat (cons (choice :tag "Media-Type" + (cons :tag "Type/Subtype" + (symbol :tag "Primary-type") + (symbol :tag "Subtype")) + (symbol :tag "Type") + (const :tag "Default" t)) + integer))) + +(defun mime-display-multipart/alternative (entity situation) + (let* ((children (mime-entity-children entity)) + (default-situation + (cdr (assq 'childrens-situation situation))) + (i 0) + (p 0) + (max-score 0) + (situations + (mapcar (function + (lambda (child) + (let ((situation + (or (ctree-match-calist + mime-preview-condition + (append (mime-entity-situation child) + default-situation)) + default-situation))) + (if (cdr (assq 'body-presentation-method situation)) + (let ((score + (cdr + (or (assoc + (cons + (cdr (assq 'type situation)) + (cdr (assq 'subtype situation))) + mime-view-type-subtype-score-alist) + (assq + (cdr (assq 'type situation)) + mime-view-type-subtype-score-alist) + (assq + t + mime-view-type-subtype-score-alist) + )))) + (if (> score max-score) + (setq p i + max-score score) + ))) + (setq i (1+ i)) + situation) + )) + children))) + (setq i 0) + (while children + (let ((child (car children)) + (situation (car situations))) + (mime-display-entity child (if (= i p) + situation + (del-alist 'body-presentation-method + (copy-alist situation)))) + ) + (setq children (cdr children) + situations (cdr situations) + i (1+ i)) + ))) + + +;;; @ acting-condition +;;; + +(defvar mime-acting-condition nil + "Condition-tree about how to process entity.") + +(if (file-readable-p mailcap-file) + (let ((entries (mailcap-parse-file))) + (while entries + (let ((entry (car entries)) + view print shared) + (while entry + (let* ((field (car entry)) + (field-type (car field))) + (cond ((eq field-type 'view) (setq view field)) + ((eq field-type 'print) (setq print field)) + ((memq field-type '(compose composetyped edit))) + (t (setq shared (cons field shared)))) + ) + (setq entry (cdr entry)) + ) + (setq shared (nreverse shared)) + (ctree-set-calist-with-default + 'mime-acting-condition + (append shared (list '(mode . "play")(cons 'method (cdr view))))) + (if print + (ctree-set-calist-with-default + 'mime-acting-condition + (append shared + (list '(mode . "print")(cons 'method (cdr view)))) + )) + ) + (setq entries (cdr entries)) + ))) + +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . application)(subtype . octet-stream) + (mode . "play") + (method . mime-detect-content) + )) + +(ctree-set-calist-with-default + 'mime-acting-condition + '((mode . "extract") + (method . mime-save-content))) + +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . text)(subtype . x-rot13-47)(mode . "play") + (method . mime-view-caesar) + )) +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . text)(subtype . x-rot13-47-48)(mode . "play") + (method . mime-view-caesar) + )) + +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . message)(subtype . rfc822)(mode . "play") + (method . mime-view-message/rfc822) + )) +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . message)(subtype . partial)(mode . "play") + (method . mime-store-message/partial-piece) + )) + +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . message)(subtype . external-body) + ("access-type" . "anon-ftp") + (method . mime-view-message/external-anon-ftp) + )) + +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . message)(subtype . external-body) + ("access-type" . "url") + (method . mime-view-message/external-url) + )) + +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . application)(subtype . octet-stream) + (method . mime-save-content) + )) + + +;;; @ quitting method +;;; + +(defvar mime-preview-quitting-method-alist + '((mime-show-message-mode + . mime-preview-quitting-method-for-mime-show-message-mode)) + "Alist of major-mode vs. quitting-method of mime-view.") + +(defvar mime-preview-over-to-previous-method-alist nil + "Alist of major-mode vs. over-to-previous-method of mime-view.") + +(defvar mime-preview-over-to-next-method-alist nil + "Alist of major-mode vs. over-to-next-method of mime-view.") + + +;;; @ following method +;;; + +(defvar mime-preview-following-method-alist nil + "Alist of major-mode vs. following-method of mime-view.") + +(defvar mime-view-following-required-fields-list + '("From")) + + +;;; @ buffer setup +;;; + +(defun mime-display-entity (entity &optional situation + default-situation preview-buffer) + (or preview-buffer + (setq preview-buffer (current-buffer))) + (let* ((raw-buffer (mime-entity-buffer entity)) + (start (mime-entity-point-min entity)) + e nb ne) + (set-buffer raw-buffer) + (goto-char start) + (or situation + (setq situation + (or (ctree-match-calist mime-preview-condition + (append (mime-entity-situation entity) + default-situation)) + default-situation))) + (let ((button-is-invisible + (eq (cdr (assq 'entity-button situation)) 'invisible)) + (header-is-visible + (eq (cdr (assq 'header situation)) 'visible)) + (header-presentation-method + (or (cdr (assq 'header-presentation-method situation)) + (cdr (assq major-mode mime-header-presentation-method-alist)))) + (body-presentation-method + (cdr (assq 'body-presentation-method situation))) + (children (mime-entity-children entity))) + (set-buffer preview-buffer) + (setq nb (point)) + (narrow-to-region nb nb) + (or button-is-invisible + (if (mime-view-entity-button-visible-p entity) + (mime-view-insert-entity-button entity) + )) + (when header-is-visible + (if header-presentation-method + (funcall header-presentation-method entity situation) + (mime-insert-header entity + mime-view-ignored-field-list + mime-view-visible-field-list)) + (goto-char (point-max)) + (insert "\n") + (run-hooks 'mime-display-header-hook) + ) + (cond (children) + ((functionp body-presentation-method) + (funcall body-presentation-method entity situation) + ) + (t + (when button-is-invisible + (goto-char (point-max)) + (mime-view-insert-entity-button entity) + ) + (or header-is-visible + (progn + (goto-char (point-max)) + (insert "\n") + )) + )) + (setq ne (point-max)) + (widen) + (put-text-property nb ne 'mime-view-entity entity) + (goto-char ne) + (if children + (if (functionp body-presentation-method) + (funcall body-presentation-method entity situation) + (mime-display-multipart/mixed entity situation) + )) + ))) + + +;;; @ MIME viewer mode +;;; + +(defconst mime-view-menu-title "MIME-View") +(defconst mime-view-menu-list + '((up "Move to upper entity" mime-preview-move-to-upper) + (previous "Move to previous entity" mime-preview-move-to-previous) + (next "Move to next entity" mime-preview-move-to-next) + (scroll-down "Scroll-down" mime-preview-scroll-down-entity) + (scroll-up "Scroll-up" mime-preview-scroll-up-entity) + (play "Play current entity" mime-preview-play-current-entity) + (extract "Extract current entity" mime-preview-extract-current-entity) + (print "Print current entity" mime-preview-print-current-entity) + ) + "Menu for MIME Viewer") + +(cond ((featurep 'xemacs) + (defvar mime-view-xemacs-popup-menu + (cons mime-view-menu-title + (mapcar (function + (lambda (item) + (vector (nth 1 item)(nth 2 item) t) + )) + mime-view-menu-list))) + (defun mime-view-xemacs-popup-menu (event) + "Popup the menu in the MIME Viewer buffer" + (interactive "e") + (select-window (event-window event)) + (set-buffer (event-buffer event)) + (popup-menu 'mime-view-xemacs-popup-menu)) + (defvar mouse-button-2 'button2) + ) + (t + (defvar mouse-button-2 [mouse-2]) + )) + +(defun mime-view-define-keymap (&optional default) + (let ((mime-view-mode-map (if (keymapp default) + (copy-keymap default) + (make-sparse-keymap) + ))) + (define-key mime-view-mode-map + "u" (function mime-preview-move-to-upper)) + (define-key mime-view-mode-map + "p" (function mime-preview-move-to-previous)) + (define-key mime-view-mode-map + "n" (function mime-preview-move-to-next)) + (define-key mime-view-mode-map + "\e\t" (function mime-preview-move-to-previous)) + (define-key mime-view-mode-map + "\t" (function mime-preview-move-to-next)) + (define-key mime-view-mode-map + " " (function mime-preview-scroll-up-entity)) + (define-key mime-view-mode-map + "\M- " (function mime-preview-scroll-down-entity)) + (define-key mime-view-mode-map + "\177" (function mime-preview-scroll-down-entity)) + (define-key mime-view-mode-map + "\C-m" (function mime-preview-next-line-entity)) + (define-key mime-view-mode-map + "\C-\M-m" (function mime-preview-previous-line-entity)) + (define-key mime-view-mode-map + "v" (function mime-preview-play-current-entity)) + (define-key mime-view-mode-map + "e" (function mime-preview-extract-current-entity)) + (define-key mime-view-mode-map + "\C-c\C-p" (function mime-preview-print-current-entity)) + (define-key mime-view-mode-map + "a" (function mime-preview-follow-current-entity)) + (define-key mime-view-mode-map + "q" (function mime-preview-quit)) + (define-key mime-view-mode-map + "\C-c\C-x" (function mime-preview-kill-buffer)) + ;; (define-key mime-view-mode-map + ;; "<" (function beginning-of-buffer)) + ;; (define-key mime-view-mode-map + ;; ">" (function end-of-buffer)) + (define-key mime-view-mode-map + "?" (function describe-mode)) + (define-key mime-view-mode-map + [tab] (function mime-preview-move-to-next)) + (define-key mime-view-mode-map + [delete] (function mime-preview-scroll-down-entity)) + (define-key mime-view-mode-map + [backspace] (function mime-preview-scroll-down-entity)) + (if (functionp default) + (cond ((featurep 'xemacs) + (set-keymap-default-binding mime-view-mode-map default) + ) + (t + (setq mime-view-mode-map + (append mime-view-mode-map (list (cons t default)))) + ))) + (if mouse-button-2 + (define-key mime-view-mode-map + mouse-button-2 (function mime-button-dispatcher)) + ) + (cond ((featurep 'xemacs) + (define-key mime-view-mode-map + mouse-button-3 (function mime-view-xemacs-popup-menu)) + ) + ((>= emacs-major-version 19) + (define-key mime-view-mode-map [menu-bar mime-view] + (cons mime-view-menu-title + (make-sparse-keymap mime-view-menu-title))) + (mapcar (function + (lambda (item) + (define-key mime-view-mode-map + (vector 'menu-bar 'mime-view (car item)) + (cons (nth 1 item)(nth 2 item)) + ) + )) + (reverse mime-view-menu-list) + ) + )) + (use-local-map mime-view-mode-map) + (run-hooks 'mime-view-define-keymap-hook) + )) + +(defsubst mime-maybe-hide-echo-buffer () + "Clear mime-echo buffer and delete window for it." + (let ((buf (get-buffer mime-echo-buffer-name))) + (if buf + (save-excursion + (set-buffer buf) + (erase-buffer) + (let ((win (get-buffer-window buf))) + (if win + (delete-window win) + )) + (bury-buffer buf) + )))) + +(defvar mime-view-redisplay nil) + +;;;###autoload +(defun mime-display-message (message &optional preview-buffer + mother default-keymap-or-function) + "View MESSAGE in MIME-View mode. + +Optional argument PREVIEW-BUFFER specifies the buffer of the +presentation. It must be either nil or a name of preview buffer. + +Optional argument MOTHER specifies mother-buffer of the preview-buffer. + +Optional argument DEFAULT-KEYMAP-OR-FUNCTION is nil, keymap or +function. If it is a keymap, keymap of MIME-View mode will be added +to it. If it is a function, it will be bound as default binding of +keymap of MIME-View mode." + (mime-maybe-hide-echo-buffer) + (let ((win-conf (current-window-configuration)) + (raw-buffer (mime-entity-buffer message))) + (or preview-buffer + (setq preview-buffer + (concat "*Preview-" (buffer-name raw-buffer) "*"))) + (set-buffer raw-buffer) + (setq mime-preview-buffer preview-buffer) + (let ((inhibit-read-only t)) + (set-buffer (get-buffer-create preview-buffer)) + (widen) + (erase-buffer) + (setq mime-raw-buffer raw-buffer) + (if mother + (setq mime-mother-buffer mother) + ) + (setq mime-preview-original-window-configuration win-conf) + (setq major-mode 'mime-view-mode) + (setq mode-name "MIME-View") + (mime-display-entity message nil + '((entity-button . invisible) + (header . visible)) + preview-buffer) + (mime-view-define-keymap default-keymap-or-function) + (let ((point + (next-single-property-change (point-min) 'mime-view-entity))) + (if point + (goto-char point) + (goto-char (point-min)) + (search-forward "\n\n" nil t) + )) + (run-hooks 'mime-view-mode-hook) + (set-buffer-modified-p nil) + (setq buffer-read-only t) + (or (get-buffer-window preview-buffer) + (let ((r-win (get-buffer-window raw-buffer))) + (if r-win + (set-window-buffer r-win preview-buffer) + (let ((m-win (and mother (get-buffer-window mother)))) + (if m-win + (set-window-buffer m-win preview-buffer) + (switch-to-buffer preview-buffer) + ))))) + ))) + +;;;###autoload +(defun mime-view-buffer (&optional raw-buffer preview-buffer mother + default-keymap-or-function + representation-type) + "View RAW-BUFFER in MIME-View mode. +Optional argument PREVIEW-BUFFER is either nil or a name of preview +buffer. +Optional argument DEFAULT-KEYMAP-OR-FUNCTION is nil, keymap or +function. If it is a keymap, keymap of MIME-View mode will be added +to it. If it is a function, it will be bound as default binding of +keymap of MIME-View mode. +Optional argument REPRESENTATION-TYPE is representation-type of +message. It must be nil, `binary' or `cooked'. If it is nil, +`cooked' is used as default." + (interactive) + (or raw-buffer + (setq raw-buffer (current-buffer))) + (or representation-type + (setq representation-type + (save-excursion + (set-buffer raw-buffer) + (cdr (or (assq major-mode mime-raw-representation-type-alist) + (assq t mime-raw-representation-type-alist))) + ))) + (if (eq representation-type 'binary) + (setq representation-type 'buffer) + ) + (mime-display-message + (mime-open-entity representation-type raw-buffer) + preview-buffer mother default-keymap-or-function)) + +(defun mime-view-mode (&optional mother ctl encoding + raw-buffer preview-buffer + default-keymap-or-function) + "Major mode for viewing MIME message. + +Here is a list of the standard keys for mime-view-mode. + +key feature +--- ------- + +u Move to upper content +p or M-TAB Move to previous content +n or TAB Move to next content +SPC Scroll up or move to next content +M-SPC or DEL Scroll down or move to previous content +RET Move to next line +M-RET Move to previous line +v Decode current content as `play mode' +e Decode current content as `extract mode' +C-c C-p Decode current content as `print mode' +a Followup to current content. +q Quit +button-2 Move to point under the mouse cursor + and decode current content as `play mode' +" + (interactive) + (unless mime-view-redisplay + (save-excursion + (if raw-buffer (set-buffer raw-buffer)) + (let ((type + (cdr + (or (assq major-mode mime-raw-representation-type-alist) + (assq t mime-raw-representation-type-alist))))) + (if (eq type 'binary) + (setq type 'buffer) + ) + (setq mime-message-structure (mime-open-entity type raw-buffer)) + (or (mime-entity-content-type mime-message-structure) + (mime-entity-set-content-type-internal + mime-message-structure ctl)) + ) + (or (mime-entity-encoding mime-message-structure) + (mime-entity-set-encoding-internal mime-message-structure encoding)) + )) + (mime-display-message mime-message-structure preview-buffer + mother default-keymap-or-function) + ) + + +;;; @@ playing +;;; + +(autoload 'mime-preview-play-current-entity "mime-play" + "Play current entity." t) + +(defun mime-preview-extract-current-entity (&optional ignore-examples) + "Extract current entity into file (maybe). +It decodes current entity to call internal or external method as +\"extract\" mode. The method is selected from variable +`mime-acting-condition'." + (interactive "P") + (mime-preview-play-current-entity ignore-examples "extract") + ) + +(defun mime-preview-print-current-entity (&optional ignore-examples) + "Print current entity (maybe). +It decodes current entity to call internal or external method as +\"print\" mode. The method is selected from variable +`mime-acting-condition'." + (interactive "P") + (mime-preview-play-current-entity ignore-examples "print") + ) + + +;;; @@ following +;;; + +(defun mime-preview-follow-current-entity () + "Write follow message to current entity. +It calls following-method selected from variable +`mime-preview-following-method-alist'." + (interactive) + (let (entity) + (while (null (setq entity + (get-text-property (point) 'mime-view-entity))) + (backward-char) + ) + (let* ((p-beg + (previous-single-property-change (point) 'mime-view-entity)) + p-end + (entity-node-id (mime-entity-node-id entity)) + (len (length entity-node-id)) + ) + (cond ((null p-beg) + (setq p-beg + (if (eq (next-single-property-change (point-min) + 'mime-view-entity) + (point)) + (point) + (point-min))) + ) + ((eq (next-single-property-change p-beg 'mime-view-entity) + (point)) + (setq p-beg (point)) + )) + (setq p-end (next-single-property-change p-beg 'mime-view-entity)) + (cond ((null p-end) + (setq p-end (point-max)) + ) + ((null entity-node-id) + (setq p-end (point-max)) + ) + (t + (save-excursion + (goto-char p-end) + (catch 'tag + (let (e) + (while (setq e + (next-single-property-change + (point) 'mime-view-entity)) + (goto-char e) + (let ((rc (mime-entity-node-id + (get-text-property (point) + 'mime-view-entity)))) + (or (equal entity-node-id + (nthcdr (- (length rc) len) rc)) + (throw 'tag nil) + )) + (setq p-end e) + )) + (setq p-end (point-max)) + )) + )) + (let* ((mode (mime-preview-original-major-mode 'recursive)) + (new-name + (format "%s-%s" (buffer-name) (reverse entity-node-id))) + new-buf + (the-buf (current-buffer)) + (a-buf mime-raw-buffer) + fields) + (save-excursion + (set-buffer (setq new-buf (get-buffer-create new-name))) + (erase-buffer) + (insert-buffer-substring the-buf p-beg p-end) + (goto-char (point-min)) + (let ((entity-node-id (mime-entity-node-id entity)) ci str) + (while (progn + (setq + str + (save-excursion + (set-buffer a-buf) + (setq ci + (mime-find-entity-from-node-id entity-node-id)) + (save-restriction + (narrow-to-region + (mime-entity-point-min ci) + (mime-entity-point-max ci) + ) + (std11-header-string-except + (concat "^" + (apply (function regexp-or) fields) + ":") "")))) + (if (and + (eq (mime-entity-media-type ci) 'message) + (eq (mime-entity-media-subtype ci) 'rfc822)) + nil + (if str + (insert str) + ) + entity-node-id)) + (setq fields (std11-collect-field-names) + entity-node-id (cdr entity-node-id)) + ) + ) + (let ((rest mime-view-following-required-fields-list)) + (while rest + (let ((field-name (car rest))) + (or (std11-field-body field-name) + (insert + (format + (concat field-name + ": " + (save-excursion + (set-buffer the-buf) + (set-buffer mime-mother-buffer) + (set-buffer mime-raw-buffer) + (std11-field-body field-name) + ) + "\n"))) + )) + (setq rest (cdr rest)) + )) + (mime-decode-header-in-buffer) + ) + (let ((f (cdr (assq mode mime-preview-following-method-alist)))) + (if (functionp f) + (funcall f new-buf) + (message + (format + "Sorry, following method for %s is not implemented yet." + mode)) + )) + )))) + + +;;; @@ moving +;;; + +(defun mime-preview-move-to-upper () + "Move to upper entity. +If there is no upper entity, call function `mime-preview-quit'." + (interactive) + (let (cinfo) + (while (null (setq cinfo + (get-text-property (point) 'mime-view-entity))) + (backward-char) + ) + (let ((r (mime-entity-parent cinfo)) + point) + (catch 'tag + (while (setq point (previous-single-property-change + (point) 'mime-view-entity)) + (goto-char point) + (if (eq r (get-text-property (point) 'mime-view-entity)) + (throw 'tag t) + ) + ) + (mime-preview-quit) + )))) + +(defun mime-preview-move-to-previous () + "Move to previous entity. +If there is no previous entity, it calls function registered in +variable `mime-preview-over-to-previous-method-alist'." + (interactive) + (while (null (get-text-property (point) 'mime-view-entity)) + (backward-char) + ) + (let ((point (previous-single-property-change (point) 'mime-view-entity))) + (if point + (if (get-text-property (1- point) 'mime-view-entity) + (goto-char point) + (goto-char (1- point)) + (mime-preview-move-to-previous) + ) + (let ((f (assq (mime-preview-original-major-mode) + mime-preview-over-to-previous-method-alist))) + (if f + (funcall (cdr f)) + )) + ))) + +(defun mime-preview-move-to-next () + "Move to next entity. +If there is no previous entity, it calls function registered in +variable `mime-preview-over-to-next-method-alist'." + (interactive) + (while (and (not (eobp)) + (null (get-text-property (point) 'mime-view-entity))) + (forward-char) + ) + (let ((point (next-single-property-change (point) 'mime-view-entity))) + (if point + (progn + (goto-char point) + (if (null (get-text-property point 'mime-view-entity)) + (mime-preview-move-to-next) + )) + (let ((f (assq (mime-preview-original-major-mode) + mime-preview-over-to-next-method-alist))) + (if f + (funcall (cdr f)) + )) + ))) + +(defun mime-preview-scroll-up-entity (&optional h) + "Scroll up current entity. +If reached to (point-max), it calls function registered in variable +`mime-preview-over-to-next-method-alist'." + (interactive) + (or h + (setq h (1- (window-height))) + ) + (if (= (point) (point-max)) + (let ((f (assq (mime-preview-original-major-mode) + mime-preview-over-to-next-method-alist))) + (if f + (funcall (cdr f)) + )) + (let ((point + (or (next-single-property-change (point) 'mime-view-entity) + (point-max)))) + (forward-line h) + (if (> (point) point) + (goto-char point) + ) + ))) + +(defun mime-preview-scroll-down-entity (&optional h) + "Scroll down current entity. +If reached to (point-min), it calls function registered in variable +`mime-preview-over-to-previous-method-alist'." + (interactive) + (or h + (setq h (1- (window-height))) + ) + (if (= (point) (point-min)) + (let ((f (assq (mime-preview-original-major-mode) + mime-preview-over-to-previous-method-alist))) + (if f + (funcall (cdr f)) + )) + (let ((point + (or (previous-single-property-change (point) 'mime-view-entity) + (point-min)))) + (forward-line (- h)) + (if (< (point) point) + (goto-char point) + )))) + +(defun mime-preview-next-line-entity () + (interactive) + (mime-preview-scroll-up-entity 1) + ) + +(defun mime-preview-previous-line-entity () + (interactive) + (mime-preview-scroll-down-entity 1) + ) + + +;;; @@ quitting +;;; + +(defun mime-preview-quit () + "Quit from MIME-preview buffer. +It calls function registered in variable +`mime-preview-quitting-method-alist'." + (interactive) + (let ((r (assq (mime-preview-original-major-mode) + mime-preview-quitting-method-alist))) + (if r + (funcall (cdr r)) + ))) + +(defun mime-preview-kill-buffer () + (interactive) + (kill-buffer (current-buffer)) + ) + + +;;; @ end +;;; + +(provide 'mime-view) + +(run-hooks 'mime-view-load-hook) + +;;; mime-view.el ends here diff --git a/mime-w3.el b/mime-w3.el index a3d3349..6ce9927 100644 --- a/mime-w3.el +++ b/mime-w3.el @@ -1,6 +1,6 @@ ;;; mime-w3.el --- mime-view content filter for text -;; Copyright (C) 1994,1995,1996,1997,1998 Free Software Foundation, Inc. +;; Copyright (C) 1994,1995,1996,1997,1998,1999 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko ;; Keywords: HTML, MIME, multimedia, mail, news @@ -43,7 +43,12 @@ )) (cons 'progn body))) +(defvar mime-w3-message-structure nil) + (defun mime-preview-text/html (entity situation) + (setq mime-w3-message-structure + (with-current-buffer (mime-entity-buffer entity) + mime-message-structure)) (goto-char (point-max)) (let ((p (point))) (insert "\n") @@ -53,10 +58,25 @@ (narrow-to-region p p) (mime-insert-text-content entity) (run-hooks 'mime-text-decode-hook) - (w3-region p (point-max)) + (condition-case err + (w3-region p (point-max)) + (error (message (format "%s" err)))) (mime-put-keymap-region p (point-max) w3-mode-map) )))) +(defun url-cid (url &optional proxy-info) + (let ((entity + (mime-find-entity-from-content-id (mime-uri-parse-cid url) + mime-w3-message-structure))) + (when entity + (mime-insert-entity-content entity) + (setq url-current-mime-type (mime-entity-type/subtype entity)) + ))) + +(url-register-protocol "cid" + 'url-cid + 'url-identity-expander) + ;;; @ end ;;; diff --git a/semi-def.el b/semi-def.el index 12311dd..df215ad 100644 --- a/semi-def.el +++ b/semi-def.el @@ -1,6 +1,6 @@ ;;; semi-def.el --- definition module for SEMI -;; Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc. +;; Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko ;; Keywords: definition, MIME, multimedia, mail, news @@ -30,7 +30,7 @@ (require 'custom) -(defconst mime-user-interface-product ["SEMI" (1 12 1) "[JR] Nonoichi"] +(defconst mime-user-interface-product ["AKEMI" (1 13 1) "$B?e>=BN(B"] "Product name, version number and code name of MIME-kernel package.") (autoload 'mule-caesar-region "mule-caesar" diff --git a/semi-setup.el b/semi-setup.el new file mode 100644 index 0000000..9928d1e --- /dev/null +++ b/semi-setup.el @@ -0,0 +1,195 @@ +;;; semi-setup.el --- setup file for MIME-View. + +;; Copyright (C) 1994,1995,1996,1997,1998 Free Software Foundation, Inc. + +;; Author: MORIOKA Tomohiko +;; Keywords: mail, news, MIME, multimedia, multilingual, encoded-word + +;; This file is part of SEMI (Setting for Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'semi-def) +(require 'path-util) + +(defun call-after-loaded (module func &optional hook-name) + "If MODULE is provided, then FUNC is called. +Otherwise func is set to MODULE-load-hook. +If optional argument HOOK-NAME is specified, +it is used as hook to set." + (if (featurep module) + (funcall func) + (or hook-name + (setq hook-name (intern (concat (symbol-name module) "-load-hook"))) + ) + (add-hook hook-name func) + )) + + +;; for image/* and X-Face +(defvar mime-setup-enable-inline-image + (and window-system + (or (featurep 'xemacs) + (and (featurep 'mule)(module-installed-p 'bitmap)) + )) + "*If it is non-nil, semi-setup sets up to use mime-image.") + +(if mime-setup-enable-inline-image + (call-after-loaded 'mime-view + (function + (lambda () + (require 'mime-image) + ))) + ) + + +;; for text/html +(defvar mime-setup-enable-inline-html + (module-installed-p 'w3) + "*If it is non-nil, semi-setup sets up to use mime-w3.") + +(if mime-setup-enable-inline-html + (call-after-loaded + 'mime-view + (function + (lambda () + (autoload 'mime-preview-text/html "mime-w3") + + (ctree-set-calist-strictly + 'mime-preview-condition + '((type . text)(subtype . html) + (body . visible) + (body-presentation-method . mime-preview-text/html))) + + (set-alist 'mime-view-type-subtype-score-alist + '(text . html) 3) + ))) + ) + + +;; for PGP +(defvar mime-setup-enable-pgp + (module-installed-p 'mailcrypt) + "*If it is non-nil, semi-setup sets uf to use mime-pgp.") + +(if mime-setup-enable-pgp + (eval-after-load "mime-view" + '(progn + (mime-add-condition + 'preview '((type . application)(subtype . pgp) + (message-button . visible))) + (mime-add-condition + 'action '((type . application)(subtype . pgp) + (method . mime-view-application/pgp)) + 'strict "mime-pgp") + (mime-add-condition + 'action '((type . text)(subtype . x-pgp) + (method . mime-view-application/pgp))) + + (mime-add-condition + 'action '((type . multipart)(subtype . signed) + (method . mime-verify-multipart/signed)) + 'strict "mime-pgp") + + (mime-add-condition + 'action + '((type . application)(subtype . pgp-signature) + (method . mime-verify-application/pgp-signature)) + 'strict "mime-pgp") + + (mime-add-condition + 'action + '((type . application)(subtype . pgp-encrypted) + (method . mime-decrypt-application/pgp-encrypted)) + 'strict "mime-pgp") + + (mime-add-condition + 'action + '((type . application)(subtype . pgp-keys) + (method . mime-add-application/pgp-keys)) + 'strict "mime-pgp") + )) + ) + + +;;; @ for mime-edit +;;; + +(defun mime-setup-decode-message-header () + (save-excursion + (save-restriction + (goto-char (point-min)) + (narrow-to-region + (point-min) + (if (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "$") + nil t) + (match-beginning 0) + (point-max) + )) + (mime-decode-header-in-buffer) + (set-buffer-modified-p nil) + ))) + +(add-hook 'mime-edit-mode-hook 'mime-setup-decode-message-header) + + +;;; @@ variables +;;; + +(defvar mime-setup-use-signature t + "If it is not nil, mime-setup sets up to use signature.el.") + +(defvar mime-setup-default-signature-key "\C-c\C-s" + "*Key to insert signature.") + +(defvar mime-setup-signature-key-alist '((mail-mode . "\C-c\C-w")) + "Alist of major-mode vs. key to insert signature.") + + +;;; @@ for signature +;;; + +(defun mime-setup-set-signature-key () + (let ((keymap (current-local-map))) + (if keymap + (let ((key + (or (cdr (assq major-mode mime-setup-signature-key-alist)) + mime-setup-default-signature-key))) + (define-key keymap key (function insert-signature)) + )))) + +(when mime-setup-use-signature + (autoload 'insert-signature "signature" "Insert signature" t) + (add-hook 'mime-edit-mode-hook 'mime-setup-set-signature-key) + ;; (setq message-signature nil) + ) + + +;;; @ for mu-cite +;;; + +(add-hook 'mu-cite/pre-cite-hook 'eword-decode-header) + + +;;; @ end +;;; + +(provide 'semi-setup) + +;;; semi-setup.el ends here diff --git a/signature.el b/signature.el new file mode 100644 index 0000000..f06f53c --- /dev/null +++ b/signature.el @@ -0,0 +1,159 @@ +;;; signature.el --- a signature utility for GNU Emacs + +;; Copyright (C) 1994,1995,1996,1997 Free Software Foundation, Inc. + +;; Author: MORIOKA Tomohiko +;; OKABE Yasuo +;; Shuhei KOBAYASHI +;; Maintainer: Shuhei KOBAYASHI +;; Created: 1994/7/11 +;; Version: $Id: signature.el,v 7.16 1997/09/24 23:17:38 shuhei-k Exp $ +;; Keywords: mail, news, signature + +;; This file is part of SEMI (SEMI is Emacs MIME Interfaces). + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(require 'std11) + + +;;; @ valiables +;;; + +(defvar signature-insert-at-eof nil + "*If non-nil, insert signature at the end of file.") + +(defvar signature-delete-blank-lines-at-eof nil + "*If non-nil, signature-insert-at-eof deletes blank lines at the end +of file.") + +(defvar signature-load-hook nil + "*List of functions called after signature.el is loaded.") + +(defvar signature-separator "-- \n" + "*String to separate contents and signature. +It is inserted when signature is inserted at end of file.") + +(defvar signature-file-name "~/.signature" + "*Name of file containing the user's signature.") + +(defvar signature-file-alist nil + "*Alist of the form: + (((FIELD . PATTERN) . FILENAME) + ...) +PATTERN is a string or list of string. If PATTERN matches the contents of +FIELD, the contents of FILENAME is inserted.") + +(defvar signature-file-prefix nil + "*String containing optional prefix for the signature file names") + +(defvar signature-insert-hook nil + "*List of functions called before inserting a signature.") + +(defvar signature-use-bbdb nil + "*If non-nil, Register sigtype to BBDB.") + +(autoload 'signature/get-sigtype-from-bbdb "mime-bbdb") + +(defun signature/get-sigtype-interactively (&optional default) + (read-file-name "Insert your signature: " + (or default (concat signature-file-name "-")) + (or default signature-file-name) + nil)) + +(defun signature/get-signature-file-name () + (save-excursion + (save-restriction + (narrow-to-region + (goto-char (point-min)) + (if (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "$") + nil t) + (match-beginning 0) + (point-max) + )) + (catch 'found + (let ((alist signature-file-alist) cell field value) + (while alist + (setq cell (car alist) + field (std11-field-body (car (car cell))) + value (cdr (car cell))) + (cond ((functionp value) + (let ((name (apply value field (cdr cell)))) + (if name + (throw 'found + (concat signature-file-prefix name)) + ))) + ((stringp field) + (cond ((consp value) + (while value + (if (string-match (car value) field) + (throw 'found + (concat + signature-file-prefix (cdr cell))) + (setq value (cdr value)) + ))) + ((stringp value) + (if (string-match value field) + (throw 'found + (concat + signature-file-prefix (cdr cell))) + ))))) + (setq alist (cdr alist)) + )) + signature-file-name)))) + +(defun insert-signature (&optional arg) + "Insert the file named by signature-file-name. +It is inserted at the end of file if signature-insert-at-eof is non-nil, +and otherwise at the current point. A prefix argument enables user to +specify a file named -DISTRIBUTION interactively." + (interactive "P") + (let ((signature-file-name + (expand-file-name + (or (and signature-use-bbdb + (signature/get-sigtype-from-bbdb arg)) + (and arg + (signature/get-sigtype-interactively)) + (signature/get-signature-file-name)) + ))) + (or (file-readable-p signature-file-name) + (error "Cannot open signature file: %s" signature-file-name)) + (if signature-insert-at-eof + (progn + (goto-char (point-max)) + (or (bolp) (insert "\n")) + (if signature-delete-blank-lines-at-eof (delete-blank-lines)) + )) + (run-hooks 'signature-insert-hook) + (if (= (point)(point-max)) + (insert signature-separator) + ) + (insert-file-contents signature-file-name) + (force-mode-line-update) + signature-file-name)) + + +;;; @ end +;;; + +(provide 'signature) + +(run-hooks 'signature-load-hook) + +;;; signature.el ends here