Mercurial > emacs
comparison lisp/gnus/rfc2047.el @ 47951:9cd6016af581
Revert decoding changes temporarily.
author | Dave Love <fx@gnu.org> |
---|---|
date | Fri, 18 Oct 2002 14:15:44 +0000 |
parents | 3915f2c7691e |
children | b042c57894f8 d7ddb3e565de |
comparison
equal
deleted
inserted
replaced
47950:6b2496e2e77b | 47951:9cd6016af581 |
---|---|
471 (goto-char (1+ (point-min))) | 471 (goto-char (1+ (point-min))) |
472 (while (and (not (bobp)) (not (eobp))) | 472 (while (and (not (bobp)) (not (eobp))) |
473 (goto-char (min (point-max) (+ 56 bol))) | 473 (goto-char (min (point-max) (+ 56 bol))) |
474 (search-backward "=" (- (point) 2) t) | 474 (search-backward "=" (- (point) 2) t) |
475 (unless (or (bobp) (eobp)) | 475 (unless (or (bobp) (eobp)) |
476 (insert ?\n) | 476 (insert "\n") |
477 (setq bol (point))))))))) | 477 (setq bol (point))))))))) |
478 | 478 |
479 ;;; | 479 ;;; |
480 ;;; Functions for decoding RFC2047 messages | 480 ;;; Functions for decoding RFC2047 messages |
481 ;;; | 481 ;;; |
482 | 482 |
483 (eval-and-compile | 483 (defvar rfc2047-encoded-word-regexp |
484 (defvar rfc2047-encoded-word-regexp | 484 "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~ +]+\\)\\?=") |
485 "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\ | |
486 \\([!->@-~ +]+\\)\\?=")) | |
487 | 485 |
488 (defun rfc2047-decode-region (start end) | 486 (defun rfc2047-decode-region (start end) |
489 "Decode MIME-encoded words in region between START and END." | 487 "Decode MIME-encoded words in region between START and END." |
490 (interactive "r") | 488 (interactive "r") |
491 (let ((case-fold-search t) | 489 (let ((case-fold-search t) |
492 (undoing (not (eq t buffer-undo-list))) | |
493 b e) | 490 b e) |
494 (unwind-protect | 491 (save-excursion |
495 (save-excursion | 492 (save-restriction |
496 (save-restriction | 493 (narrow-to-region start end) |
497 (buffer-enable-undo) | 494 (goto-char (point-min)) |
498 (narrow-to-region start end) | 495 ;; Remove whitespace between encoded words. |
499 (goto-char (point-min)) | 496 (while (re-search-forward |
500 ;; Remove whitespace between encoded words. | 497 (concat "\\(" rfc2047-encoded-word-regexp "\\)" |
501 (while (re-search-forward | 498 "\\(\n?[ \t]\\)+" |
502 (eval-when-compile | 499 "\\(" rfc2047-encoded-word-regexp "\\)") |
503 (concat "\\(" rfc2047-encoded-word-regexp "\\)" | 500 nil t) |
504 "\\(\n?[ \t]\\)+" | 501 (delete-region (goto-char (match-end 1)) (match-beginning 6))) |
505 "\\(" rfc2047-encoded-word-regexp "\\)")) | 502 ;; Decode the encoded words. |
506 nil t) | 503 (setq b (goto-char (point-min))) |
507 (delete-region (goto-char (match-end 1)) (match-beginning 6))) | 504 (while (re-search-forward rfc2047-encoded-word-regexp nil t) |
508 ;; Decode the encoded words. | 505 (setq e (match-beginning 0)) |
509 (setq b (goto-char (point-min))) | 506 (insert (rfc2047-parse-and-decode |
510 (while (re-search-forward rfc2047-encoded-word-regexp nil t) | 507 (prog1 |
511 (setq e (match-beginning 0)) | 508 (match-string 0) |
512 (rfc2047-parse-and-decode (match-beginning 0) (match-end 0))) | 509 (delete-region (match-beginning 0) (match-end 0))))) |
513 (when (and (mm-multibyte-p) | 510 (when (and (mm-multibyte-p) |
514 mail-parse-charset | 511 mail-parse-charset |
515 (not (eq mail-parse-charset 'us-ascii)) | 512 (not (eq mail-parse-charset 'gnus-decoded))) |
516 (not (eq mail-parse-charset 'gnus-decoded))) | 513 (mm-decode-coding-region b e mail-parse-charset)) |
517 (mm-decode-coding-region b (point-max) mail-parse-charset)) | 514 (setq b (point))) |
518 (rfc2047-unfold-region (point-min) (point-max)))) | 515 (when (and (mm-multibyte-p) |
519 (unless undoing | 516 mail-parse-charset |
520 (buffer-disable-undo))))) | 517 (not (eq mail-parse-charset 'us-ascii)) |
518 (not (eq mail-parse-charset 'gnus-decoded))) | |
519 (mm-decode-coding-region b (point-max) mail-parse-charset)) | |
520 (rfc2047-unfold-region (point-min) (point-max)))))) | |
521 | 521 |
522 (defun rfc2047-decode-string (string) | 522 (defun rfc2047-decode-string (string) |
523 "Decode the quoted-printable-encoded STRING and return the results." | 523 "Decode the quoted-printable-encoded STRING and return the results." |
524 (let ((m (mm-multibyte-p))) | 524 (let ((m (mm-multibyte-p))) |
525 (with-temp-buffer | 525 (with-temp-buffer |
528 (insert string) | 528 (insert string) |
529 (inline | 529 (inline |
530 (rfc2047-decode-region (point-min) (point-max))) | 530 (rfc2047-decode-region (point-min) (point-max))) |
531 (buffer-string)))) | 531 (buffer-string)))) |
532 | 532 |
533 (defun rfc2047-parse-and-decode (b e) | 533 (defun rfc2047-parse-and-decode (word) |
534 "Decode WORD and return it if it is an encoded word. | 534 "Decode WORD and return it if it is an encoded word. |
535 Return WORD if not." | 535 Return WORD if not." |
536 (save-restriction | 536 (if (not (string-match rfc2047-encoded-word-regexp word)) |
537 (narrow-to-region b e) | 537 word |
538 (goto-char b) | 538 (or |
539 (when (looking-at (eval-when-compile | 539 (condition-case nil |
540 (concat "\\`" rfc2047-encoded-word-regexp "\\'"))) | 540 (rfc2047-decode |
541 (condition-case nil | 541 (match-string 1 word) |
542 (let ((charset (match-string 1)) | 542 (upcase (match-string 2 word)) |
543 (encoding (upcase (match-string 2)))) | 543 (match-string 3 word)) |
544 (undo-boundary) | 544 (error word)) |
545 (delete-region (match-beginning 0) (1+ (match-end 2))) | 545 word))) |
546 (delete-region (- (point-max) 2) (point-max)) | 546 |
547 (rfc2047-decode charset encoding (point-min) (point-max))) | 547 (defun rfc2047-decode (charset encoding string) |
548 ;; If we get an error, undo the change | 548 "Decode STRING from the given MIME CHARSET in the given ENCODING. |
549 (error (undo)))))) | |
550 | |
551 (defun rfc2047-decode (charset encoding b e) | |
552 "Decode from the given MIME CHARSET in the given ENCODING in region B to E. | |
553 Valid ENCODINGs are \"B\" and \"Q\". | 549 Valid ENCODINGs are \"B\" and \"Q\". |
554 If your Emacs implementation can't decode CHARSET, return nil." | 550 If your Emacs implementation can't decode CHARSET, return nil." |
555 (if (stringp charset) | 551 (if (stringp charset) |
556 (setq charset (intern (downcase charset)))) | 552 (setq charset (intern (downcase charset)))) |
557 (if (or (not charset) | 553 (if (or (not charset) |
566 (setq cs (mm-charset-to-coding-system mail-parse-charset))) | 562 (setq cs (mm-charset-to-coding-system mail-parse-charset))) |
567 (when cs | 563 (when cs |
568 (when (and (eq cs 'ascii) | 564 (when (and (eq cs 'ascii) |
569 mail-parse-charset) | 565 mail-parse-charset) |
570 (setq cs mail-parse-charset)) | 566 (setq cs mail-parse-charset)) |
571 (save-restriction | 567 ;; Ensure unibyte result in Emacs 20. |
572 (narrow-to-region b e) | 568 (let (default-enable-multibyte-characters) |
573 (cond | 569 (with-temp-buffer |
574 ((equal "B" encoding) | 570 (mm-decode-coding-string |
575 (base64-decode-region b e)) | 571 (cond |
576 ((equal "Q" encoding) | 572 ((equal "B" encoding) |
577 (subst-char-in-region b e ?_ ? t) | 573 (base64-decode-string string)) |
578 (quoted-printable-decode-region b e)) | 574 ((equal "Q" encoding) |
579 (t (error "Invalid encoding: %s" encoding))) | 575 (quoted-printable-decode-string |
580 (mm-decode-coding-region (point-min) (point-max) cs))))) | 576 (mm-replace-chars-in-string string ?_ ? ))) |
577 (t (error "Invalid encoding: %s" encoding))) | |
578 cs)))))) | |
581 | 579 |
582 (provide 'rfc2047) | 580 (provide 'rfc2047) |
583 | 581 |
584 ;;; rfc2047.el ends here | 582 ;;; rfc2047.el ends here |