changeset 7260:b71d8f758a66

Initial revision
author Richard M. Stallman <rms@gnu.org>
date Sun, 01 May 1994 23:14:10 +0000
parents 5a03fc943b38
children a752899939f7
files lisp/international/iso-cvt.el
diffstat 1 files changed, 548 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/international/iso-cvt.el	Sun May 01 23:14:10 1994 +0000
@@ -0,0 +1,548 @@
+;; iso-cvt.el -- translate to ISO 8859-1 from/to net/TeX conventions
+;; Copyright © 1993 Free Software Foundation, Inc.
+;; Was formerly called gm-lingo.el.
+
+;; Author: Michael Gschwind <mike@vlsivie.tuwien.ac.at>
+;; Keywords: tex, iso, latin, i18n
+
+;; 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.
+
+;;; Commentary: 
+
+; Calling `iso-german' will turn the net convention f or umlauts ("a etc.) 
+; into ISO latin umlaute for easy reading.
+; hooks change TeX files to Latin-1 for editing and back to TeX sequences 
+; for calling TeX. An alternative is a TeX style that handles 
+; 8 bit ISO files (available on ftp.vlsivie.tuwien.ac.at in /pub/8bit) 
+; - but these files are difficult to transmit ... so while the net is  
+; still @ 7 bit this may be useful
+
+; to do: translate buffer when displaying from GNUS, 
+; use function 'german which does the Right Thing
+;
+; to do: use more general regular expressions for (g)tex2iso tables, to 
+; cover more cases for translation.
+
+;;; Code:
+
+(provide 'iso-cvt)
+
+(defvar iso-spanish-trans-tab
+  '(
+    ("~n" "ñ")
+    ("\([a-zA-Z]\)#" "\\1ñ")
+    ("~N" "Ñ")
+    ("\\([-a-zA-Z\"`]\\)\"u" "\\1ü")
+    ("\\([-a-zA-Z\"`]\\)\"U" "\\1Ü")
+    ("\\([-a-zA-Z]\\)'o" "\\1ó")
+    ("\\([-a-zA-Z]\\)'O" "\\Ó")
+    ("\\([-a-zA-Z]\\)'e" "\\1é")
+    ("\\([-a-zA-Z]\\)'E" "\\1É")
+    ("\\([-a-zA-Z]\\)'a" "\\1á")
+    ("\\([-a-zA-Z]\\)'A" "\\1A")
+    ("\\([-a-zA-Z]\\)'i" "\\1í")
+    ("\\([-a-zA-Z]\\)'I" "\\1Í")
+    )
+  "Spanish translation table.")
+
+(defun iso-translate-conventions (trans-tab)
+  "Use the translation table argument to translate the current buffer."
+  (interactive)
+  (save-excursion
+    (widen)
+    (goto-char (point-min))
+    (let ((work-tab trans-tab)
+	  (buffer-read-only nil))
+      (while work-tab
+	(save-excursion
+	  (let ((trans-this (car work-tab)))
+	    (while (re-search-forward (car trans-this) nil t)
+	      (replace-match (car (cdr trans-this)) nil nil)))
+	  (setq work-tab (cdr work-tab)))))))
+
+(defun iso-spanish ()
+  "Translate net conventions for Spanish to ISO 8859-1."
+  (interactive)
+  (iso-translate-conventions iso-spanish-trans-tab))
+
+(defvar iso-aggressive-german-trans-tab
+  '(
+    ("\"a" "ä")
+    ("\"A" "Ä")
+    ("\"o" "ö")
+    ("\"O" "Ö")
+    ("\"u" "ü")
+    ("\"U" "Ü")
+    ("\"s" "ß")
+    ("\\\\3" "ß")
+    )
+  "German translation table. 
+This table uses an aggressive translation approach and may translate 
+erroneously translate too much.")
+
+(defvar iso-conservative-german-trans-tab
+  '(
+    ("\\([-a-zA-Z\"`]\\)\"a" "\\1ä")
+    ("\\([-a-zA-Z\"`]\\)\"A" "\\1Ä")
+    ("\\([-a-zA-Z\"`]\\)\"o" "\\1ö")
+    ("\\([-a-zA-Z\"`]\\)\"O" "\\1Ö")
+    ("\\([-a-zA-Z\"`]\\)\"u" "\\1ü")
+    ("\\([-a-zA-Z\"`]\\)\"U" "\\1Ü")
+    ("\\([-a-zA-Z\"`]\\)\"s" "\\1ß")
+    ("\\([-a-zA-Z\"`]\\)\\\\3" "\\1ß")
+    )
+  "German translation table.
+This table uses a conservative translation approach and may translate too 
+little.")
+
+
+(defvar iso-german-trans-tab iso-aggressive-german-trans-tab 
+  "Currently active translation table for German.")
+
+(defun iso-german ()
+ "Translate net conventions for German to ISO 8859-1."
+ (interactive)
+ (iso-translate-conventions iso-german-trans-tab))
+ 
+(defvar iso-iso2tex-trans-tab
+  '(
+    ("ä" "{\\\\\"a}")
+    ("à" "{\\\\`a}")
+    ("á" "{\\\\'a}")
+    ("ã" "{\\\\~a}")
+    ("â" "{\\\\^a}")
+    ("ë" "{\\\\\"e}")
+    ("è" "{\\\\`e}")
+    ("é" "{\\\\'e}")
+    ("ê" "{\\\\^e}")
+    ("ï" "{\\\\\"\\\\i}")
+    ("ì" "{\\\\`\\\\i}")
+    ("í" "{\\\\'\\\\i}")
+    ("î" "{\\\\^\\\\i}")
+    ("ö" "{\\\\\"o}")
+    ("ò" "{\\\\`o}")
+    ("ó" "{\\\\'o}")
+    ("õ" "{\\\\~o}")
+    ("ô" "{\\\\^o}")
+    ("ü" "{\\\\\"u}")
+    ("ù" "{\\\\`u}")
+    ("ú" "{\\\\'u}")
+    ("û" "{\\\\^u}")
+    ("Ä" "{\\\\\"A}")
+    ("À" "{\\\\`A}")
+    ("Á" "{\\\\'A}")
+    ("Ã" "{\\\\~A}")
+    ("Â" "{\\\\^A}")
+    ("Ë" "{\\\\\"E}")
+    ("È" "{\\\\`E}")
+    ("É" "{\\\\'E}")
+    ("Ê" "{\\\\^E}")
+    ("Ï" "{\\\\\"I}")
+    ("Ì" "{\\\\`I}")
+    ("Í" "{\\\\'I}")
+    ("Î" "{\\\\^I}")
+    ("Ö" "{\\\\\"O}")
+    ("Ò" "{\\\\`O}")
+    ("Ó" "{\\\\'O}")
+    ("Õ" "{\\\\~O}")
+    ("Ô" "{\\\\^O}")
+    ("Ü" "{\\\\\"U}")
+    ("Ù" "{\\\\`U}")
+    ("Ú" "{\\\\'U}")
+    ("Û" "{\\\\^U}")
+    ("ñ" "{\\\\~n}")
+    ("Ñ" "{\\\\~N}")
+    ("ç" "{\\\\c c}")
+    ("Ç" "{\\\\c C}")
+    ("ß" "{\\\\ss}")
+    ("¿" "{?`}")
+    ("¡" "{!`}")
+    )
+  "Translation table for translating ISO 8859-1 characters to TeX sequences.")
+
+
+
+
+(defun iso-iso2tex ()
+ "Translate ISO 8859-1 characters to TeX sequences."
+ (interactive)
+ (iso-translate-conventions iso-iso2tex-trans-tab))
+
+
+(defvar iso-tex2iso-trans-tab
+  '(
+    ("{\\\\\"a}" "ä")
+    ("{\\\\`a}" "à")
+    ("{\\\\'a}" "á")
+    ("{\\\\~a}" "ã")
+    ("{\\\\^a}" "â")
+    ("{\\\\\"e}" "ë")
+    ("{\\\\`e}" "è")
+    ("{\\\\'e}" "é")
+    ("{\\\\^e}" "ê")
+    ("{\\\\\"\\\\i}" "ï")
+    ("{\\\\`\\\\i}" "ì")
+    ("{\\\\'\\\\i}" "í")
+    ("{\\\\^\\\\i}" "î")
+    ("{\\\\\"i}" "ï")
+    ("{\\\\`i}" "ì")
+    ("{\\\\'i}" "í")
+    ("{\\\\^i}" "î")
+    ("{\\\\\"o}" "ö")
+    ("{\\\\`o}" "ò")
+    ("{\\\\'o}" "ó")
+    ("{\\\\~o}" "õ")
+    ("{\\\\^o}" "ô")
+    ("{\\\\\"u}" "ü")
+    ("{\\\\`u}" "ù")
+    ("{\\\\'u}" "ú")
+    ("{\\\\^u}" "û")
+    ("{\\\\\"A}" "Ä")
+    ("{\\\\`A}" "À")
+    ("{\\\\'A}" "Á")
+    ("{\\\\~A}" "Ã")
+    ("{\\\\^A}" "Â")
+    ("{\\\\\"E}" "Ë")
+    ("{\\\\`E}" "È")
+    ("{\\\\'E}" "É")
+    ("{\\\\^E}" "Ê")
+    ("{\\\\\"I}" "Ï")
+    ("{\\\\`I}" "Ì")
+    ("{\\\\'I}" "Í")
+    ("{\\\\^I}" "Î")
+    ("{\\\\\"O}" "Ö")
+    ("{\\\\`O}" "Ò")
+    ("{\\\\'O}" "Ó")
+    ("{\\\\~O}" "Õ")
+    ("{\\\\^O}" "Ô")
+    ("{\\\\\"U}" "Ü")
+    ("{\\\\`U}" "Ù")
+    ("{\\\\'U}" "Ú")
+    ("{\\\\^U}" "Û")
+    ("{\\\\~n}" "ñ")
+    ("{\\\\~N}" "Ñ")
+    ("{\\\\c c}" "ç")
+    ("{\\\\c C}" "Ç")
+    ("\\\\\"{a}" "ä")
+    ("\\\\`{a}" "à")
+    ("\\\\'{a}" "á")
+    ("\\\\~{a}" "ã")
+    ("\\\\^{a}" "â")
+    ("\\\\\"{e}" "ë")
+    ("\\\\`{e}" "è")
+    ("\\\\'{e}" "é")
+    ("\\\\^{e}" "ê")
+    ("\\\\\"{\\\\i}" "ï")
+    ("\\\\`{\\\\i}" "ì")
+    ("\\\\'{\\\\i}" "í")
+    ("\\\\^{\\\\i}" "î")
+    ("\\\\\"{i}" "ï")
+    ("\\\\`{i}" "ì")
+    ("\\\\'{i}" "í")
+    ("\\\\^{i}" "î")
+    ("\\\\\"{o}" "ö")
+    ("\\\\`{o}" "ò")
+    ("\\\\'{o}" "ó")
+    ("\\\\~{o}" "õ")
+    ("\\\\^{o}" "ô")
+    ("\\\\\"{u}" "ü")
+    ("\\\\`{u}" "ù")
+    ("\\\\'{u}" "ú")
+    ("\\\\^{u}" "û")
+    ("\\\\\"{A}" "Ä")
+    ("\\\\`{A}" "À")
+    ("\\\\'{A}" "Á")
+    ("\\\\~{A}" "Ã")
+    ("\\\\^{A}" "Â")
+    ("\\\\\"{E}" "Ë")
+    ("\\\\`{E}" "È")
+    ("\\\\'{E}" "É")
+    ("\\\\^{E}" "Ê")
+    ("\\\\\"{I}" "Ï")
+    ("\\\\`{I}" "Ì")
+    ("\\\\'{I}" "Í")
+    ("\\\\^{I}" "Î")
+    ("\\\\\"{O}" "Ö")
+    ("\\\\`{O}" "Ò")
+    ("\\\\'{O}" "Ó")
+    ("\\\\~{O}" "Õ")
+    ("\\\\^{O}" "Ô")
+    ("\\\\\"{U}" "Ü")
+    ("\\\\`{U}" "Ù")
+    ("\\\\'{U}" "Ú")
+    ("\\\\^{U}" "Û")
+    ("\\\\~{n}" "ñ")
+    ("\\\\~{N}" "Ñ")
+    ("\\\\c{c}" "ç")
+    ("\\\\c{C}" "Ç")
+    ("{\\\\ss}" "ß")
+    ("?`" "¿")
+    ("!`" "¡")
+    ("{?`}" "¿")
+    ("{!`}" "¡")
+    )
+  "Translation table for translating TeX sequences to ISO 8859-1 characters. 
+This table is not exhaustive (and due to TeX's power can never be). It only
+contains commonly used sequences.")
+
+(defun iso-tex2iso ()
+ "Translate TeX sequences to ISO 8859-1 characters."
+ (interactive)
+ (iso-translate-conventions iso-tex2iso-trans-tab))
+
+(defvar iso-gtex2iso-trans-tab
+  '(
+    ("\"a" "ä")
+    ("\"A" "Ä")
+    ("\"o" "ö")
+    ("\"O" "Ö")
+    ("\"u" "ü")
+    ("\"U" "Ü")
+    ("\"s" "ß")
+    ("\\\\3" "ß")
+    ("{\\\\\"a}" "ä")
+    ("{\\\\`a}" "à")
+    ("{\\\\'a}" "á")
+    ("{\\\\~a}" "ã")
+    ("{\\\\^a}" "â")
+    ("{\\\\\"e}" "ë")
+    ("{\\\\`e}" "è")
+    ("{\\\\'e}" "é")
+    ("{\\\\^e}" "ê")
+    ("{\\\\\"\\\\i}" "ï")
+    ("{\\\\`\\\\i}" "ì")
+    ("{\\\\'\\\\i}" "í")
+    ("{\\\\^\\\\i}" "î")
+    ("{\\\\\"i}" "ï")
+    ("{\\\\`i}" "ì")
+    ("{\\\\'i}" "í")
+    ("{\\\\^i}" "î")
+    ("{\\\\\"o}" "ö")
+    ("{\\\\`o}" "ò")
+    ("{\\\\'o}" "ó")
+    ("{\\\\~o}" "õ")
+    ("{\\\\^o}" "ô")
+    ("{\\\\\"u}" "ü")
+    ("{\\\\`u}" "ù")
+    ("{\\\\'u}" "ú")
+    ("{\\\\^u}" "û")
+    ("{\\\\\"A}" "Ä")
+    ("{\\\\`A}" "À")
+    ("{\\\\'A}" "Á")
+    ("{\\\\~A}" "Ã")
+    ("{\\\\^A}" "Â")
+    ("{\\\\\"E}" "Ë")
+    ("{\\\\`E}" "È")
+    ("{\\\\'E}" "É")
+    ("{\\\\^E}" "Ê")
+    ("{\\\\\"I}" "Ï")
+    ("{\\\\`I}" "Ì")
+    ("{\\\\'I}" "Í")
+    ("{\\\\^I}" "Î")
+    ("{\\\\\"O}" "Ö")
+    ("{\\\\`O}" "Ò")
+    ("{\\\\'O}" "Ó")
+    ("{\\\\~O}" "Õ")
+    ("{\\\\^O}" "Ô")
+    ("{\\\\\"U}" "Ü")
+    ("{\\\\`U}" "Ù")
+    ("{\\\\'U}" "Ú")
+    ("{\\\\^U}" "Û")
+    ("{\\\\~n}" "ñ")
+    ("{\\\\~N}" "Ñ")
+    ("{\\\\c c}" "ç")
+    ("{\\\\c C}" "Ç")
+    ("\\\\\"{a}" "ä")
+    ("\\\\`{a}" "à")
+    ("\\\\'{a}" "á")
+    ("\\\\~{a}" "ã")
+    ("\\\\^{a}" "â")
+    ("\\\\\"{e}" "ë")
+    ("\\\\`{e}" "è")
+    ("\\\\'{e}" "é")
+    ("\\\\^{e}" "ê")
+    ("\\\\\"{\\\\i}" "ï")
+    ("\\\\`{\\\\i}" "ì")
+    ("\\\\'{\\\\i}" "í")
+    ("\\\\^{\\\\i}" "î")
+    ("\\\\\"{i}" "ï")
+    ("\\\\`{i}" "ì")
+    ("\\\\'{i}" "í")
+    ("\\\\^{i}" "î")
+    ("\\\\\"{o}" "ö")
+    ("\\\\`{o}" "ò")
+    ("\\\\'{o}" "ó")
+    ("\\\\~{o}" "õ")
+    ("\\\\^{o}" "ô")
+    ("\\\\\"{u}" "ü")
+    ("\\\\`{u}" "ù")
+    ("\\\\'{u}" "ú")
+    ("\\\\^{u}" "û")
+    ("\\\\\"{A}" "Ä")
+    ("\\\\`{A}" "À")
+    ("\\\\'{A}" "Á")
+    ("\\\\~{A}" "Ã")
+    ("\\\\^{A}" "Â")
+    ("\\\\\"{E}" "Ë")
+    ("\\\\`{E}" "È")
+    ("\\\\'{E}" "É")
+    ("\\\\^{E}" "Ê")
+    ("\\\\\"{I}" "Ï")
+    ("\\\\`{I}" "Ì")
+    ("\\\\'{I}" "Í")
+    ("\\\\^{I}" "Î")
+    ("\\\\\"{O}" "Ö")
+    ("\\\\`{O}" "Ò")
+    ("\\\\'{O}" "Ó")
+    ("\\\\~{O}" "Õ")
+    ("\\\\^{O}" "Ô")
+    ("\\\\\"{U}" "Ü")
+    ("\\\\`{U}" "Ù")
+    ("\\\\'{U}" "Ú")
+    ("\\\\^{U}" "Û")
+    ("\\\\~{n}" "ñ")
+    ("\\\\~{N}" "Ñ")
+    ("\\\\c{c}" "ç")
+    ("\\\\c{C}" "Ç")
+    ("{\\\\ss}" "ß")
+    ("?`" "¿")
+    ("!`" "¡")
+    ("{?`}" "¿")
+    ("{!`}" "¡")
+    )
+  "Translation table for translating German TeX sequences to ISO 8859-1.
+This table is not exhaustive (and due to TeX's power can never be).  It only
+contains commonly used sequences.")
+
+(defvar iso-iso2gtex-trans-tab
+  '(
+    ("ä" "\"a")
+    ("à" "{\\\\`a}")
+    ("á" "{\\\\'a}")
+    ("ã" "{\\\\~a}")
+    ("â" "{\\\\^a}")
+    ("ë" "{\\\\\"e}")
+    ("è" "{\\\\`e}")
+    ("é" "{\\\\'e}")
+    ("ê" "{\\\\^e}")
+    ("ï" "{\\\\\"\\\\i}")
+    ("ì" "{\\\\`\\\\i}")
+    ("í" "{\\\\'\\\\i}")
+    ("î" "{\\\\^\\\\i}")
+    ("ö" "\"o")
+    ("ò" "{\\\\`o}")
+    ("ó" "{\\\\'o}")
+    ("õ" "{\\\\~o}")
+    ("ô" "{\\\\^o}")
+    ("ü" "\"u")
+    ("ù" "{\\\\`u}")
+    ("ú" "{\\\\'u}")
+    ("û" "{\\\\^u}")
+    ("Ä" "\"A")
+    ("À" "{\\\\`A}")
+    ("Á" "{\\\\'A}")
+    ("Ã" "{\\\\~A}")
+    ("Â" "{\\\\^A}")
+    ("Ë" "{\\\\\"E}")
+    ("È" "{\\\\`E}")
+    ("É" "{\\\\'E}")
+    ("Ê" "{\\\\^E}")
+    ("Ï" "{\\\\\"I}")
+    ("Ì" "{\\\\`I}")
+    ("Í" "{\\\\'I}")
+    ("Î" "{\\\\^I}")
+    ("Ö" "\"O")
+    ("Ò" "{\\\\`O}")
+    ("Ó" "{\\\\'O}")
+    ("Õ" "{\\\\~O}")
+    ("Ô" "{\\\\^O}")
+    ("Ü" "\"U")
+    ("Ù" "{\\\\`U}")
+    ("Ú" "{\\\\'U}")
+    ("Û" "{\\\\^U}")
+    ("ñ" "{\\\\~n}")
+    ("Ñ" "{\\\\~N}")
+    ("ç" "{\\\\c c}")
+    ("Ç" "{\\\\c C}")
+    ("ß" "\"s")
+    ("¿" "{?`}")
+    ("¡" "{!`}")
+    )
+  "Translation table for translating ISO 8859-1 characters to German TeX.")
+
+(defun iso-gtex2iso ()
+ "Translate German TeX sequences to ISO 8859-1 characters."
+ (interactive)
+ (iso-translate-conventions iso-gtex2iso-trans-tab))
+
+
+(defun iso-iso2gtex ()
+ "Translate ISO 8859-1 characters to German TeX sequences."
+ (interactive)
+ (iso-translate-conventions iso-iso2gtex-trans-tab))
+
+
+(defun iso-german-tex-p ()
+ "Check if tex buffer is German LaTeX."
+ (save-excursion
+   (widen)
+   (goto-char (point-min))
+   (re-search-forward "\\\\documentstyle\\[.*german.*\\]" nil t)))
+
+(defun iso-fix-iso2tex ()
+  "Turn ISO 8859-1 (aka. ISO Latin-1) buffer into TeX sequences.
+If German TeX is used, German TeX sequences are generated."
+  (if (or (equal major-mode 'latex-mode)
+	  (equal major-mode 'LaTeX-mode)) ; AucTeX wants this
+      (if (iso-german-tex-p)
+	  (iso-iso2gtex)
+	(iso-iso2tex)))
+  (if (or (equal major-mode 'tex-mode)
+	  (equal major-mode 'TeX-mode)) ; AucTeX wants this
+      (iso-iso2tex)))
+
+(defun iso-fix-tex2iso ()
+  "Turn TeX sequences into ISO 8859-1 (aka. ISO Latin-1) characters.
+This function recognices German TeX buffers."
+  (if (or (equal major-mode 'latex-mode)
+	  (equal major-mode 'Latex-mode)) ; AucTeX wants this
+      (if (iso-german-tex-p)
+	  (iso-gtex2iso)
+	(iso-tex2iso)))
+  (if (or (equal major-mode 'tex-mode)
+	  (equal major-mode 'TeX-mode))  ;; AucTeX wants this
+      (iso-tex2iso)))
+
+(defun iso-cvt-ffh ()
+  "find-file-hook for iso-cvt-cvt.el."
+  (iso-fix-tex2iso)
+  (set-buffer-modified-p nil))
+
+(defun iso-cvt-wfh ()
+  "write file hook for iso-cvt-cvt.el."
+  (iso-fix-iso2tex))
+
+(defun iso-cvt-ash ()
+  "after save hook for iso-cvt-cvt.el."
+  (iso-fix-tex2iso)
+  (set-buffer-modified-p nil))
+
+(add-hook 'find-file-hooks 'iso-cvt-ffh)
+(add-hook 'write-file-hooks 'iso-cvt-wfh)
+(add-hook 'after-save-hook 'iso-cvt-ash)
+
+;;; iso-cvt.el ends here