diff lisp/play/morse.el @ 13651:4eb58dc2c627

Initial revision
author Richard M. Stallman <rms@gnu.org>
date Sat, 25 Nov 1995 05:42:30 +0000
parents
children 83f275dcd93a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/play/morse.el	Sat Nov 25 05:42:30 1995 +0000
@@ -0,0 +1,120 @@
+;;; morse.el --- Convert text to morse code and back.
+
+;; Copyright (C) 1995 Free Software Foundation, Inc.
+
+;; Author: Rick Farnbach <rick_farnbach@MENTORG.COM>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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.
+
+;; GNU Emacs 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, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Code:
+
+(defvar morse-code '(("a" . ".-")
+		     ("b" . "-...")
+		     ("c" . "-.-.")
+		     ("d" . "-..")
+		     ("e" . ".")
+		     ("f" . "..-.")
+		     ("g" . "--.")
+		     ("h" . "....")
+		     ("i" . "..")
+		     ("j" . ".---")
+		     ("k" . "-.-")
+		     ("l" . ".-..")
+		     ("m" . "--")
+		     ("n" . "-.")
+		     ("o" . "---")
+		     ("p" . ".--.")
+		     ("q" . "--.-")
+		     ("r" . ".-.")
+		     ("s" . "...")
+		     ("t" . "-")
+		     ("u" . "..-")
+		     ("v" . "...-")
+		     ("w" . ".--")
+		     ("x" . "-..-")
+		     ("y" . "-.--")
+		     ("z" . "--..")
+		     ;; Punctuation
+		     ("=" . "-...-")
+		     ("?" . "..--..")
+		     ("/" . "-..-.")
+		     ("," . "--..--")
+		     ("." . ".-.-.-")
+		     (":" . "---...")
+		     ("'" . ".----.")
+		     ("-" . "-....-")
+		     ("(" . "-.--.-")
+		     (")" . "-.--.-")
+		     ;; Numbers
+		     ("0" . "-----")
+		     ("1" . ".----")
+		     ("2" . "..---")
+		     ("3" . "...--")
+		     ("4" . "....-")
+		     ("5" . ".....")
+		     ("6" . "-....")
+		     ("7" . "--...")
+		     ("8" . "---..")
+		     ("9" . "----."))
+  "Morse code character set.")
+
+(defun morse-region (beg end)
+  "Convert all text in a given region to morse code."
+  (interactive "r")
+  (if (integerp end)
+      (setq end (copy-marker end)))
+  (save-excursion
+    (let ((sep "")
+	  str morse)
+      (goto-char beg)
+      (while (< (point) end)
+	(setq str (downcase (buffer-substring (point) (1+ (point)))))
+	(cond ((looking-at "\\s-+")
+	       (goto-char (match-end 0))
+	       (setq sep ""))
+	      ((setq morse (assoc str morse-code))
+	       (delete-char 1)
+	       (insert sep (cdr morse))
+	       (setq sep "/"))
+	      (t
+	       (forward-char 1)
+	       (setq sep "")))))))
+
+(defun unmorse-region (beg end)
+  "Convert morse coded text in region to ordinary ASCII text."
+  (interactive "r")
+  (if (integerp end)
+      (setq end (copy-marker end)))
+  (save-excursion
+    (let (str paren morse)
+      (goto-char beg)
+      (while (< (point) end)
+	(if (null (looking-at "[-.]+"))
+	    (forward-char 1)
+	  (setq str (buffer-substring (match-beginning 0) (match-end 0)))
+	  (if (null (setq morse (rassoc str morse-code)))
+	      (goto-char (match-end 0))
+	    (replace-match
+		  (if (string-equal "(" (car morse))
+		      (if (setq paren (null paren)) "(" ")")
+		    (car morse)) t)
+	    (if (looking-at "/")
+		(delete-char 1))))))))
+
+(provide 'morse)
+
+;;; morse.el ends here