Subject: [patch] NATO support in morse.el
From: "Aaron S. Hawley" <[email-masked]>
To: [email-masked]
Date: Wed, 11 Feb 2009 09:54:16 -0500

I've added support to Emacs to convert text into the NATO phonetic
alphabet.  I added it to the existing Morse code converter (morse.el),
using the existing code to complete the task.  The commands are M-x
nato-region and M-x denato-region. (M-x unnato-region just wasn't as
fun sounding).

This is all an amusement, but I find this feature helpful to use
occasionally in phone conversations at work.  I suppose I'd rather
convert small bits of text at a time, and have the output shown in the
Emacs echo area than converting the region "in place".  I predict
people will probably want to try and integrate the functions in
morse.el to avoid duplicating the same code as I have done.

The patch is attached, and the file nato.txt helped me loosely confirm
that the conversion has a one-to-one correspondence.

Thanks for Emacs.
/a

2009-02-11  Aaron S. Hawley  <[email-masked]>

	* play/morse.el (nato-alphabet): New variable for converting text
	to NATO phonetic alphabet by Aaron S. Hawley
	<[email-masked]>.
	(morse-region, unmorse-region): Add * to interactive forms.
	(nato-region, denato-region): New functions.

--- morse.el	10 Feb 2009 22:43:49 -0500	1.19
+++ morse.el	11 Feb 2009 00:05:37 -0500	
@@ -26,6 +26,9 @@
 ;; Converts text to Morse code and back with M-x morse-region and
 ;; M-x unmorse-region (though Morse code is no longer official :-().

+;; Converts text to NATO phonetic alphabet and back with M-x
+;; nato-region and M-x denato-region.
+
 ;;; Code:

 (defvar morse-code '(("a" . ".-")
@@ -92,10 +95,64 @@
 		     ("@" . ".--.-."))
   "Morse code character set.")

+(defvar nato-alphabet '(("a" . "Alfa")
+			("b" . "Bravo")
+			("c" . "Charlie")
+			("d" . "Delta")
+			("e" . "Echo")
+			("f" . "Foxtrot")
+			("g" . "Golf")
+			("h" . "Hotel")
+			("i" . "India")
+			("j" . "Juliett")
+			("k" . "Kilo")
+			("l" . "Lima")
+			("m" . "Mike")
+			("n" . "November")
+			("o" . "Oscar")
+			("p" . "Papa")
+			("q" . "Quebec")
+			("r" . "Romeo")
+			("s" . "Sierra")
+			("t" . "Tango")
+			("u" . "Uniform")
+			("v" . "Victor")
+			("w" . "Whiskey")
+			("x" . "Xray")
+			("y" . "Yankee")
+			("z" . "Zulu")
+			;; Numbers
+			("0" . "Zero")
+			("1" . "One")
+			("2" . "Two")
+			("3" . "Three")
+			("4" . "Four")
+			("5" . "Five")
+			("6" . "Six")
+			("7" . "Seven")
+			("8" . "Eight")
+			("9" . "Niner")
+			;; Punctuation is not part of standard
+			("=" . "Equals")
+			("?" . "Query")
+			("/" . "Slash")
+			("," . "Comma")
+			("." . "Stop")
+			(":" . "Colon")
+			("'" . "Apostrophe")
+			("-" . "Dash")
+			("(" . "Open")
+			(")" . "Close")
+			("@" . "At"))
+  "NATO phonetic alphabet.
+See ''International Code of Signals'' (INTERCO), United States
+Edition, 1969 Edition (Revised 2003) available from National
+Geospatial-Intelligence Agency at http://www.nga.mil/")
+
 ;;;###autoload
 (defun morse-region (beg end)
   "Convert all text in a given region to morse code."
-  (interactive "r")
+  (interactive "*r")
   (if (integerp end)
       (setq end (copy-marker end)))
   (save-excursion
@@ -118,7 +175,7 @@
 ;;;###autoload
 (defun unmorse-region (beg end)
   "Convert morse coded text in region to ordinary ASCII text."
-  (interactive "r")
+  (interactive "*r")
   (if (integerp end)
       (setq end (copy-marker end)))
   (save-excursion
@@ -137,6 +194,53 @@
 	    (if (looking-at "/")
 		(delete-char 1))))))))

+;;;###autoload
+(defun nato-region (beg end)
+  "Convert all text in a given region to NATO phonetic alphabet."
+  ;; Copied from morse-region. -- ashawley 2009-02-10
+  (interactive "*r")
+  (if (integerp end)
+      (setq end (copy-marker end)))
+  (save-excursion
+    (let ((sep "")
+	  str nato)
+      (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 nato (assoc str nato-alphabet))
+	       (delete-char 1)
+	       (insert sep (cdr nato))
+	       (setq sep "-"))
+	      (t
+	       (forward-char 1)
+	       (setq sep "")))))))
+
+;;;###autoload
+(defun denato-region (beg end)
+  "Convert NATO phonetic alphabet in region to ordinary ASCII text."
+  ;; Copied from unmorse-region. -- ashawley 2009-02-10
+  (interactive "*r")
+  (if (integerp end)
+      (setq end (copy-marker end)))
+  (save-excursion
+    (let (str paren nato)
+      (goto-char beg)
+      (while (< (point) end)
+	(if (null (looking-at "[a-z]+"))
+	    (forward-char 1)
+	  (setq str (buffer-substring (match-beginning 0) (match-end 0)))
+	  (if (null (setq nato (rassoc str nato-alphabet)))
+	      (goto-char (match-end 0))
+	    (replace-match
+		  (if (string-equal "(" (car nato))
+		      (if (setq paren (null paren)) "(" ")")
+		    (car nato)) t)
+	    (if (looking-at "-")
+		(delete-char 1))))))))
+
 (provide 'morse)

 ;; arch-tag: 3331e6c1-9a9e-453f-abfd-163a9c3f93a6