Path: utzoo!utgpu!watmath!uunet!crdgw1!montnaro
From: montnaro@copernicus.crd.ge.com (Skip Montanaro)
Newsgroups: gnu.emacs
Subject: Re: BABYL to unix mail format converter?
Message-ID: 
Date: 17 Aug 89 02:26:28 GMT
References: <31142@cornell.UUCP>
Sender: news@crdgw1.crd.ge.com
Reply-To:  (Skip Montanaro)
Distribution: gnu
Organization: /home/kreskin/u0/montnaro/.organization
Lines: 91
In-reply-to: patrick@cs.cornell.edu's message of 16 Aug 89 19:45:05 GMT

The following ain't perfect, but it got me over the hump. It's just a
throwaway. Don't send me bugs, since I don't expect to reuse it. After
running it, proofread the generated mail files!

---------- cut here ---------- cut here ---------- cut here ---------- 

;; Babyl-to-mail.el (written late (Late!) at night.

(defun convert-babyl-buffer-to-mail ()
  "Quick-n-dirty function to convert current buffer back to Mail format."
  (interactive)
  (delete-babyl-header)
  (goto-char (point-min))
  (while (looking-at "\C-l")
    (convert-babyl-message-to-mail)))

(defun delete-babyl-header ()
  "Nuke \"BABYL OPTIONS:\" to first \C-_."
  (goto-char (point-min))
  (cond
   ((looking-at "^BABYL OPTIONS:")
    (let ((p (point)))
      (search-forward "\C-_" nil t)
      (delete-region p (point))))
   (t (error "Non a BABYL format buffer!"))))

(defun convert-babyl-message-to-mail ()
  "Convert the babyl message immediately following (point) to Mail format."
  (let ((start (point))
	(end (progn (search-forward "\C-_") (point))))
    ; restrict view to the current message
    (narrow-to-region start end)

    ; nuke the starting delimiter and the attribute and summary lines
    (goto-char (point-min))
    (kill-line 3)

    ; zap the *** EOOH *** line, the blank line preceding it, and the header
    ; after it.
    (goto-char (point-min))
    (search-forward "*** EOOH ***")
    (let (start-hdr)
      (save-excursion
	(beginning-of-line 0)
	(setq start-hdr (point)))
      (search-forward "\C-j\C-j")
      (beginning-of-line 0)
      (delete-region start-hdr (point)))

    ; convert multi-line headers into a single line so they
    ; stay together when we move them around.
    (goto-char (point-min))
    (narrow-to-region (point-min) (save-excursion
				    (search-forward "\C-j\C-j")
				    (beginning-of-line 0)
				    (point)))
    (replace-string "\C-j\C-i" "")

    (goto-char (point-min))
    ; Copy From: and delete :, placing result at start
    (goto-char (point-min))
    (cond
     ((re-search-forward "^\\(From:.*\\)$" (point-max) t)
      (let ((from-hdr   (buffer-substring (match-beginning 1) (match-end 1))))
	(goto-char (point-min))
	(insert from-hdr "\n"))
      (goto-char (point-min))
      (search-forward "From")
      (delete-char 1)
      (if (not (looking-at " ")) (insert " "))
      (beginning-of-line 2))
     (t				; should look for Apparently-From: ...
      (goto-char (point-min))
      (insert "From (Unknown Person)\n")))

    ; restore the multi-line headers
    (goto-char (point-min))
    (replace-string "" "\C-j\C-i"))

  ; remove restriction, and zap trailing \C-_
  (widen)
  (goto-char (point-min))
  (search-forward "\C-_")
  (delete-backward-char 1))


;;; watch for the signature!!!


--
Skip Montanaro (montanaro@sprite.crd.ge.com)