X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/e516799970be4553edae8ca46d5f64852befec77..937640a621a4ce2e5e56eaecca37a2a28a584318:/lisp/rot13.el diff --git a/lisp/rot13.el b/lisp/rot13.el index 939539b49e..bcf4252d14 100644 --- a/lisp/rot13.el +++ b/lisp/rot13.el @@ -1,10 +1,9 @@ -;;; rot13.el --- display a buffer in rot13. +;;; rot13.el --- display a buffer in rot13 -;; Author: Howard Gayle: -;; Maintainer: FSF -;; Last-Modified: 16 Mar 1992 +;; Copyright (C) 1988,2002 Free Software Foundation, Inc. -;; Copyright (C) 1988 Free Software Foundation, Inc. +;; Author: Howard Gayle +;; Maintainer: FSF ;; This file is part of GNU Emacs. @@ -19,14 +18,24 @@ ;; 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, 675 Mass Ave, Cambridge, MA 02139, USA. +;; 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: - -;; Written by Howard Gayle. See case-table.el for details. +;;; Commentary: +;; The entry point, `rot13-other-window', performs a Caesar cipher +;; encrypt/decrypt on the current buffer and displays the result in another +;; window. Rot13 encryption is sometimes used on USENET as a read-at-your- +;; own-risk wrapper for material some might consider offensive, such as +;; ethnic humor. +;; +;; Written by Howard Gayle. ;; This hack is mainly to show off the char table stuff. +;; +;; New entry points, `rot13', `rot13-string', and `rot13-region' that +;; performs Ceasar cipher encrypt/decrypt on buffers and strings, was +;; added by Simon Josefsson. ;;; Code: @@ -34,18 +43,72 @@ (let ((table (make-display-table)) (i 0)) (while (< i 26) - (aset table (+ i ?a) (make-rope (+ (% (+ i 13) 26) ?a))) - (aset table (+ i ?A) (make-rope (+ (% (+ i 13) 26) ?A))) + (aset table (+ i ?a) (vector (+ (% (+ i 13) 26) ?a))) + (aset table (+ i ?A) (vector (+ (% (+ i 13) 26) ?A))) (setq i (1+ i))) table) "Char table for rot 13 display.") +(defvar rot13-translate-table + (let ((str (make-string 127 0)) + (i 0)) + (while (< i 127) + (aset str i i) + (setq i (1+ i))) + (setq i 0) + (while (< i 26) + (aset str (+ i ?a) (+ (% (+ i 13) 26) ?a)) + (aset str (+ i ?A) (+ (% (+ i 13) 26) ?A)) + (setq i (1+ i))) + str) + "String table for rot 13 translation.") + +;;;###autoload +(defun rot13 (object &optional start end) + "Return Rot13 encryption of OBJECT, a buffer or string." + (if (bufferp object) + (with-current-buffer object + (rot13-region start end)) + (rot13-string object))) + +;;;###autoload +(defun rot13-string (string) + "Return Rot13 encryption of STRING." + (with-temp-buffer + (insert string) + (rot13-region (point-min) (point-max)) + (buffer-string))) + +;;;###autoload +(defun rot13-region (start end) + "Rot13 encrypt the region between START and END in current buffer." + (interactive "r") + (translate-region start end rot13-translate-table)) + +;;;###autoload (defun rot13-other-window () - "Display current buffer in rot 13 in another window." + "Display current buffer in rot 13 in another window. +The text itself is not modified, only the way it is displayed is affected. + +To terminate the rot13 display, delete that window. As long as that window +is not deleted, any buffer displayed in it will become instantly encoded +in rot 13. + +See also `toggle-rot13-mode'." (interactive) (let ((w (display-buffer (current-buffer) t))) (set-window-display-table w rot13-display-table))) +;;;###autoload +(defun toggle-rot13-mode () + "Toggle the use of rot 13 encoding for the current window." + (interactive) + (if (eq (window-display-table (selected-window)) rot13-display-table) + (set-window-display-table (selected-window) nil) + (if (null (window-display-table (selected-window))) + (set-window-display-table (selected-window) rot13-display-table)))) + (provide 'rot13) +;;; arch-tag: ad5b9ca8-946c-4414-996f-e9b1bf9ec79f ;;; rot13.el ends here