--- /dev/null
+1999-04-07 Tanaka Akira <akr@jaist.ac.jp>
+
+ * 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 <akr@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-normalize-body): Call `enriched-encode' with
+ three arguments.
+
+1999-02-18 Tanaka Akira <akr@jaist.ac.jp>
+
+ * 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 <akr@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-define-charset): Check `mime-charset-comment'
+ property for mime-charset to add comment.
+
+1999-01-18 Tanaka Akira <akr@jaist.ac.jp>
+
+ * mime-view.el (mime-display-text/x-vcard): Deal with bare LF as newline.
+
+1999-01-17 Tanaka Akira <akr@jaist.ac.jp>
+
+ * 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 <akr@jaist.ac.jp>
+
+ * 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 <akr@jaist.ac.jp>
+
+ * AKEMI-VERSION: New file.
+
+ * semi-def.el (mime-user-interface-product): Bump up to
+ AKEMI 1.12.1.
+
+1999-01-17 Tanaka Akira <akr@jaist.ac.jp>
+
+ * 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 <akr@jaist.ac.jp>
+
+ * mime-view.el (mime-display-text/x-vcard): Fix multibyteness
+ problem.
+
+1998-11-07 Tanaka Akira <akr@jaist.ac.jp>
+
+ * mime-view.el (mime-display-text/x-vcard): Preserve encoding.
+
+1998-11-07 Tanaka Akira <akr@jaist.ac.jp>
+
+ * mime-view.el (mime-display-text/x-vcard): New function.
+ (mime-preview-condition): Set up for 'mime-preview-text/x-vcard.
+
+\f
+1999-01-27 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.13.2 (Mikawa) released.
+
+1999-01-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * README.en: Notice that 1.12.5 or later of FLIM is required.
+
+1999-01-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-reduce-acting-situation-examples): New
+ implementation.
+
+1999-01-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-view-caesar): Select window which displays
+ current-buffer if it is not selected <to fix problem with mouse
+ operations>.
+
+1999-01-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-view-caesar): New implementation.
+
+1999-01-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-view-caesar): Don't expect called in
+ raw-buffer; use `mime-insert-entity'.
+
+1999-01-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1999-01-24 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.13.1 (Kaga-Kasama) released.
+
+1999-01-24 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1999-01-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.13.0 (Matt\e-Dò)\e-A released.
+
+1999-01-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-view-message/rfc822): Don't expect called in
+ raw-buffer.
+
+1999-01-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * NEWS (Changes in SEMI 1.13): New section.
+
+ * NEWS (Changes in SEMI 1.12): New section.
+
+1999-01-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1999-01-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el: Must require `emu'.
+
+1999-01-04 OKUNISHI Fujikazu <fuji0924@mbox.kyoto-inet.or.jp>
+
+ * 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 <yamaoka@jpl.org>
+
+ * mime-view.el (mime-preview-move-to-next): Don't move forward at
+ the end of buffer.
+
+1998-12-03 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mime-edit.el (mime-edit-user-agent-value): Include
+ `xemacs-betaname'.
+
+\f
+1998-12-02 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.12.0 (Nishi-Kanazawa) released.
+
+1998-11-30 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (eliminate-top-spaces): New function (moved from
+ mime-def.el of FLIM).
+
+1998-11-17 Kazuhiro Ohta <ohta@ele.cst.nihon-u.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * NEWS (Changes in SEMI 1.11): New section.
+
+1998-11-18 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * 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 <kei-suzu@mail.wbs.ne.jp>
+
+ * 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'.
+
+\f
+1998-11-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <yamaoka@jpl.org>
+
+ * mime-edit.el (mime-edit-split-ignored-field-regexp): Add "^".
+
+1998-11-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-bbdb.el (mime-bbdb/update-record): Use
+ `mime-decode-field-body' instead of
+ `eword-decode-structured-field-body'.
+
+1998-10-31 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-10-31 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.10.2 (Higashi-Kanazawa) released.
+
+1998-10-29 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * NEWS (Abolish variable `mime-temp-directory'): New subsection.
+
+1998-10-27 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mime-edit.el (mime-edit-decode-buffer): Limit search bound for
+ "Content-Transfer-Encoding:".
+
+\f
+1998-10-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el, mime-pgp.el, mime-partial.el, mime-image.el,
+ mime-edit.el: Use `temporary-file-directory' instead of
+ `mime-temp-directory'.
+
+\f
+1998-10-23 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.10.0 (Tsubata) released.
+
+1998-10-22 Yoshiki Hayashi <g740685@komaba.ecc.u-tokyo.ac.jp>
+
+ * README.ja: New file.
+
+1998-10-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el, mime-view.el: Use `(featurep 'xemacs)' instead of
+ `running-xemacs'.
+
+1998-10-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * semi-setup.el (mime-setup-enable-inline-image): Use `(featurep
+ 'xemacs)' instead of `running-xemacs'.
+
+1998-10-20 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-decode-buffer): Convert encoding to
+ lower case.
+
+1998-10-19 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-decode-buffer): Call
+ `mule-caesar-region' for text/x-rot13-47-48 entity.
+
+1998-09-22 Shozo UEHARA <uehara@eken.phys.nagoya-u.ac.jp>
+
+ * mime-play.el (mime-raw-play-entity): Initialize `max-escore' by
+ 0. <cf. [tm-ja:3432]>
+
+1998-10-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-10-14 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.9.1 (Kurikara) released.
+
+1998-10-14 Jari Aalto <jari.aalto@poboxes.com>
+
+ * mime-edit.el (mime-file-types): Add some new mime types, and
+ rearrange the types to logical sections: text; octext text and
+ binary. <cf. [tm-en:1856]>
+
+1998-10-12 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Abolish variable `SHELL' and `SHELLOPTION'.
+
+1998-10-08 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * SEMI-CFG: Use `add-latest-path' for adding "custom" to
+ load-path.
+
+1998-10-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Don't use `when' before install is required; don't
+ require cl.
+
+1998-10-08 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * SEMI-CFG: Add "custom" to load-path.
+
+\f
+1998-10-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.9.0 (Isurugi) released.
+
+1998-10-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * README.en (Required environment): Modify for APEL 9.1 and FLIM
+ 1.10.1.
+
+1998-10-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-charset-type-list): Use `cn-gb' instead of
+ `cn-gb2312' because `cn-gb2312' is typo.
+
+1998-09-29 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-user-agent-value): Add
+ system-configuration for Emacs and XEmacs.
+
+1998-09-20 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-normalize-body): Use "7bit" for nil
+ encoding as an argument of `mime-encode-region'.
+
+\f
+1998-09-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.8.6 (Fukuoka) released.
+
+1998-09-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <tanaka@ifos.se.fujitsu.co.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-08-31 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-type-subtype-score-alist): Fix
+ mismatched.
+
+1998-08-10 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-text.el (mime-text-insert-decoded-body): Specify line break
+ code type as CRLF.
+
+1998-08-10 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-normalize-body): Failed to canonicalize
+ empty lines.
+
+1998-08-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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).
+
+\f
+1998-07-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.8.4 (Takaoka) released.
+
+1998-07-14 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-07-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * REMI: Version 1.8.4 (Takaoka) released.
+
+1998-07-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-preview-message): Use `mime-view-buffer'
+ instead of `mime-view-mode'.
+
+\f
+1998-07-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * REMI: Version 1.8.3 (Ecch\e-Dþ-Nakagawa)\e-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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-07-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * REMI: Version 1.8.2 (N\e-Dòmachi)\e-A released.
+
+1998-07-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-preview-play-current-entity): Fix problem
+ when `mode' is omitted with non-interactive mode (maybe for button
+ dispatcher).
+
+\f
+1998-07-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * REMI: Version 1.8.1 (Fushiki) released.
+
+1998-07-05 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-file-content-type-alist): Add "Standard
+ MIDI".
+
+ * mime-play.el (mime-detect-content): Fixed.
+
+1998-07-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-activate-mailcap-method): Check filename is
+ null string.
+
+1998-07-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-ui-ja.sgml, mime-ui-ja.texi: New files; delete
+ mime-view-ja.sgml and mime-view-ja.texi.
+
+\f
+1998-07-01 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-activate-mailcap-method): Use
+ `mime-write-entity-content'.
+
+\f
+1998-06-30 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.8.1 (Kureha) released.
+
+1998-06-29 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-save-content): Use
+ `mime-write-entity-content'.
+
+1998-06-29 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-pgp.el (mime-view-application/pgp): Specify
+ representation-type by argument of `mime-view-buffer'.
+
+1998-06-28 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-06-28 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * REMI: Version 1.8.0 (Ecch\e-Dþ-Kokubu)\e-A released.
+
+1998-06-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * README.en (Required environment): Modify for FLIM 1.7.0.
+
+ * mime-view.el (mime-view-mode): New implementation.
+
+1998-06-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-text.el (mime-display-text/plain): Must rename
+ `mime-browse-add-url-button' to `mime-add-url-buttons'.
+
+1998-06-25 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * 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 <shuhei-k@jaist.ac.jp>
+
+ * 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 <shuhei-k@jaist.ac.jp>
+
+ * 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 <shuhei-k@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-06-24 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * NEWS (Changes in SEMI 1.8): New chapter.
+
+1998-06-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el: Abolish external x-face viewer.
+
+1998-06-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-display-message): Delete unnecessary
+ `mime-parse-buffer'.
+
+\f
+1998-06-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <shuhei-k@jaist.ac.jp>
+
+ * 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 <shuhei-k@jaist.ac.jp>
+
+ * SEMI-CFG: Support run-in-place installation of BBDB and
+ Emacs/W3.
+
+1998-06-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-entity-safe-filename): New implementation.
+
+1998-06-20 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-text.el (mime-text-insert-decoded-body): Delete unnecessary
+ `save-restriction'.
+
+1998-06-20 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * semi-def.el: Require 'custom.
+
+1998-06-19 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el: Don't require `mime-parse'.
+
+1998-06-19 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: - Modify for FLIM 1.5.0.
+ - Don't signal error if tm is found in load-path.
+
+1998-06-19 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-save-content): Use `mime-entity-body-start'
+ and `mime-entity-body-end'.
+
+1998-06-19 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-bbdb.el (mime-bbdb/update-record): Use
+ `mime-entity-fetch-field' and `mime-entity-read-field'.
+
+1998-06-19 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * SEMI-CFG: Require 'cl first.
+
+\f
+1998-06-18 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.7.0 (Mizuhashi) released.
+
+1998-06-17 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-insert-entity-button): Change interface.
+
+1998-06-17 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-entity-title): Renamed from
+ `mime-raw-get-subject'; use `mime-entity-read-field'.
+
+1998-06-17 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * NEWS (Changes in SEMI 1.7): New chapter.
+ (Changes in SEMI 1.6): Add description of entity-detection.
+
+1998-06-17 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el: Rename `mime-view-following-method-alist' to
+ `mime-preview-following-method-alist'.
+
+1998-06-17 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-partial.el: Rename
+ `mime-method-to-combine-message/partial-pieces' to
+ `mime-combine-message/partial-pieces-automatically'.
+
+1998-06-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el, mime-view.el: Rename
+ `mime-method-to-display-message/rfc822' to
+ `mime-view-message/rfc822'.
+
+1998-06-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el, mime-view.el: Rename `mime-method-to-detect' to
+ `mime-detect-content'.
+
+1998-06-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-activate-mailcap-method): Fixed.
+
+1998-06-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * README.en (Required environment): Modify for FLIM 1.4.0.
+
+1998-06-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-parse.el: Move function `mime-entity-number' to FLIM layer.
+
+1998-06-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-parse.el: Change order of `mime-entity'.
+
+\f
+1998-06-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.6.0 (Namerikawa) released.
+
+1998-06-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view-ja.texi, mime-view-ja.sgml: New files.
+
+ * mime-view.el (mime-view-mode): Fix DOC-string.
+
+1998-06-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-file-content-type-alist): Renamed from
+ `mime-file-type-regexp-type-subtype-alist'.
+
+1998-06-14 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-sort-situation): Modify for
+ Content-Disposition information.
+
+1998-06-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el: Abolish variable `mime-view-show-summary-method'
+ and function `mime-preview-show-summary'.
+
+1998-06-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-entity-situation): Add information of
+ Content-Disposition.
+
+1998-06-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * NEWS: Add description about mime-w3.el.
+
+1998-06-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-w3.el (mime-save-background-color): New macro.
+ (mime-preview-text/html): Use `mime-save-background-color'.
+
+1998-06-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-enclose-region-internal): Abolish unused
+ local variable.
+
+1998-06-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1998-06-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.5.4 (Higashi-Namerikawa) released.
+
+ * mime-edit.el (mime-edit-normalize-body): Abolish unused local
+ variable.
+
+1998-06-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-w3.el (mime-put-keymap-region): New macro.
+ (mime-preview-text/html): Use macro `mime-put-keymap-region'.
+
+1998-06-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-preview-multipart/alternative): Fix typo.
+
+1998-06-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-x-emacs-value): Check
+ `enable-multibyte-characters' is bound or not.
+
+\f
+1998-06-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-parse.el (mime-parse-multipart): fixed.
+
+\f
+1998-06-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * TODO (Better implementation for multipart/alternative): done.
+
+ * NEWS (type-subtype-score): New section.
+
+1998-06-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-06-05 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-preview-multipart/mixed): New function.
+ (mime-view-display-entity): Use `mime-preview-multipart/mixed'.
+
+1998-06-05 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-display-entity): Display entity-button
+ in body if button is invisible and body-presentation-method is not
+ found.
+
+\f
+1998-06-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.5.0 (Nishi-Ny\e-Dþzen)\e-A released.
+
+ * README.en (Required environment): Modify for FLIM 1.3.0.
+
+1998-06-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-parse.el (mime-parse-multipart): fixed.
+
+\f
+1998-06-01 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.4.6 (Ny\e-Dþzen)\e-A released.
+
+1998-05-28 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el: Rename 'mime-view-insert-message/partial-button to
+ 'mime-preview-message/partial-button.
+
+1998-05-28 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-parse.el (mime-parse-multipart): Use
+ 'mime-content-type-parameter.
+
+1998-05-28 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <yamaoka@jpl.org>
+
+ * mime-view.el (mime-preview-scroll-down-entity): Use (not (bobp))
+ instead of (> (point) 1).
+
+1998-05-25 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mime-play.el (mime-preview-play-current-entity): Don't widen.
+
+1998-05-25 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * 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.
+
+\f
+1998-05-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.4.5 (Tomari) released.
+
+ * README.en (Mailing lists): Add notice about direct-mail for
+ authors.
+
+1998-05-19 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-display-message): fixed.
+
+1998-05-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-display-entity): fixed.
+
+ * mime-parse.el (mime-parse-multipart): Change interface.
+
+1998-05-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-setup.el: Avoid warning message of byte-compiler.
+
+\f
+1998-05-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.4.4 (Ecch\e-Dþ-Miyazaki)\e-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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-activate-mailcap-method): Regard
+ 'mime-temp-directory.
+
+1998-05-14 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-05-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.4.3 (Ichiburi) released.
+
+1998-05-12 Kazuhiro Ohta <ohta@ele.cst.nihon-u.ac.jp>
+
+ * mime-partial.el: start and end of the region fixed.
+
+1998-05-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-parse.el: Change data format of mime-content-disposition.
+
+1998-05-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-parse.el: Rename 'mime/Content-Transfer-Encoding ->
+ 'mime-read-Content-Transfer-Encoding.
+
+1998-05-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-parse.el, mime-play.el, mime-view.el: Rename
+ 'mime/Content-Disposition -> 'mime-read-Content-Disposition.
+
+1998-05-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * Makefile (PACKAGE): New variable.
+ (tar): Use $(PACKAGE).
+
+1998-05-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-parse.el: Change data format of mime-content-type.
+
+1998-05-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-parse.el: Abolish function 'symbol-concat because it is not
+ used.
+
+\f
+1998-05-10 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.4.2 (Oyashirazu) released.
+
+1998-05-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * README.en (Authors): New section.
+
+ * README.en (CVS based development): New section.
+
+1998-05-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <jas@pdc.kth.se>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el: Use 'ctree-set-calist-with-default instead of
+ 'ctree-set-calist-strictly to set up mailcap entries.
+
+\f
+1998-05-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.4.1 (\e-DÒmi)\e-A released.
+
+ * README.en (Required environment): Modify for FLIM 1.2.0.
+
+1998-05-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-parse.el: Move 'mime-type/subtype-string to
+ flim/mime-def.el.
+
+1998-05-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-sort-situation): New function.
+ (mime-raw-play-entity): Use 'mime-sort-situation.
+
+1998-05-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-activate-mailcap-method): Use
+ 'mailcap-format-command.
+
+1998-05-05 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * README.en (What's SEMI?): Add description about mailcap.
+ (Documentation): Add RFC 1524; change location of RFC.
+
+\f
+1998-05-05 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * semi-def.el: Abolish 'mime/find-file-function because it is not
+ used.
+
+1998-05-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * NEWS: Add description for SEMI 1.4.
+
+1998-05-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-acting-condition): Use
+ 'ctree-set-calist-with-default to set up 'mime-method-to-save.
+
+1998-05-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-acting-condition): Delete setting for
+ metamail.
+
+1998-05-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mailcap.el: Move mailcap.el to FLIM.
+
+1998-05-02 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-raw-play-entity): Sort before registering to
+ 'mime-acting-situation-examples.
+
+\f
+1998-04-30 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.3.4 (Kajiyashiki) released.
+
+1998-04-29 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Modify messages for APEL 8.7.
+
+ * README.en (Required environment): Modify for APEL 8.7.
+
+1998-04-29 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-find-every-acting-situation): Change
+ default value to 't.
+
+1998-04-29 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-raw-play-entity): Use
+ 'ctree-match-calist-partially.
+
+\f
+1998-04-28 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.3.3 (Uramoto) released.
+
+1998-04-27 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-user-acting-condition): New variable.
+ (mime-raw-play-entity): Refer it.
+
+1998-04-27 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-04-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.3.2 (N\e-Dò)\e-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 <morioka@jaist.ac.jp>
+
+ * mime-play.el (mime-raw-play-entity): Use 'ctree-match-calist
+ directly; abolish 'mime/get-content-decoding-alist.
+
+\f
+1998-04-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-split-ignored-field-regexp): Add
+ Message-Id field.
+
+1998-04-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mail-mime-setup.el: Must require 'alist.
+
+\f
+1998-04-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.3.0 (Nadachi) was released.
+
+1998-04-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * semi-def.el: Don't require 'atype; abolish function
+ 'field-unifier-for-mode.
+
+1998-04-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-04-19 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-04-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-04-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.2.2 (Naoetsu) was released.
+
+ * README.en: Modify for FLIM.
+
+1998-04-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Modify messages for FLIM and APEL 8.2.
+
+1998-04-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Add "flim" instead of "rime" to 'load-path.
+
+1998-04-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-pgp.el (mime-preview-condition): Add (message-button
+ . visible) to application/pgp again.
+
+1998-04-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Add "rime" instead of "mel" to 'load-path.
+
+1998-04-10 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1998-04-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.2.1 (Nomachi) was released.
+
+1998-04-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * TODO: New file.
+
+1998-04-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1998-03-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.2.0 (Nishiizumi) was released.
+
+ * NEWS: Update for SEMI 1.2.
+
+1998-03-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el, mime-text.el, mime-image.el: Rename
+ 'mime-view-filter-for-* -> 'mime-preview-filter-for-*.
+
+1998-03-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-text.el: Rename 'mime-decode-text-body ->
+ 'mime-text-decode-body.
+
+1998-03-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-text.el (mime-decode-text-body): Change interface; call
+ 'mime-text-decode-hook.
+
+1998-03-23 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * VERSION: New file.
+
+\f
+1998-03-23 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.1.2 (Shin-Nishikanazawa) was released.
+
+1998-03-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * NEWS: Modify about 'body-filter.
+
+1998-03-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-display-entity): Modify to omit check
+ for body-presentation-method.
+
+1998-03-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * NEWS: Modify about `mime-preview-condition'.
+
+1998-03-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el: Require 'mime-text when compiling.
+
+1998-03-21 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * eword-decode.el (eword-lexical-analyze-internal): Fixed return
+ value.
+
+ * mime-view.el (mime-view-body-visible-condition): text media-
+ type is always visible.
+
+\f
+1998-03-20 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * NEWS: Update for latest version.
+
+1998-03-20 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Must set up load-path before version check codes.
+
+1998-03-20 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * NEWS: New file.
+
+\f
+1998-03-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.1.0 (Nonoichi) was released.
+
+1998-03-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Insert version check code.
+
+1998-03-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-display-body): Change interface.
+
+1998-03-14 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mailcap.el (mailcap-look-at-field): Change field-name to symbol.
+
+1998-03-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mailcap.el (mailcap-look-at-type-field): Must allow
+ "implicit-wild".
+ (mailcap-look-at-field): fixed.
+
+1998-03-13 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * README.en (Bug reports): Modify description of tm mailing list.
+
+1998-03-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el: Rename `mime-article::write-region' ->
+ `mime-raw-write-region'.
+
+1998-03-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-raw-content-info): Modify DOC-string.
+
+1998-03-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * eword-encode.el: Abolish `eword-encode-RCS-ID'.
+
+1998-03-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-partial.el: Rename
+ `mime-combine-message/partials-automatically' ->
+ `mime-method-to-combine-message/partial-pieces'.
+
+1998-03-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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.
+
+\f
+1998-03-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.0.2 (Nonoichi-K\e-Dòdaimae)\e-A was released.
+
+1998-03-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * README.en (What's SEMI?): Remove what does SEMI stand for.
+
+1998-03-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <pinard@iro.umontreal.ca>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-insert-text): New optional argument
+ `subtype'.
+
+\f
+1998-02-28 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.0.1 (Magae) was released.
+
+1998-02-27 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-pgp.el (mime-check-multipart/signed): New function.
+
+1998-02-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * eword-decode.el (eword-decode-and-fold-structured-field): Fixed.
+
+ * mime-edit.el (mime-file-types): Use `defcustom'.
+
+\f
+1998-02-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 1.0.0 (Nukaj\e-Dþtaku-mae)\e-A was released.
+
+ * SEMI-ELS: Remove mime-tar.el.
+
+1998-02-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1998-02-17 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * eword-decode.el (eword-decode-header): New implementation; add
+ new argument `CODE-CONVERSION' as first argument. Change
+ `SEPARATOR' as second argument.
+
+\f
+1998-02-12 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.118.1 (Shijima) was released.
+
+ * README.en (Bug reports): Modified for SEMI.
+
+1998-02-06 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-normalize-body): Must not ignore case to
+ search "From " in beginning of line.
+
+1998-01-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-image.el: Comment out setting for inline Postscript
+ feature.
+
+1998-01-11 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <Thierry.Emery@aar.alcatel-alsthom.fr>
+
+ * mime-edit.el (mime-edit-insert-text): Fix to avoid unexpected
+ entering enriched-mode. (cf. [tm-ja:2697])
+
+\f
+1997-11-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.118 (Sodani) was released.
+
+1997-11-24 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-maybe-hide-echo-buffer): bury MIME echo
+ buffer.
+
+1997-11-23 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1997-11-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.116 (D\e-Dòhòji)\e-A was released.
+
+1997-11-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el, mime-pgp.el, mime-partial.el: Rename
+ `mime::article/content-info' -> `mime-raw-content-info'.
+
+1997-11-11 François Pinard <pinard@iro.umontreal.ca>
+
+ * mime-edit.el: Modify space in prompt and removespurious trailing
+ spaces in the files. (cf. [tm-en:1507])
+
+1997-11-08 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-bbdb.el, semi-setup.el: Use path-util.el instead of
+ file-detect.el.
+
+1997-11-05 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-def.el: Add group `mime' to `default-mime-charset'.
+
+1997-11-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * eword-encode.el (eword-encode-field): Must regard MIME-Version
+ field as structured field.
+
+\f
+1997-11-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.115.2 (Inokuchi) was released.
+
+1997-11-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * Makefile: Abolish `execs' and `install-execs'.
+
+1997-11-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-x-emacs-value): Don't add mule-version
+ if enable-multibyte-characters is nil.
+
+1997-10-31 Kazuhiro Ohta <ohta@ele.cst.nihon-u.ac.jp>
+
+ * mime-play.el (mime-article::write-region): fixed
+ (cf. [tm-ja:2641]).
+
+1997-10-21 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * semi-setup.el (mime-setup-set-signature-key): Check local keymap
+ is exist or not to fix problem about
+ `gnus-summary-resend-message'.
+
+\f
+1997-10-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.115.1 (Oyanagi) was released.
+
+1997-10-03 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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).
+
+\f
+1997-09-28 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.115 (Hinomiko) was released.
+
+ * README.en: Modify for Emacs 20.2.
+
+1997-09-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-def.el (butlast, nbutlast): Don't use `defun-maybe' for cl
+ functions.
+
+1997-09-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-def.el (butlast): New function; imported from cl.el.
+ (nbutlast): New function; imported from cl.el.
+
+1997-09-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-image.el: Use `exec-installed-p' to search
+ `uncompface-program'.
+
+1997-09-24 Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-x-emacs-value): Use `(featurep
+ 'xemacs)'; add DOC-string.
+
+1997-09-17 Hisashi Miyashita <himi@bird.scphys.kyoto-u.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-mime-version-field-for-message/partial):
+ New constant.
+ (mime-edit-insert-partial-header): Use it.
+
+\f
+1997-09-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.112 (Tsurugi) was released.
+
+1997-09-05 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-parse.el, mime-def.el: Constant
+ `mime-disposition-type-regexp' was moved from mime-def.el to
+ mime-parse.el.
+
+\f
+1997-07-25 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.97 (Naka-Tsurugi) was released.
+
+1997-07-24 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el: Delete unnecessary "[mime-edit.el]" from
+ DOC-strings.
+
+1997-07-23 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * eword-decode.el (eword-analyze-encoded-word): cdr of return
+ value must not nil (cf.[tm-ja:2496])
+
+1997-07-14 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el, mime-play.el: `mime-article/view-message/rfc822'
+ -> `mime-display-message/rfc822'.
+
+1997-07-13 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1997-07-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.96 (Kaga-Ichinomiya) was released.
+
+1997-07-05 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * signature.el (signature-separator): New variable.
+ (insert-signature): Insert `signature-separator' when signature is
+ inserted at end of file.
+
+1997-07-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * README.en (Required environment): Updated.
+
+1997-07-02 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-parse.el, mime-def.el: `mime/content-type-subtype-regexp'
+ -> `mime-media-type/subtype-regexp'.
+
+1997-07-02 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el, mime-pgp.el, mime-def.el: `mime/temp-buffer-name'
+ -> `mime-temp-buffer-name'.
+
+1997-07-02 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-text.el (mime-decode-text-body): Canonicalize line break
+ code.
+
+1997-06-27 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mailcap.el: New file.
+
+1997-06-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * eword-encode.el (eword-field-encoding-method-alist): Add
+ "Message-ID" as ignored.
+
+1997-06-26 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1997-06-19 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * eword-decode.el (eword-decode-structured-field-body): fixed.
+
+1997-06-16 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <steve@xemacs.org>
+
+ * 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])
+
+\f
+1997-05-30 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.91 was released.
+
+Wed May 28 13:16:15 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-define-keymap): fixed problem about
+ [tab], [delete] and [backspace] keys.
+
+Tue May 27 03:26:23 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-sign-pgp-elkins): Enclose PGP-processing
+ by `as-binary-process'.
+
+1997-05-23 Steven L Baur <steve@altair.xemacs.org>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-define-keymap): Doesn't bind
+ `beginning-of-buffer' and `end-of-buffer' for "<" and ">" keys.
+
+\f
+1997-05-15 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.88 was released.
+
+Thu May 15 06:05:13 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * Makefile (tar): New implementation.
+
+Tue May 13 14:32:39 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-tar.el, mime-play.el, mime-pgp.el, mime-file.el,
+ mime-view.el: `mime/content-decoding-condition' ->
+ `mime-acting-condition'.
+
+\f
+1997-05-09 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.87 was released.
+
+Fri May 9 04:19:21 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-tar.el: `mime-viewer/uuencode-encoding-name-list' ->
+ `mime-view-uuencode-encoding-name-list'.
+
+Fri May 9 03:07:02 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-play.el, mime-edit.el, mime-def.el: `tm:caesar-region' ->
+ `caesar-region'.
+
+Thu May 8 22:37:47 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-define-keymap): Use
+ `set-keymap-default-binding' for XEmacs.
+
+Wed May 7 10:04:36 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-cut-header): fixed. (cf.[tm-ja:2386])
+
+\f
+1997-04-30 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI: Version 0.83 was released.
+
+Sat Apr 5 06:20:34 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-def.el: Overlay is required by emu.
+
+Thu Apr 3 18:09:35 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-content-end): Abolish unused local
+ variable `beg'.
+
+Thu Mar 27 21:45:49 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-view-follow-current-entity): Abolish unused
+ local variable `rc'.
+
+Thu Mar 27 21:42:08 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-pgp.el (mime-article/check-pgp-signature): Use
+ `insert-buffer-substring'.
+
+Thu Mar 27 20:59:00 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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'.
+
+\f
+1997-03-18 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * MU: Version 0.40.2 was released.
+ * SEMI: Version 0.75 was released.
+
+Tue Mar 18 15:28:25 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-edit-translate-single-part-tag): Add
+ DOC-string.
+
+Tue Mar 18 15:21:28 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-view.el: `mime::preview/original-major-mode' ->
+ `mime-view-original-major-mode'.
+
+Tue Mar 18 15:17:48 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el, mime-view.el: `mime::preview/mother-buffer' ->
+ `mime-mother-buffer'.
+
+Tue Mar 18 15:12:10 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-partial.el (mime-combine-message/partials-automatically):
+ Don't use preview-content-list.
+
+Tue Mar 18 13:06:09 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el: Use `mime-play-entity' instead of
+ `mime-view-play-content'.
+
+Mon Mar 17 05:06:33 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-pgp.el (mime-article/view-application/pgp): Use
+ `insert-buffer-substring'.
+
+Sat Mar 15 22:27:53 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-pgp.el: `mime/viewer-mode' -> `mime-view-mode'.
+ (cf. [tm-en:1259])
+
+\f
+1997-03-14 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * SEMI-ELS (semi-modules-to-compile): Add mail-mime-setup.el.
+
+Fri Mar 14 08:47:06 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * SEMI-MK: Don't compile and install other packages.
+
+Fri Mar 14 06:09:23 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * semi-setup.el: Require file-detect.
+
+Wed Mar 12 07:49:41 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI-CFG: Delete variables about other packages.
+
+Mon Mar 10 15:16:26 1997 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-def.el: Variable `mime-temp-directory' was moved to
+ mel/mel.el.
+
+1997-03-10 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-partial.el (mime-article/grab-message/partials): Don't use
+ `assoc-value'.
+
+1997-03-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-play.el: Require filename.
+
+1997-03-07 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el: `mime-prefix' -> `mime-edit-prefix'.
+
+1997-03-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * semi-setup.el: tm-pgp.el was already renamed to mime-pgp.el.
+
+1997-03-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-def.el (pgp-function-alist): `tm:mc-' -> `mime-mc-'.
+
+1997-03-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-def.el (mime-temp-directory): Refer environment variable
+ "MIME_TMP_DIR" as default value.
+
+1997-03-04 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-view.el (mime-preview/insert-content-button): Don't use
+ function `assoc-value'.
+
+1997-03-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-bbdb.el: `mime-bbdb-' -> `mime-bbdb/'.
+
+1997-03-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * SEMI-MK: compile and install emu and apel.
+
+1997-03-03 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * semi-setup.el: require mime-play instead of mime-view when
+ compiling.
+
+Fri Feb 28 04:21:43 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * mime-play.el (field-unify): Fixed.
+
+Fri Feb 28 02:22:38 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * mime-parse.el (char-list-to-string): New inline-function; copied
+ from emu-19.el.
+
+Thu Feb 27 13:43:38 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * semi-setup.el (running-xemacs): New variable.
+
+Thu Feb 27 09:00:33 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * mime-play.el: `mime/viewer-mode' -> `mime-view-mode'.
+
+ * mime-def.el: fixed DOC string.
+
+Thu Feb 27 08:56:45 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * mime-tar.el: Don't require emu.
+
+Thu Feb 27 08:34:21 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * mime-pgp.el: Renamed from tm-pgp.el.
+
+Thu Feb 27 08:05:45 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * eword-decode.el (eword-decode-encoded-word): Use
+ `add-text-properties' directly.
+
+Wed Feb 26 07:44:22 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * eword-encode.el (eword-encode-header): fixed typo.
+
+Mon Feb 24 10:04:23 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * mime-play.el: require tl-atype.
+
+ * mime-view.el: Don't require tl-atype.
+
+Mon Feb 24 09:58:14 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * mime-view.el: Don't require tl-misc.
+
+Mon Feb 24 09:57:03 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * SEMI-ELS: Renamed from TM-ELS.
+
+1997-02-22 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-def.el: Renamed from tm-def.el.
+
+Fri Feb 21 08:04:42 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * mime-view.el: Don't `suppress-keymap'.
+
+Fri Feb 21 07:42:32 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * mime-setup.el: modified for mime-edit.el.
+
+Fri Feb 21 07:02:52 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * mime-edit.el: `mime-editor/' -> `mime-edit-'.
+
+Fri Feb 21 06:57:11 1997 Tomohiko Morioka <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <tmorioka@mule.etl.go.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-file-types): add for patch.
+
+ * mime-edit.el: rearrangement.
+
+Wed Jul 10 12:05:05 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime/editor-mode): Don't toggle.
+
+ (mime-editor/toggle-mode): New function.
+
+Tue Jul 2 14:06:53 1996 Alastair Burt <burt@dfki.uni-kl.de>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el: Variable
+ `mime-editor/message-default-sender-alist' was abolished.
+
+Sun Jun 9 06:40:26 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el: Variable `mime-editor/window-config-alist' was
+ abolished.
+
+Sun Jun 9 06:35:10 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-editor/split-and-send): New implementation.
+
+Mon Jun 3 17:39:10 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-editor::edit-again): fixed about multipart.
+
+Wed May 29 09:57:53 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-editor/insert-binary-buffer): fixed.
+ (mime-editor/normalize-body): fixed.
+
+Sat May 25 20:47:32 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-editor/process-multipart-1): Use function
+ `string-equal' instead of `string='.
+
+Sat May 25 15:48:33 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-editor/process-multipart-1): fixed about
+ condition of next tag inserting.
+
+Sat May 25 15:36:58 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * mime-edit.el (mime-editor/enclose-region): fixed for new format.
+
+Sat May 25 15:15:03 1996 MORIOKA Tomohiko <morioka@jaist.ac.jp>
+
+ * 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 <morioka@jaist.ac.jp>
+
+ * 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
--- /dev/null
+#
+# 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)
--- /dev/null
+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.
+
+
+\f
+* Changes in SEMI 1.12
+
+There are no user-visible changes.
+
+** New function `eliminate-top-spaces'
+
+Now mime-edit has it.
+
+\f
+* 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
+
+\f
+* 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'.
+
+\f
+* 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'.
+
+\f
+* 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.
+
+\f
+* 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'
+
+\f
+* 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'.
+
+\f
+* 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.
+
+\f
+* 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.
+
+\f
+* 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.
+
+\f
+* 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.
+
+\f
+* 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
+ <STRING> 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:
+
+ <body-filter> (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
+
+\f
+Local variables:
+mode: outline
+paragraph-separate: "[ \f]*$"
+end:
--- /dev/null
+[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 <morioka@jaist.ac.jp>
+ (the author of mime-view and various parts of SEMI)
+ UMEDA Masanobu <umerin@mse.kyutech.ac.jp>
+ (the author of mime.el of emacs-mime-tools. mime.el is the
+ origin of mime-edit.el of SEMI)
+
+Other authors
+
+ Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+ (a major author of signature.el and a lot of codes)
+ MASUTANI Yasuhiro <masutani@me.es.osaka-u.ac.jp>
+ (anonymous ftp codes of mime-play.el)
+ OKABE Yasuo <okabe@kudpc.kyoto-u.ac.jp>
+ (a major author of mime-partial.el and signature.el)
+
+ Steinar Bang <sb@metis.no>
+ Steven L. Baur <steve@miranova.com>
+ Kevin Broadey <KevinB@bartley.demon.co.uk>
+ Alastair Burt <burt@dfki.uni-kl.de>
+ Eric Ding <ericding@San-Jose.ate.slb.com>
+ Thierry Emery <Thierry.Emery@aar.alcatel-alsthom.fr>
+ Simon Josefsson <jas@pdc.kth.se>
+ Jens Lautenbacher <jtl@tkm.physik.uni-karlsruhe.de>
+ Carsten Leonhardt <leo@arioch.tng.oche.de>
+ Pekka Marjola <marjola@bilbo.ntc.nokia.com>
+ Hisashi Miyashita <himi@bird.scphys.kyoto-u.ac.jp>
+ Kazuhiro Ohta <ohta@ele.cst.nihon-u.ac.jp>
+ Alexandre Oliva <oliva@dcc.unicamp.br>
+ François Pinard <pinard@iro.umontreal.ca>
+ Artur Pioro <artur@flugor.if.uj.edu.pl>
+ Dan Rich <drich@morpheus.corp.sgi.com>
+ (contribute to evolve mime-image.el with XEmacs)
+ Katsumi Yamaoka <yamaoka@jpl.org>
--- /dev/null
+;;; -*-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))
+
+
+\f
+
+;;; @ 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
--- /dev/null
+;;; -*-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
--- /dev/null
+;;; -*-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
** 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
--- /dev/null
+[SEMI Version names]
+
+0.72 -------- --------
+0.75 -------- --------
+0.83 -------- --------
+0.87 -------- --------
+0.88 -------- --------
+0.91 -------- --------
+0.92 -------- --------
+
+;;-------------------------------------------------------------------------
+;; Hokuriku Railway \e$(BKLN&E4F;\e(B
+;; Ishikawa Line \e$(B@P@n@~\e(B
+;;-------------------------------------------------------------------------
+0.96 Kaga-Ichinomiya \e$(B2C2l0l$N5\\e(B ; \e$(B!JGr;3Hf\e$(D5/\e$(B?@<R!K\e(B
+0.97 Naka-Tsurugi \e$(BCfDaMh\e(B
+0.112 Tsurugi \e$(BDaMh\e(B ; <=> \e$(B$8$c$$%P%9\e(B
+0.115 Hinomiko \e$(BF|8f;R\e(B
+0.115.1 Oyanagi \e$(B>.Lx\e(B
+0.115.2 Inokuchi \e$(B0f8}\e(B
+0.116 D\e-Dòhòji\e-A \e$(BF;K!;{\e(B
+0.118 Sodani \e$(BA>C+\e(B
+0.118.1 Shijima \e$(B;M==K|\e(B
+0.118.2 Otomaru \e$(B254]\e(B
+1.0.0 Nukaj\e-Dþtaku-mae\e-A \e$(B3[=;BpA0\e(B
+1.0.1 Magae \e$(BGOBX\e(B
+1.0.2 Nonoichi-K\e-Dòdaimae\e-A \e$(BLn!9;T9)BgA0\e(B
+1.1.0 Nonoichi \e$(BLn!9;T\e(B
+1.1.1 Oshino \e$(B2!Ln\e(B
+1.1.2 Shin-Nishikanazawa \e$(B?7@>6bBt\e(B ; <=> JR \e$(B@>6bBt\e(B
+1.2.0 Nishiizumi \e$(B@>@t\e(B
+1.2.1 Nomachi \e$(BLnD.\e(B
+
+;;-------------------------------------------------------------------------
+;; West Japan Railway \e$(B@>F|K\N95RE4F;\e(B http://www.westjr.co.jp/
+;; Hokuriku Line \e$(BKLN&K\@~\e(B
+;;-------------------------------------------------------------------------
+1.2.2 Naoetsu \e$(BD>9>DE\e(B ; = JR \e$(B?.1[K\@~\e(B
+1.2.3 Tanihama \e$(BC+IM\e(B
+1.2.4 Arimagawa \e$(BM-4V@n\e(B
+1.3.0 Nadachi \e$(BL>N)\e(B
+1.3.1 Tsutsuishi \e$(BE{@P\e(B
+1.3.2 N\e-Dò\e-A \e$(BG=@8\e(B
+1.3.3 Uramoto \e$(B1:K\\e(B
+1.3.4 Kajiyashiki \e$(B3a20I_\e(B
+1.4.0 Itoigawa \e$(B;e5{@n\e(B ; = JR \e$(BBg;e@~\e(B
+1.4.1 \e-DÒmi\e-A \e$(B@D3$\e(B
+1.4.2 Oyashirazu \e$(B?FITCN\e(B
+1.4.3 Ichiburi \e$(B;T?6\e(B
+1.4.4 Ecch\e-Dþ-Miyazaki\e-A \e$(B1[Cf5\:j\e(B
+1.4.5 Tomari \e$(BGq\e(B
+1.4.6 Ny\e-Dþzen\e-A \e$(BF~A1\e(B
+1.5.0 Nishi-Ny\e-Dþzen\e-A \e$(B@>F~A1\e(B
+1.5.1 Ikuji \e$(B@8CO\e(B
+1.5.2 Kurobe \e$(B9uIt\e(B
+1.5.3 Uozu \e$(B5{DE\e(B ; <=> \e$(BIY;3COJ}E4F;\e(B
+1.5.4 Higashi-Namerikawa \e$(BEl3j@n\e(B
+1.6.0 Namerikawa \e$(B3j@n\e(B ; <=> \e$(BIY;3COJ}E4F;\e(B
+1.7.0 Mizuhashi \e$(B?e66\e(B
+1.7.1 Higashi-Toyama \e$(BElIY;3\e(B
+1.8.0 Toyama \e$(BIY;3\e(B ; = JR \e$(B9b;3K\@~!"IY;39A@~\e(B
+1.8.1 Kureha \e$(B8b1)\e(B
+1.8.2 Kosugi \e$(B>.?y\e(B
+1.8.3 Ecch\e-Dþ-Daimon\e-A \e$(B1[CfBgLg\e(B
+1.8.4 Takaoka \e$(B9b2,\e(B ; = JR \e$(BI98+@~!">kC<@~\e(B
+1.8.5 Nishi-Takaoka \e$(B@>9b2,\e(B
+1.8.6 Fukuoka \e$(BJ!2,\e(B
+1.9.0 Isurugi \e$(B@PF0\e(B
+1.9.1 Kurikara \e$(B6fMx2@Me\e(B
+1.10.0 Tsubata \e$(BDEH(\e(B
+1.10.1 Morimoto \e$(B?9K\\e(B
+1.10.2 Higashi-Kanazawa \e$(BEl6bBt\e(B
+1.11.0 Kanazawa \e$(B6bBt\e(B ; <=> \e$(BKLN&E4F;\e(B \e$(BKLE46bBt\e(B
+1.12.0 Nishi-Kanazawa \e$(B@>6bBt\e(B ; <=> \e$(BKLN&E4F;\e(B \e$(B?7@>6bBt\e(B
+1.12.1 [JR] Nonoichi [JR] \e$(BLn!9;T\e(B
+1.13.0 Matt\e-Dò\e-A \e$(B>>G$\e(B
+1.13.1 Kaga-Kasama \e$(B2C2l3^4V\e(B
+1.13.2 Mikawa \e$(BH~@n\e(B
+------ Komaiko \e$(B>.Iq;R\e(B
+------ Terai \e$(B;{0f\e(B
+------ Meih\e-Dò\e-A \e$(BL@Jv\e(B
+------ Komatsu \e$(B>.>>\e(B
+: : :
+------- Tsuruga \e$(BFX2l\e(B ; = JR \e$(B>.IM@~\e(B
+------- Shin-Hikida \e$(B?7I%ED\e(B
+------- \e-DÒmi-Shiotsu\e-A \e$(B6a9>1vDE\e(B ; = JR \e$(B8P@>@~\e(B
+------- Yogo \e$(BM>8b\e(B
+------- Kinomoto \e$(BLZ%NK\\e(B
+------- Takatsuki \e$(B9b7n\e(B
+------- Kawake \e$(B2OLS\e(B
+------- Torahime \e$(B8WI1\e(B
+------- Nagahama \e$(BD9IM\e(B
+------- Tamura \e$(BEDB<\e(B
+------- Sakata \e$(B:dED\e(B
+ (Maibara) (\e$(BJF86\e(B) ; = JR \e$(BEl3$F;K\@~\e(B
+
+
+[WEMI version names]
+
+;;-------------------------------------------------------------------------
+;; East Japan Railway \e$(BElF|K\N95RE4F;\e(B http://www.jreast.co.jp/
+;; T\e-Dòkaidò\e-A Line \e$(BEl3$F;K\@~\e(B
+;;-------------------------------------------------------------------------
+1.2.0 T\e-Dòkyò\e-A \e$(BEl5~\e(B
+1.2.1 Shinbashi \e$(B?766\e(B ; = JR \e$(B;3<j@~!"2#?\2l@~\e(B
+1.2.2 Shinagawa \e$(BIJ@n\e(B ; = JR \e$(B;3<j@~!"2#?\2l@~\e(B
+1.2.3 Kawasaki \e$(B@n:j\e(B ; = JR \e$(BFnIp@~\e(B
+1.2.4 Yokohama \e$(B2#IM\e(B ; = JR \e$(B5~IMElKL@~!&:,4_@~!"2#?\2l@~\e(B
+1.3.0 Totsuka \e$(B8MDM\e(B ; = JR \e$(B2#?\2l@~\e(B
+1.3.1 \e-DÒfuna\e-A \e$(BBgA%\e(B ; = JR \e$(B:,4_@~!"2#?\2l@~\e(B
+1.4.0 Fujisawa \e$(BF#Bt\e(B ; <=> \e$(B>.ED5^EEE4\e(B \e$(B9>%NEg@~!"9>%NEgEEE4\e(B
+1.4.1 Tsujid\e-Dò\e-A \e$(@DT\e$(BF2\e(B ; \e$(B!J!V\e$(@DT\e$(B!W\e(B= J90@B-4454:128b\e$(B!K\e(B
+1.4.2 Chigasaki \e$(B3}%v:j\e(B ; = JR \e$(BAjLO@~\e(B
+1.4.3 Hiratsuka \e$(BJ?DM\e(B
+1.4.4 \e-DÒiso\e-A \e$(BBg0k\e(B
+1.4.5 Ninomiya \e$(BFs5\\e(B
+1.4.6 K\e-Dòzu\e-A \e$(B9qI\DE\e(B ; = JR \e$(B8fEB>l@~\e(B
+1.5.0 Kamonomiya \e$(B3{5\\e(B
+1.5.1 Odawara \e$(B>.ED86\e(B ; <=> \e$(B>.ED5^!"H":,EP;3E4F;!"\e(B
+ ; \e$(B0KF&H":,E4F;\e(B
+1.5.2 Hayakawa \e$(BAa@n\e(B
+1.5.3 Nebukawa \e$(B:,I\@n\e(B
+1.5.4 Manazuru \e$(B??Da\e(B
+1.6.0 Yugawara \e$(BEr2O86\e(B
+1.7.0 Atami \e$(BG.3$\e(B ; = JR \e$(B0KEl@~\e(B
+;;-------------------------------------------------------------------------
+;; Central Japan Railway \e$(BEl3$N95RE4F;\e(B
+;;-------------------------------------------------------------------------
+1.7.1 Kan'nami \e$(BH!Fn\e(B
+1.8.0 Mishima \e$(B;0Eg\e(B ; = \e$(B0KF&H":,E4F;\e(B
+1.8.1 Numazu \e$(B>BDE\e(B ; = JR \e$(B8fEB>l@~\e(B
+1.8.2 Katahama \e$(BJRIM\e(B
+1.8.4 Hara \e$(B86\e(B
+1.8.5 Higashi-Tagonoura \e$(BElED;R%N1:\e(B
+1.8.6 Yoshiwara \e$(B5H86\e(B ; = \e$(B3YFnE4F;\e(B
+1.9.0 Fuji \e$(BIY;N\e(B ; = JR \e$(B?H1d@~\e(B
+1.9.1 Fujikawa \e$(BIY;N@n\e(B
+1.10.0 Shin-Kambara \e$(B?73w86\e(B
+1.10.1 Kambara \e$(B3w86\e(B
+1.10.2 Yui \e$(BM3Hf\e(B
+1.11.0 Okitsu \e$(B6=DE\e(B
+1.12.0 Shimizu \e$(B@6?e\e(B
+1.12.1 Kusanagi \e$(BApFe\e(B
+1.13.0 Shizuoka \e$(B@E2,\e(B
+1.13.1 Abekawa \e$(B0BG\@n\e(B
+1.13.2 Mochimune \e$(BMQ=!\e(B
+------ Yaizu \e$(B>FDE\e(B
+------ Nishi-Yaizu \e$(B@>>FDE\e(B
+------ Fijieda \e$(BF#;^\e(B
+------ Rokug\e-Dò\e-A \e$(BO;9g\e(B
+------ Shimada \e$(BEgED\e(B
+------ Kanaya \e$(B6bC+\e(B ; = \e$(BBg0f@nE4F;\e(B
+------ Kikugawa \e$(B5F@n\e(B
+------ Kakegawa \e$(B3]@n\e(B ; = \e$(BE7N5IML>8PE4F;\e(B
+------ Fukuroi \e$(BB^0f\e(B
+------ Iwata \e$(BHXED\e(B
+------ Toyodach\e-Dò\e-A \e$(BK-EDD.\e(B
+------ Tenry\e-Dþgawa\e-A \e$(BE7N5@n\e(B
+------ Hamamatsu \e$(BIM>>\e(B ; = \e$(B1s=#E4F;\e(B
+------ Takatsuka \e$(B9bDM\e(B
+------ Maisaka \e$(BIq:e\e(B
+------ Bentenjima \e$(BJ[E7Eg\e(B
+------ Araimachi \e$(B?75oD.\e(B
+------ Wasizu \e$(BOIDE\e(B
+------ Shinjohara \e$(B?7=j86\e(B ; = \e$(BE7N5IML>8PE4F;\e(B
+------ Futagawa \e$(BFs2O\e(B
+------ Toyohashi \e$(BK-66\e(B ; = JR \e$(BHSED@~\e(B
+: : :
+------ Kanayama \e$(B6b;3\e(B ; =\e$(B!J\e(BJR \e$(BCf1{K\@~!K\e(B
+------ Ot\e-Dòbashi\e-A \e$(BHxF,66\e(B
+------ Nagoya \e$(BL>8E20\e(B ; = JR \e$(B4X@>K\@~!J!&Cf1{K\@~!K\e(B
+: : :
+------ Gifu \e$(B4tIl\e(B ; = JR \e$(B9b;3K\@~\e(B
+: : :
+------ Samegai \e$(B@C%v0f\e(B
+;;-------------------------------------------------------------------------
+;; West Japan Railway \e$(B@>F|K\N95RE4F;\e(B http://www.westjr.co.jp/
+;;-------------------------------------------------------------------------
+------ Maibara \e$(BJF86\e(B ; = JR \e$(BKLN&K\@~\e(B
+: : :
+------ Kusatsu \e$(BApDE\e(B ; = JR \e$(BApDE@~\e(B
+: : :
+------ Yamashina \e$(B;32J\e(B ; = JR \e$(B8P@>@~\e(B
+------ Ky\e-Dòto\e-A \e$(B5~ET\e(B ; = JR \e$(BF`NI@~!&;31"K\@~\e(B
+ ; <=> \e$(B6aE4\e(B \e$(B5~ET@~!"5~ET;T8rDL6I\e(B \e$(B1(4]@~\e(B
+: : :
+------ \e-DÒsaka\e-A \e$(BBg:e\e(B ; = JR \e$(BBg:e4D>u@~\e(B <=> JR \e$(BEl@>@~\e(B \e$(BKL?7CO\e(B
+ ; <=> \e$(BBg:e;T8rDL6I!":e?@!":e5^\e(B \e$(BG_ED\e(B
+: : :
+------ K\e-Dòbe\e-A \e$(B?@8M\e(B ; = JR \e$(B;3M[K\@~\e(B
+
+
+[REMI version names]
+
+;;-------------------------------------------------------------------------
+;; West Japan Railway \e$(B@>F|K\N95RE4F;\e(B http://www.westjr.co.jp/
+;; Himi Line \e$(BI98+@~\e(B
+;;-------------------------------------------------------------------------
+1.4.0 Himi \e$(BI98+\e(B
+1.5.0 Shimao \e$(BEgHx\e(B
+1.6.0 Amaharashi \e$(B1+@2\e(B
+1.8.0 Ecch\e-Dþ-Kokubu\e-A \e$(B1[Cf9qJ,\e(B
+1.8.1 Fushiki \e$(BIzLZ\e(B ; <=> \e$(B%&%i%8%*%9%C%H%C%/9RO)\e(B
+1.8.2 N\e-Dòmachi\e-A \e$(BG=D.\e(B
+1.8.3 Ecch\e-Dþ-Nakagawa\e-A \e$(B1[CfCf@n\e(B
+1.8.4 Takaoka \e$(B9b2,\e(B ; = JR \e$(BKLN&K\@~!">kC<@~\e(B
+
+
+[etc.]
+
+;;-------------------------------------------------------------------------
+;; West Japan Railway \e$(B@>F|K\N95RE4F;\e(B http://www.westjr.co.jp/
+;; Kosei Line \e$(B8P@>@~\e(B
+;;-------------------------------------------------------------------------
+------- (\e-DÒmi-Shiotsu)\e-A (\e$(B6a9>1vDE\e(B) ; = JR \e$(BKLN&K\@~\e(B
+: : :
+------- Nishi-\e-DÒtsu\e-A \e$(B@>BgDE\e(B
+ (Yamashina) (\e$(B;32J\e(B) ; = JR \e$(BEl3$F;K\@~\e(B
--- /dev/null
+--<<alternative>>-{
+
+ 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
+--}-<<alternative>>
--- /dev/null
+;;; mail-mime-setup.el --- setup file for mail-mode.
+
+;; Copyright (C) 1994,1995,1996,1997,1998 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; 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
--- /dev/null
+;;; mime-bbdb.el --- SEMI shared module for BBDB
+
+;; Copyright (C) 1995,1996,1997 Shuhei KOBAYASHI
+;; Copyright (C) 1997,1998 MORIOKA Tomohiko
+
+;; Author: Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+;; Maintainer: Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+;; 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
--- /dev/null
+;;; 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 <umerin@mse.kyutech.ac.jp>
+;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; 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]]
+;; <center>This is a richtext.</center>
+;;
+;;--[[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.")
+
+\f
+;;; @ 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 <pema@iki.fi>
+ ;; 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 <steve@miranova.com>
+ ;; 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 <bold>enriched text</bold>.
+ --[[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)
+ ))
+
+\f
+;; 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)
+ ))
+ ))
+
+\f
+;; 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)))
+
+\f
+;; 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))))
+
+\f
+;; 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))
+
+\f
+;;; @ 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)))
+ )))
+
+\f
+;;;
+;;; 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)
+ )
+
+\f
+;;; @ 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
--- /dev/null
+;;; 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 <morioka@jaist.ac.jp>
+;; Dan Rich <drich@morpheus.corp.sgi.com>
+;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; 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
--- /dev/null
+;;; mime-mc.el --- Mailcrypt interface for SEMI
+
+;; Copyright (C) 1996,1997,1998 MORIOKA Tomohiko
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; 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
--- /dev/null
+;;; 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 <morioka@jaist.ac.jp>
+;; 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
--- /dev/null
+;;; mime-pgp.el --- mime-view internal methods for PGP.
+
+;; Copyright (C) 1995,1996,1997,1998,1999 MORIOKA Tomohiko
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; 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 <galvin@tis.com>, Sandy Murphy <sandy@tis.com>,
+;; Steve Crocker <crocker@cybercash.com> and
+;; Ned Freed <ned@innosoft.com> (1995/10)
+
+;; [PGP/MIME] RFC 2015: "MIME Security with Pretty Good Privacy
+;; (PGP)" by Michael Elkins <elkins@aero.org> (1996/6)
+
+;; [PGP-kazu] draft-kazu-pgp-mime-00.txt: "PGP MIME Integration"
+;; by Kazuhiko Yamamoto <kazu@is.aist-nara.ac.jp> (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
--- /dev/null
+;;; 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 <morioka@jaist.ac.jp>
+;; 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
--- /dev/null
+;;; mime-setup.el --- setup file for MIME viewer and composer.
+
+;; Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; 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
--- /dev/null
+;;; mime-view.el --- interactive MIME viewer for GNU Emacs
+
+;; Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; 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
;;; 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 <morioka@jaist.ac.jp>
;; Keywords: HTML, MIME, multimedia, mail, news
))
(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")
(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
;;;
;;; 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 <morioka@jaist.ac.jp>
;; Keywords: definition, MIME, multimedia, mail, news
(require 'custom)
-(defconst mime-user-interface-product ["SEMI" (1 12 1) "[JR] Nonoichi"]
+(defconst mime-user-interface-product ["AKEMI" (1 13 1) "\e$B?e>=BN\e(B"]
"Product name, version number and code name of MIME-kernel package.")
(autoload 'mule-caesar-region "mule-caesar"
--- /dev/null
+;;; semi-setup.el --- setup file for MIME-View.
+
+;; Copyright (C) 1994,1995,1996,1997,1998 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; 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
--- /dev/null
+;;; signature.el --- a signature utility for GNU Emacs
+
+;; Copyright (C) 1994,1995,1996,1997 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; OKABE Yasuo <okabe@kudpc.kyoto-u.ac.jp>
+;; Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+;; Maintainer: Shuhei KOBAYASHI <shuhei-k@jaist.ac.jp>
+;; 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 <signature-file-name>-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