-;; iso-cvt.el -- translate to ISO 8859-1 from/to net/TeX conventions
-;; Copyright © 1993, 1994 Free Software Foundation, Inc.
-;; Was formerly called gm-lingo.el.
+;;; iso-cvt.el --- translate ISO 8859-1 from/to various encodings -*- coding: iso-latin-1 -*-
+;; This file was formerly called gm-lingo.el.
+
+;; Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2003, 2004
+;; Free Software Foundation, Inc.
;; Author: Michael Gschwind <mike@vlsivie.tuwien.ac.at>
;; Keywords: tex, iso, latin, i18n
;; 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:
-;; This lisp code server two purposes, both of which involve
-;; the translation of various conventions for representing European
-;; character sets to ISO 8859-1.
-
-; Net support:
-; Various conventions exist in Newsgroups on how to represent national
-; characters. The functions provided here translate these net conventions
-; to ISO.
-;
-; Calling `iso-german' will turn the net convention for umlauts ("a etc.)
-; into ISO latin1 umlaute for easy reading.
-; 'iso-spanish' will turn net conventions for representing spanish
-; to ISO latin1. (Note that accents are omitted in news posts most
-; of the time, only enye is escaped.)
-
-; TeX support
-; This mode installs hooks which change TeX files to ISO Latin-1 for
-; simplified editing. When the TeX file is saved, ISO latin1 characters are
-; translated back to escape sequences.
-;
-; 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:
-; The net support should install hooks (like TeX support does)
-; which recognizes certains news groups and translates all articles from
-; those groups.
-;
-; Cover more cases for translation (There is an infinite number of ways to
+;; 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:
+;; This lisp code is a general framework for translating various
+;; representations of the same data.
+;; among other things it can be used to translate TeX, HTML, and compressed
+;; files to ISO 8859-1. It can also be used to translate different charsets
+;; such as IBM PC, Macintosh or HP Roman8.
+;; Note that many translations use the GNU recode tool to do the actual
+;; conversion. So you might want to install that tool to get the full
+;; benefit of iso-cvt.el
+
+; TO DO:
+; Cover more cases for translation. (There is an infinite number of ways to
; represent accented characters in TeX)
;; SEE ALSO:
-; If you are interested in questions related to using the ISO 8859-1
+; If you are interested in questions related to using the ISO 8859-1
; characters set (configuring emacs, Unix, etc. to use ISO), then you
-; can get the ISO 8859-1 FAQ via anonymous ftp from
-; ftp.vlsivie.tuwien.ac.at in /pub/bit/FAQ-ISO-8859-1
+; can get the ISO 8859-1 FAQ via anonymous ftp from
+; ftp.vlsivie.tuwien.ac.at in /pub/8bit/FAQ-ISO-8859-1
;;; Code:
-(provide 'iso-cvt)
-
(defvar iso-spanish-trans-tab
'(
("~n" "ñ")
)
"Spanish translation table.")
-(defun iso-translate-conventions (trans-tab)
+(defun iso-translate-conventions (from to trans-tab)
"Use the translation table TRANS-TAB to translate the current buffer."
(save-excursion
- (goto-char (point-min))
- (let ((work-tab trans-tab)
- (buffer-read-only nil)
- (case-fold-search 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)) t 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))
+ (save-restriction
+ (narrow-to-region from to)
+ (goto-char from)
+ (let ((work-tab trans-tab)
+ (buffer-read-only nil)
+ (case-fold-search 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)) t nil)))
+ (setq work-tab (cdr work-tab)))))
+ (point-max))))
+
+;;;###autoload
+(defun iso-spanish (from to &optional buffer)
+ "Translate net conventions for Spanish to ISO 8859-1.
+The region between FROM and TO is translated using the table TRANS-TAB.
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-spanish-trans-tab))
(defvar iso-aggressive-german-trans-tab
'(
("\"s" "ß")
("\\\\3" "ß")
)
- "German translation table.
-This table uses an aggressive translation approach and may translate
-erroneously translate too much.")
+ "German translation table.
+This table uses an aggressive translation approach and may erroneously
+translate too much.")
(defvar iso-conservative-german-trans-tab
'(
("\\([-a-zA-Z\"`]\\)\\\\3" "\\1ß")
)
"German translation table.
-This table uses a conservative translation approach and may translate too
+This table uses a conservative translation approach and may translate too
little.")
-
-(defvar iso-german-trans-tab iso-aggressive-german-trans-tab
+(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))
-
+;;;###autoload
+(defun iso-german (from to &optional buffer)
+ "Translate net conventions for German to ISO 8859-1.
+The region between FROM and TO is translated using the table TRANS-TAB.
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-german-trans-tab))
+
(defvar iso-iso2tex-trans-tab
'(
("ä" "{\\\\\"a}")
("ß" "{\\\\ss}")
("\306" "{\\\\AE}")
("\346" "{\\\\ae}")
- ("\305" "{\\\\o A}")
- ("\345" "{\\\\o a}")
+ ("\305" "{\\\\AA}")
+ ("\345" "{\\\\aa}")
("\251" "{\\\\copyright}")
+ ("£" "{\\\\pounds}")
+ ("¶" "{\\\\P}")
+ ("§" "{\\\\S}")
("¿" "{?`}")
("¡" "{!`}")
)
"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))
-
+;;;###autoload
+(defun iso-iso2tex (from to &optional buffer)
+ "Translate ISO 8859-1 characters to TeX sequences.
+The region between FROM and TO is translated using the table TRANS-TAB.
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-iso2tex-trans-tab))
(defvar iso-tex2iso-trans-tab
'(
("\\\\`e" "è")
("\\\\'e" "é")
("\\\\^e" "ê")
- ("\\\\\"\\\\i" "ï")
- ("\\\\`\\\\i" "ì")
- ("\\\\'\\\\i" "í")
- ("\\\\^\\\\i" "î")
+ ;; Discard spaces and/or one EOF after macro \i.
+ ;; Converting it back will use braces.
+ ("\\\\\"\\\\i *\n\n" "ï\n\n")
+ ("\\\\\"\\\\i *\n?" "ï")
+ ("\\\\`\\\\i *\n\n" "ì\n\n")
+ ("\\\\`\\\\i *\n?" "ì")
+ ("\\\\'\\\\i *\n\n" "í\n\n")
+ ("\\\\'\\\\i *\n?" "í")
+ ("\\\\^\\\\i *\n\n" "î\n\n")
+ ("\\\\^\\\\i *\n?" "î")
("\\\\\"i" "ï")
("\\\\`i" "ì")
("\\\\'i" "í")
("{\\\\ss}" "ß")
("{\\\\AE}" "\306")
("{\\\\ae}" "\346")
- ("{\\\\o A}" "\305")
- ("\\\\o{A}" "\305")
- ("{\\\\o a}" "\345")
- ("\\\\o{a}" "\345")
+ ("{\\\\AA}" "\305")
+ ("{\\\\aa}" "\345")
("{\\\\copyright}" "\251")
("\\\\copyright{}" "\251")
+ ("{\\\\pounds}" "£" )
+ ("{\\\\P}" "¶" )
+ ("{\\\\S}" "§" )
+ ("\\\\pounds{}" "£" )
+ ("\\\\P{}" "¶" )
+ ("\\\\S{}" "§" )
("{\\?`}" "¿")
("{!`}" "¡")
("\\?`" "¿")
("!`" "¡")
)
- "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
+ "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))
+;;;###autoload
+(defun iso-tex2iso (from to &optional buffer)
+ "Translate TeX sequences to ISO 8859-1 characters.
+The region between FROM and TO is translated using the table TRANS-TAB.
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-tex2iso-trans-tab))
(defvar iso-gtex2iso-trans-tab
'(
("{\\\\ss}" "ß")
("{\\\\AE}" "\306")
("{\\\\ae}" "\346")
- ("{\\\\o A}" "\305")
- ("\\\\o{A}" "\305")
- ("{\\\\o a}" "\345")
- ("\\\\o{a}" "\345")
+ ("{\\\\AA}" "\305")
+ ("{\\\\aa}" "\345")
("{\\\\copyright}" "\251")
("\\\\copyright{}" "\251")
+ ("{\\\\pounds}" "£" )
+ ("{\\\\P}" "¶" )
+ ("{\\\\S}" "§" )
+ ("\\\\pounds{}" "£" )
+ ("\\\\P{}" "¶" )
+ ("\\\\S{}" "§" )
("?`" "¿")
("!`" "¡")
("{?`}" "¿")
("ß" "\"s")
("\306" "{\\\\AE}")
("\346" "{\\\\ae}")
- ("\305" "{\\\\o A}")
- ("\345" "{\\\\o a}")
+ ("\305" "{\\\\AA}")
+ ("\345" "{\\\\aa}")
("\251" "{\\\\copyright}")
+ ("£" "{\\\\pounds}")
+ ("¶" "{\\\\P}")
+ ("§" "{\\\\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
- (save-restriction
- (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
- (equal major-mode 'plain-tex-mode))
- (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
- (equal major-mode 'plain-tex-mode))
- (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)
+;;;###autoload
+(defun iso-gtex2iso (from to &optional buffer)
+ "Translate German TeX sequences to ISO 8859-1 characters.
+The region between FROM and TO is translated using the table TRANS-TAB.
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-gtex2iso-trans-tab))
+
+;;;###autoload
+(defun iso-iso2gtex (from to &optional buffer)
+ "Translate ISO 8859-1 characters to German TeX sequences.
+The region between FROM and TO is translated using the table TRANS-TAB.
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-iso2gtex-trans-tab))
+
+(defvar iso-iso2duden-trans-tab
+ '(("ä" "ae")
+ ("Ä" "Ae")
+ ("ö" "oe")
+ ("Ö" "Oe")
+ ("ü" "ue")
+ ("Ü" "Ue")
+ ("ß" "ss")))
+
+;;;###autoload
+(defun iso-iso2duden (from to &optional buffer)
+ "Translate ISO 8859-1 characters to German TeX sequences.
+The region between FROM and TO is translated using the table TRANS-TAB.
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-iso2duden-trans-tab))
+
+(defvar iso-iso2sgml-trans-tab
+ '(("À" "À")
+ ("Á" "Á")
+ ("Â" "Â")
+ ("Ã" "Ã")
+ ("Ä" "Ä")
+ ("Å" "Å")
+ ("Æ" "Æ")
+ ("Ç" "Ç")
+ ("È" "È")
+ ("É" "É")
+ ("Ê" "Ê")
+ ("Ë" "Ë")
+ ("Ì" "Ì")
+ ("Í" "Í")
+ ("Î" "Î")
+ ("Ï" "Ï")
+ ("Ð" "Ð")
+ ("Ñ" "Ñ")
+ ("Ò" "Ò")
+ ("Ó" "Ó")
+ ("Ô" "Ô")
+ ("Õ" "Õ")
+ ("Ö" "Ö")
+ ("Ø" "Ø")
+ ("Ù" "Ù")
+ ("Ú" "Ú")
+ ("Û" "Û")
+ ("Ü" "Ü")
+ ("Ý" "Ý")
+ ("Þ" "Þ")
+ ("ß" "ß")
+ ("à" "à")
+ ("á" "á")
+ ("â" "â")
+ ("ã" "ã")
+ ("ä" "ä")
+ ("å" "å")
+ ("æ" "æ")
+ ("ç" "ç")
+ ("è" "è")
+ ("é" "é")
+ ("ê" "ê")
+ ("ë" "ë")
+ ("ì" "ì")
+ ("í" "í")
+ ("î" "î")
+ ("ï" "ï")
+ ("ð" "ð")
+ ("ñ" "ñ")
+ ("ò" "ò")
+ ("ó" "ó")
+ ("ô" "ô")
+ ("õ" "õ")
+ ("ö" "ö")
+ ("ø" "ø")
+ ("ù" "ù")
+ ("ú" "ú")
+ ("û" "û")
+ ("ü" "ü")
+ ("ý" "ý")
+ ("þ" "þ")
+ ("ÿ" "ÿ")))
+
+(defvar iso-sgml2iso-trans-tab
+ '(("À" "À")
+ ("Á" "Á")
+ ("Â" "Â")
+ ("Ã" "Ã")
+ ("Ä" "Ä")
+ ("Å" "Å")
+ ("Æ" "Æ")
+ ("Ç" "Ç")
+ ("È" "È")
+ ("É" "É")
+ ("Ê" "Ê")
+ ("Ë" "Ë")
+ ("Ì" "Ì")
+ ("Í" "Í")
+ ("Î" "Î")
+ ("Ï" "Ï")
+ ("Ð" "Ð")
+ ("Ñ" "Ñ")
+ ("Ò" "Ò")
+ ("Ó" "Ó")
+ ("Ô" "Ô")
+ ("Õ" "Õ")
+ ("Ö" "Ö")
+ ("Ø" "Ø")
+ ("Ù" "Ù")
+ ("Ú" "Ú")
+ ("Û" "Û")
+ ("Ü" "Ü")
+ ("Ý" "Ý")
+ ("Þ" "Þ")
+ ("ß" "ß")
+ ("à" "à")
+ ("á" "á")
+ ("â" "â")
+ ("ã" "ã")
+ ("ä" "ä")
+ ("å" "å")
+ ("æ" "æ")
+ ("ç" "ç")
+ ("è" "è")
+ ("é" "é")
+ ("ê" "ê")
+ ("ë" "ë")
+ ("ì" "ì")
+ ("í" "í")
+ ("î" "î")
+ ("ï" "ï")
+ ("ð" "ð")
+ ("ñ" "ñ")
+ (" " " ")
+ ("ò" "ò")
+ ("ó" "ó")
+ ("ô" "ô")
+ ("õ" "õ")
+ ("ö" "ö")
+ ("ø" "ø")
+ ("ù" "ù")
+ ("ú" "ú")
+ ("û" "û")
+ ("ü" "ü")
+ ("ý" "ý")
+ ("þ" "þ")
+ ("ÿ" "ÿ")))
+
+;;;###autoload
+(defun iso-iso2sgml (from to &optional buffer)
+ "Translate ISO 8859-1 characters in the region to SGML entities.
+The entities used are from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-iso2sgml-trans-tab))
+
+;;;###autoload
+(defun iso-sgml2iso (from to &optional buffer)
+ "Translate SGML entities in the region to ISO 8859-1 characters.
+The entities used are from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
+Optional arg BUFFER is ignored (for use in `format-alist')."
+ (interactive "*r")
+ (iso-translate-conventions from to iso-sgml2iso-trans-tab))
+
+;;;###autoload
+(defun iso-cvt-read-only ()
+ "Warn that format is read-only."
+ (interactive)
+ (error "This format is read-only; specify another format for writing"))
+
+;;;###autoload
+(defun iso-cvt-write-only ()
+ "Warn that format is write-only."
+ (interactive)
+ (error "This format is write-only"))
+
+;;;###autoload
+(defun iso-cvt-define-menu ()
+ "Add submenus to the File menu, to convert to and from various formats."
+ (interactive)
+
+ (let ((load-as-menu-map (make-sparse-keymap "Load As..."))
+ (insert-as-menu-map (make-sparse-keymap "Insert As..."))
+ (write-as-menu-map (make-sparse-keymap "Write As..."))
+ (translate-to-menu-map (make-sparse-keymap "Translate to..."))
+ (translate-from-menu-map (make-sparse-keymap "Translate from..."))
+ (menu menu-bar-file-menu))
+
+ (define-key menu [load-as-separator] '("--"))
+
+ (define-key menu [load-as] '("Load As..." . iso-cvt-load-as))
+ (fset 'iso-cvt-load-as load-as-menu-map)
+
+ ;;(define-key menu [insert-as] '("Insert As..." . iso-cvt-insert-as))
+ (fset 'iso-cvt-insert-as insert-as-menu-map)
+
+ (define-key menu [write-as] '("Write As..." . iso-cvt-write-as))
+ (fset 'iso-cvt-write-as write-as-menu-map)
+
+ (define-key menu [translate-separator] '("--"))
+
+ (define-key menu [translate-to] '("Translate to..." . iso-cvt-translate-to))
+ (fset 'iso-cvt-translate-to translate-to-menu-map)
+
+ (define-key menu [translate-from] '("Translate from..." . iso-cvt-translate-from))
+ (fset 'iso-cvt-translate-from translate-from-menu-map)
+
+ (dolist (file-type (reverse format-alist))
+ (let ((name (car file-type))
+ (str-name (cadr file-type)))
+ (if (stringp str-name)
+ (progn
+ (define-key load-as-menu-map (vector name)
+ (cons str-name
+ `(lambda (file)
+ (interactive ,(format "FFind file (as %s): " name))
+ (format-find-file file ',name))))
+ (define-key insert-as-menu-map (vector name)
+ (cons str-name
+ `(lambda (file)
+ (interactive (format "FInsert file (as %s): " ,name))
+ (format-insert-file file ',name))))
+ (define-key write-as-menu-map (vector name)
+ (cons str-name
+ `(lambda (file)
+ (interactive (format "FWrite file (as %s): " ,name))
+ (format-write-file file ',name))))
+ (define-key translate-to-menu-map (vector name)
+ (cons str-name
+ `(lambda ()
+ (interactive)
+ (format-encode-buffer ',name))))
+ (define-key translate-from-menu-map (vector name)
+ (cons str-name
+ `(lambda ()
+ (interactive)
+ (format-decode-buffer ',name))))))))))
+
+(provide 'iso-cvt)
+;; arch-tag: 64ae843f-ed0e-43e1-ba50-ffd581b90840
;;; iso-cvt.el ends here