;; -*- coding: utf-8 -*-
;; buffer-file-coding-system: utf-8

;; emacs lisp functions for transliteration from cyrillic to latin and back.

;; Actually implemented:
;;  [gost]     ГОСТ 16876-71 (version without diacritics)
;;  [iso-new]  ISO/R9: 1999
;;  [iso-old]  ISO/R9: 1968
;;  [lcon-ru]  Library of Congress Russian
;;  [lcon-sr]  Library of Congress Serbian and Macedonian
;;  [lcon-ua]  Library of Congress Ukrainian
;;  [lcon-be]  Library of Congress Belorussian
;;  [lcon-bg]  Library of Congress Bulgarian
;;  [lcon-ocs] Library of Congress Old Church Slavonic

;; function names:
;;  translit-to-<name>
;;  translit-from-<name>

;; Sources:
;;   - [International Organization for Standardization] 1968:
;;       Interational system for the transliteration of Cyrillic characters
;;       into Latin characters (ISO/R 9). Geneva. 
;;   - Barry, Randall Keigan [Library of Congress; American Library Association] 1991:
;;       ALA-LC romanization tables: transliteration scripts for non-Roman scripts. Washington. 
;;  and various tables found in the WWW, especially at
;;   - http://ee.www.ee/transliteration/


;; Lisp code is autogenerated by a perl script. Don't edit!

;; I'm sure, there are more efficient solutions, but ...


;; A simple function for testing:
;; (defun translit (beginning end)
;;    (interactive "r")
;;    (message "Transliterating region ... ")
;;    (save-excursion
;;      (let ((e end)
;; 	   (count 0)
;; 	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
;; 	     (translit-table ;; association list for characters
;; 	      (list
;; 	       (cons ?a "A")
;; 	       (cons ?y "Y")
;; 	       (cons ?k "K")
;; 	       (cons ?l "L")
;; 	       )))
;;        (setq case-fold-search nil) ;; case-sensitive search for transliterating
;;        ;; character sequences we replace longest first
;;        (goto-char beginning)
;;        (while (search-forward "shh" e t)
;; 	 (replace-match "Z")
;; 	 (setq e (- e 2))
;; 	 (setq count (1+ count)))
;;        (goto-char beginning)
;;        (while (search-forward "sh" e t)
;; 	 (replace-match "S")
;; 	 (setq e (1- e))
;; 	 (setq count (1+ count)))
;;        ;; now replace single characters according to table
;;        (goto-char beginning)
;;        (while (< (point) e)
;; 	 (setq tr (assq (char-after (point)) translit-table))
;; 	 (if (null tr)
;; 	     (forward-char 1)
;; 	   (delete-char 1)
;; 	   (insert (cdr tr))
;; 	   (setq count (1+ count))
;; 	   (setq e (+ e (1- (length (cdr tr)))))))
;;        (cond ((zerop count)
;; 	      (message "Nothing to transliterate!"))
;; 	     ((= 1 count)
;; 	      (message "1 character transliterated."))
;; 	     (t
;; 	      (message "%d characters transliterated." count)))
;;        (setq case-fold-search old-value-of-case-fold-search))))
;; ;; test: shashlyk shha








(defun translit-from-gost (beginning end)
  "retransliterate region from latin to cyrillic using ГОСТ 16876-71"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?' "ь")
	       (cons ?* "'")
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?C "Ц")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Г")
	       (cons ?I "И")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "У")
	       (cons ?V "В")
	       (cons ?Y "Ы")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?c "ц")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "г")
	       (cons ?i "и")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "у")
	       (cons ?v "в")
	       (cons ?y "ы")
	       (cons ?z "з")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "SHH" end t)
	(replace-match "Щ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Shh" end t)
	(replace-match "Щ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "shh" end t)
	(replace-match "щ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "CH" end t)
	(replace-match "Ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ch" end t)
	(replace-match "Ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "EH" end t)
	(replace-match "Э")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Eh" end t)
	(replace-match "Э")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "JA" end t)
	(replace-match "Я")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "JJ" end t)
	(replace-match "Й")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "JO" end t)
	(replace-match "Ё")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "JU" end t)
	(replace-match "Ю")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ja" end t)
	(replace-match "Я")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Jj" end t)
	(replace-match "Й")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Jo" end t)
	(replace-match "Ё")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ju" end t)
	(replace-match "Ю")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "KH" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Kh" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "SH" end t)
	(replace-match "Ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Sh" end t)
	(replace-match "Ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ZH" end t)
	(replace-match "Ж")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Zh" end t)
	(replace-match "Ж")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "\"" end t)
	(replace-match "ъ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ch" end t)
	(replace-match "ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "eh" end t)
	(replace-match "э")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ja" end t)
	(replace-match "я")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "jj" end t)
	(replace-match "й")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "jo" end t)
	(replace-match "ё")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ju" end t)
	(replace-match "ю")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "kh" end t)
	(replace-match "х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "sh" end t)
	(replace-match "ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "zh" end t)
	(replace-match "ж")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-to-gost (beginning end)
  "transliterate region from cyrillic to latin using ГОСТ 16876-71"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?' "*")
	       (cons ?Ё "Jo")
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "G")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Zh")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?Й "Jj")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "U")
	       (cons ?Ф "F")
	       (cons ?Х "Kh")
	       (cons ?Ц "C")
	       (cons ?Ч "Ch")
	       (cons ?Ш "Sh")
	       (cons ?Щ "Shh")
	       (cons ?Ъ "\"")
	       (cons ?Ы "Y")
	       (cons ?Ь "'")
	       (cons ?Э "Eh")
	       (cons ?Ю "Ju")
	       (cons ?Я "Ja")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "g")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "zh")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?й "jj")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "u")
	       (cons ?ф "f")
	       (cons ?х "kh")
	       (cons ?ц "c")
	       (cons ?ч "ch")
	       (cons ?ш "sh")
	       (cons ?щ "shh")
	       (cons ?ъ "\"")
	       (cons ?ы "y")
	       (cons ?ь "'")
	       (cons ?э "eh")
	       (cons ?ю "ju")
	       (cons ?я "ja")
	       (cons ?ё "jo")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-from-iso-new (beginning end)
  "retransliterate region from latin to cyrillic using ISO 9: 1995"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?' "Ь")
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?C "Ц")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Г")
	       (cons ?H "Х")
	       (cons ?I "И")
	       (cons ?J "Й")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "У")
	       (cons ?V "В")
	       (cons ?Y "Ы")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?c "ц")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "г")
	       (cons ?h "х")
	       (cons ?i "и")
	       (cons ?j "й")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "у")
	       (cons ?v "в")
	       (cons ?y "ы")
	       (cons ?z "з")
	       (cons ?À "Ӛ")
	       (cons ?Â "Я")
	       (cons ?Ä "Ӓ")
	       (cons ?Æ "Ӕ")
	       (cons ?È "Э")
	       (cons ?Ê "Є")
	       (cons ?Ë "Ё")
	       (cons ?Ì "І")
	       (cons ?Î "Ӥ")
	       (cons ?Ï "Ї")
	       (cons ?Ð "Ђ")
	       (cons ?Ò "Ҩ")
	       (cons ?Ô "Ө")
	       (cons ?Ö "Ӧ")
	       (cons ?Ù "Ү")
	       (cons ?Û "Ю")
	       (cons ?Ü "Ӱ")
	       (cons ?à "ӛ")
	       (cons ?â "я")
	       (cons ?ä "ӓ")
	       (cons ?æ "ӕ")
	       (cons ?è "э")
	       (cons ?ê "є")
	       (cons ?ë "ё")
	       (cons ?ì "і")
	       (cons ?î "ӥ")
	       (cons ?ï "ї")
	       (cons ?ò "ҩ")
	       (cons ?ô "ө")
	       (cons ?ö "ӧ")
	       (cons ?ù "ү")
	       (cons ?û "ю")
	       (cons ?ü "ӱ")
	       (cons ?ÿ "ӹ")
	       (cons ?Ă "Ӑ")
	       (cons ?ă "ӑ")
	       (cons ?Ć "Ћ")
	       (cons ?ć "ћ")
	       (cons ?Ĉ "Ҹ")
	       (cons ?ĉ "ҹ")
	       (cons ?Č "Ч")
	       (cons ?č "ч")
	       (cons ?đ "ђ")
	       (cons ?Ĕ "Ӗ")
	       (cons ?ĕ "ӗ")
	       (cons ?Ě "Ѣ")
	       (cons ?ě "ѣ")
	       (cons ?Ğ "Ҕ")
	       (cons ?ğ "ҕ")
	       (cons ?Ġ "Ғ")
	       (cons ?ġ "ғ")
	       (cons ?Ľ "Љ")
	       (cons ?Ň "Њ")
	       (cons ?Ő "Ӫ")
	       (cons ?ő "ӫ")
	       (cons ?Ŝ "Щ")
	       (cons ?ŝ "щ")
	       (cons ?Š "Ш")
	       (cons ?š "ш")
	       (cons ?Ū "Ӯ")
	       (cons ?ū "ӯ")
	       (cons ?ŭ "ў")
	       (cons ?Ű "Ӳ")
	       (cons ?ű "ӳ")
	       (cons ?Ÿ "Ӹ")
	       (cons ?Ź "Ӡ")
	       (cons ?ź "ӡ")
	       (cons ?Ž "Ж")
	       (cons ?ž "ж")
	       (cons ?Ǎ "Ѫ")
	       (cons ?ǎ "ѫ")
	       (cons ?Ǔ "Ў")
	       (cons ?Ǩ "Ҡ")
	       (cons ?ǩ "ҡ")
	       (cons ?ǰ "ј")
	       (cons ?Ǵ "Ѓ")
	       (cons ?ǵ "ѓ")
	       (cons ?ʹ "ь")
	       (cons ?ʺ "ъ")
	       (cons ?Ḥ "Һ")
	       (cons ?ḥ "һ")
	       (cons ?Ḱ "Ќ")
	       (cons ?ḱ "ќ")
	       (cons ?Ṅ "Ҥ")
	       (cons ?ṅ "ҥ")
	       (cons ?Ṕ "Ҧ")
	       (cons ?ṕ "ҧ")
	       (cons ?Ẑ "Ѕ")
	       (cons ?ẑ "ѕ")
	       (cons ?Ỳ "Ѵ")
	       (cons ?ỳ "ѵ")
	       (cons ?‡ "Ӏ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "A̋" end t)
	(replace-match "Ә")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "C̄" end t)
	(replace-match "Ҵ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "C̅" end t)
	(replace-match "Ҽ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "C̈" end t)
	(replace-match "Ӵ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "C̣" end t)
	(replace-match "Ӌ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "C̦" end t)
	(replace-match "Ҷ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "D̂" end t)
	(replace-match "Џ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "F̀" end t)
	(replace-match "Ѳ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "G̀" end t)
	(replace-match "Ґ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "H̦" end t)
	(replace-match "Ҳ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ī" end t)
	(replace-match "Ӣ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "J̌" end t)
	(replace-match "Ј")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "K̂" end t)
	(replace-match "Ҝ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "K̄" end t)
	(replace-match "Ҟ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ḳ" end t)
	(replace-match "Ӄ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "K̦" end t)
	(replace-match "Қ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ṇ" end t)
	(replace-match "Ӈ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "N̦" end t)
	(replace-match "Ң")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ș" end t)
	(replace-match "Ҫ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ț" end t)
	(replace-match "Ҭ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "U̇" end t)
	(replace-match "Ұ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Z̄" end t)
	(replace-match "Ӝ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Z̅" end t)
	(replace-match "Ӂ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Z̈" end t)
	(replace-match "Ӟ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Z̦" end t)
	(replace-match "Ҙ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "\"" end t)
	(replace-match "Ъ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "a̋" end t)
	(replace-match "ә")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "c̄" end t)
	(replace-match "ҵ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "c̅" end t)
	(replace-match "ҽ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "c̈" end t)
	(replace-match "ӵ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "c̣" end t)
	(replace-match "ӌ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "c̦" end t)
	(replace-match "ҷ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "d̂" end t)
	(replace-match "џ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "f̀" end t)
	(replace-match "ѳ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "g̀" end t)
	(replace-match "ґ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "h̦" end t)
	(replace-match "ҳ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ī" end t)
	(replace-match "ӣ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "k̂" end t)
	(replace-match "ҝ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "k̄" end t)
	(replace-match "ҟ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ḳ" end t)
	(replace-match "ӄ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "k̦" end t)
	(replace-match "қ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "l̂" end t)
	(replace-match "љ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "n̂" end t)
	(replace-match "њ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ṇ" end t)
	(replace-match "ӈ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "n̦" end t)
	(replace-match "ң")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ș" end t)
	(replace-match "ҫ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ț" end t)
	(replace-match "ҭ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "u̇" end t)
	(replace-match "ұ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "z̄" end t)
	(replace-match "ӝ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "z̅" end t)
	(replace-match "ӂ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "z̈" end t)
	(replace-match "ӟ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "z̦" end t)
	(replace-match "ҙ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ç̅" end t)
	(replace-match "Ҿ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ç̅" end t)
	(replace-match "ҿ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ž̦" end t)
	(replace-match "Җ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ž̦" end t)
	(replace-match "җ")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-to-iso-new (beginning end)
  "transliterate region from cyrillic to latin using ISO 9: 1995"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?Ё "Ë")
	       (cons ?Ђ "Ð")
	       (cons ?Ѓ "Ǵ")
	       (cons ?Є "Ê")
	       (cons ?Ѕ "Ẑ")
	       (cons ?І "Ì")
	       (cons ?Ї "Ï")
	       (cons ?Ј "J̌")
	       (cons ?Љ "Ľ")
	       (cons ?Њ "Ň")
	       (cons ?Ћ "Ć")
	       (cons ?Ќ "Ḱ")
	       (cons ?Ў "Ǔ")
	       (cons ?Џ "D̂")
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "G")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Ž")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?Й "J")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "U")
	       (cons ?Ф "F")
	       (cons ?Х "H")
	       (cons ?Ц "C")
	       (cons ?Ч "Č")
	       (cons ?Ш "Š")
	       (cons ?Щ "Ŝ")
	       (cons ?Ъ "ʺ")
	       (cons ?Ы "Y")
	       (cons ?Ь "ʹ")
	       (cons ?Э "È")
	       (cons ?Ю "Û")
	       (cons ?Я "Â")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "g")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "ž")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?й "j")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "u")
	       (cons ?ф "f")
	       (cons ?х "h")
	       (cons ?ц "c")
	       (cons ?ч "č")
	       (cons ?ш "š")
	       (cons ?щ "ŝ")
	       (cons ?ъ "ʺ")
	       (cons ?ы "y")
	       (cons ?ь "ʹ")
	       (cons ?э "è")
	       (cons ?ю "û")
	       (cons ?я "â")
	       (cons ?ё "ë")
	       (cons ?ђ "đ")
	       (cons ?ѓ "ǵ")
	       (cons ?є "ê")
	       (cons ?ѕ "ẑ")
	       (cons ?і "ì")
	       (cons ?ї "ï")
	       (cons ?ј "ǰ")
	       (cons ?љ "l̂")
	       (cons ?њ "n̂")
	       (cons ?ћ "ć")
	       (cons ?ќ "ḱ")
	       (cons ?ў "ŭ")
	       (cons ?џ "d̂")
	       (cons ?Ѣ "Ě")
	       (cons ?ѣ "ě")
	       (cons ?Ѫ "Ǎ")
	       (cons ?ѫ "ǎ")
	       (cons ?Ѳ "F̀")
	       (cons ?ѳ "f̀")
	       (cons ?Ѵ "Ỳ")
	       (cons ?ѵ "ỳ")
	       (cons ?Ґ "G̀")
	       (cons ?ґ "g̀")
	       (cons ?Ғ "Ġ")
	       (cons ?ғ "ġ")
	       (cons ?Ҕ "Ğ")
	       (cons ?ҕ "ğ")
	       (cons ?Җ "Ž̦")
	       (cons ?җ "ž̦")
	       (cons ?Ҙ "Z̦")
	       (cons ?ҙ "z̦")
	       (cons ?Қ "K̦")
	       (cons ?қ "k̦")
	       (cons ?Ҝ "K̂")
	       (cons ?ҝ "k̂")
	       (cons ?Ҟ "K̄")
	       (cons ?ҟ "k̄")
	       (cons ?Ҡ "Ǩ")
	       (cons ?ҡ "ǩ")
	       (cons ?Ң "N̦")
	       (cons ?ң "n̦")
	       (cons ?Ҥ "Ṅ")
	       (cons ?ҥ "ṅ")
	       (cons ?Ҧ "Ṕ")
	       (cons ?ҧ "ṕ")
	       (cons ?Ҩ "Ò")
	       (cons ?ҩ "ò")
	       (cons ?Ҫ "Ș")
	       (cons ?ҫ "ș")
	       (cons ?Ҭ "Ț")
	       (cons ?ҭ "ț")
	       (cons ?Ү "Ù")
	       (cons ?ү "ù")
	       (cons ?Ұ "U̇")
	       (cons ?ұ "u̇")
	       (cons ?Ҳ "H̦")
	       (cons ?ҳ "h̦")
	       (cons ?Ҵ "C̄")
	       (cons ?ҵ "c̄")
	       (cons ?Ҷ "C̦")
	       (cons ?ҷ "c̦")
	       (cons ?Ҹ "Ĉ")
	       (cons ?ҹ "ĉ")
	       (cons ?Һ "Ḥ")
	       (cons ?һ "ḥ")
	       (cons ?Ҽ "C̅")
	       (cons ?ҽ "c̅")
	       (cons ?Ҿ "Ç̅")
	       (cons ?ҿ "ç̅")
	       (cons ?Ӏ "‡")
	       (cons ?Ӂ "Z̅")
	       (cons ?ӂ "z̅")
	       (cons ?Ӄ "Ḳ")
	       (cons ?ӄ "ḳ")
	       (cons ?Ӈ "Ṇ")
	       (cons ?ӈ "ṇ")
	       (cons ?Ӌ "C̣")
	       (cons ?ӌ "c̣")
	       (cons ?Ӑ "Ă")
	       (cons ?ӑ "ă")
	       (cons ?Ӓ "Ä")
	       (cons ?ӓ "ä")
	       (cons ?Ӕ "Æ")
	       (cons ?ӕ "æ")
	       (cons ?Ӗ "Ĕ")
	       (cons ?ӗ "ĕ")
	       (cons ?Ә "A̋")
	       (cons ?ә "a̋")
	       (cons ?Ӛ "À")
	       (cons ?ӛ "à")
	       (cons ?Ӝ "Z̄")
	       (cons ?ӝ "z̄")
	       (cons ?Ӟ "Z̈")
	       (cons ?ӟ "z̈")
	       (cons ?Ӡ "Ź")
	       (cons ?ӡ "ź")
	       (cons ?Ӣ "Ī")
	       (cons ?ӣ "ī")
	       (cons ?Ӥ "Î")
	       (cons ?ӥ "î")
	       (cons ?Ӧ "Ö")
	       (cons ?ӧ "ö")
	       (cons ?Ө "Ô")
	       (cons ?ө "ô")
	       (cons ?Ӫ "Ő")
	       (cons ?ӫ "ő")
	       (cons ?Ӯ "Ū")
	       (cons ?ӯ "ū")
	       (cons ?Ӱ "Ü")
	       (cons ?ӱ "ü")
	       (cons ?Ӳ "Ű")
	       (cons ?ӳ "ű")
	       (cons ?Ӵ "C̈")
	       (cons ?ӵ "c̈")
	       (cons ?Ӹ "Ÿ")
	       (cons ?ӹ "ÿ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-to-iso-old (beginning end)
  "transliterate region from cyrillic to latin using ISO 9: 1968"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?Ё "Ë")
	       (cons ?І "Ī")
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "G")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Ž")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?Й "J")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "U")
	       (cons ?Ф "F")
	       (cons ?Х "Ch")
	       (cons ?Ц "C")
	       (cons ?Ч "Č")
	       (cons ?Ш "Š")
	       (cons ?Щ "Šč")
	       (cons ?Ъ "ʺ")
	       (cons ?Ы "Y")
	       (cons ?Ь "ʹ")
	       (cons ?Э "Ė")
	       (cons ?Ю "Ju")
	       (cons ?Я "Ja")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "g")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "ž")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?й "j")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "u")
	       (cons ?ф "f")
	       (cons ?х "ch")
	       (cons ?ц "c")
	       (cons ?ч "č")
	       (cons ?ш "š")
	       (cons ?щ "šč")
	       (cons ?ъ "ʺ")
	       (cons ?ы "y")
	       (cons ?ь "ʹ")
	       (cons ?э "ė")
	       (cons ?ю "ju")
	       (cons ?я "ja")
	       (cons ?ё "ë")
	       (cons ?і "ī")
	       (cons ?Ѣ "Ě")
	       (cons ?ѣ "ě")
	       (cons ?Ѧ "Ę")
	       (cons ?ѧ "ę")
	       (cons ?Ѫ "Ǫ")
	       (cons ?ѫ "ǫ")
	       (cons ?Ѳ "Ḟ")
	       (cons ?ѳ "ḟ")
	       (cons ?Ѵ "Ẏ")
	       (cons ?ѵ "ẏ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-from-iso-old (beginning end)
  "retransliterate region from latin to cyrillic using ISO 9: 1968"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?' "Ь")
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?C "Ц")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Г")
	       (cons ?I "И")
	       (cons ?J "Й")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "У")
	       (cons ?V "В")
	       (cons ?Y "Ы")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?c "ц")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "г")
	       (cons ?i "и")
	       (cons ?j "й")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "у")
	       (cons ?v "в")
	       (cons ?y "ы")
	       (cons ?z "з")
	       (cons ?Ë "Ё")
	       (cons ?ë "ё")
	       (cons ?Č "Ч")
	       (cons ?č "ч")
	       (cons ?Ė "Э")
	       (cons ?ė "э")
	       (cons ?Ę "Ѧ")
	       (cons ?ę "ѧ")
	       (cons ?Ě "Ѣ")
	       (cons ?ě "ѣ")
	       (cons ?Ī "І")
	       (cons ?ī "і")
	       (cons ?Š "Ш")
	       (cons ?š "ш")
	       (cons ?Ž "Ж")
	       (cons ?ž "ж")
	       (cons ?Ǫ "Ѫ")
	       (cons ?ǫ "ѫ")
	       (cons ?ʹ "ь")
	       (cons ?ʺ "ъ")
	       (cons ?Ḟ "Ѳ")
	       (cons ?ḟ "ѳ")
	       (cons ?Ẏ "Ѵ")
	       (cons ?ẏ "ѵ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "CH" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ch" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "JA" end t)
	(replace-match "Я")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "JU" end t)
	(replace-match "Ю")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ja" end t)
	(replace-match "Я")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ju" end t)
	(replace-match "Ю")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "\"" end t)
	(replace-match "Ъ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ch" end t)
	(replace-match "х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ja" end t)
	(replace-match "я")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ju" end t)
	(replace-match "ю")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ŠČ" end t)
	(replace-match "Щ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Šč" end t)
	(replace-match "Щ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "šč" end t)
	(replace-match "щ")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

;;; Ане становилось скучно сидеть без дела рядом с сестрой на травяном
;;; скате; раза два она заглянула в книжку, но в ней не было ни
;;; разговоров, ни картинок. "Что проку в книжке без картинок и без
;;; разговоров?" — подумала Аня.
;;; Она чувствовала себя глупой и сонной — такой был жаркий день. Только
;;; что принялась она рассуждать про себя, стоит ли встать, чтобы набрать
;;; ромашек и свить из них цепь, как вдруг, откуда ни возьмись, пробежал
;;; мимо нее Белый Кролик с розовыми глазами.
;;; В этом, конечно, ничего особенно замечательного не было; не удивилась
;;; Аня и тогда, когда услыхала, что Кролик бормочет себе под нос: "Боже
;;; мой, Боже мой, я наверняка опоздаю".
;;; 
;;; Ane stanovilos´ skuchno sidet´ bez dela ri͡adom s sestroĭ na travi͡anom
;;; skate; raza dva ona zagli͡anula v knizhku, no v neĭ ne bylo ni
;;; razgovorov, ni kartinok. "Chto proku v knizhke bez kartinok i bez
;;; razgovorov?" — podumala Ani͡a.
;;; Ona chuvstvovala sebi͡a glupoĭ i sonnoĭ — takoĭ byl zharkiĭ den´. Tol´ko
;;; chto prini͡alas´ ona rassuzhdat´ pro sebi͡a, stoit li vstat´, chtoby nabrat´
;;; romashek i svit´ iz nikh t͡sep´, kak vdrug, otkuda ni voz´mis´, probezhal
;;; mimo nee Belyĭ Krolik s rozovymi glazami.
;;; V ėtom, konechno, nichego osobenno zamechatel´nogo ne bylo; ne udivilas´
;;; Ani͡a i togda, kogda uslykhala, chto Krolik bormochet sebe pod nos: "Bozhe
;;; moĭ, Bozhe moĭ, i͡a naverni͡aka opozdai͡u".
;;; 
(defun translit-to-lcon-ru (beginning end)
  "transliterate region from cyrillic to latin using Library of Congress Russian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?Ё "Ë")
	       (cons ?І "Ī")
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "G")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Zh")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?Й "Ĭ")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "U")
	       (cons ?Ф "F")
	       (cons ?Х "Kh")
	       (cons ?Ц "T͡S")
	       (cons ?Ч "Ch")
	       (cons ?Ш "Sh")
	       (cons ?Щ "Shch")
	       (cons ?Ъ "´´")
	       (cons ?Ы "Y")
	       (cons ?Ь "´")
	       (cons ?Э "Ė")
	       (cons ?Ю "I͡U")
	       (cons ?Я "I͡A")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "g")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "zh")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?й "ĭ")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "u")
	       (cons ?ф "f")
	       (cons ?х "kh")
	       (cons ?ц "t͡s")
	       (cons ?ч "ch")
	       (cons ?ш "sh")
	       (cons ?щ "shch")
	       (cons ?ъ "´´")
	       (cons ?ы "y")
	       (cons ?ь "´")
	       (cons ?э "ė")
	       (cons ?ю "i͡u")
	       (cons ?я "i͡a")
	       (cons ?ё "ë")
	       (cons ?і "ī")
	       (cons ?Ѣ "I͡E")
	       (cons ?ѣ "i͡e")
	       (cons ?Ѳ "Ḟ")
	       (cons ?ѳ "ḟ")
	       (cons ?Ѵ "Ẏ")
	       (cons ?ѵ "ẏ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-from-lcon-ru (beginning end)
  "retransliterate region from latin to cyrillic using Library of Congress Russian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Г")
	       (cons ?I "И")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "У")
	       (cons ?V "В")
	       (cons ?Y "Ы")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "г")
	       (cons ?i "и")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "у")
	       (cons ?v "в")
	       (cons ?y "ы")
	       (cons ?z "з")
	       (cons ?´ "ь")
	       (cons ?Ë "Ё")
	       (cons ?ë "ё")
	       (cons ?Ė "Э")
	       (cons ?ė "э")
	       (cons ?Ī "І")
	       (cons ?ī "і")
	       (cons ?Ĭ "Й")
	       (cons ?ĭ "й")
	       (cons ?Ḟ "Ѳ")
	       (cons ?ḟ "ѳ")
	       (cons ?Ẏ "Ѵ")
	       (cons ?ẏ "ѵ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "Shch" end t)
	(replace-match "Щ")
	(setq e (- e 3))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "shch" end t)
	(replace-match "щ")
	(setq e (- e 3))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡A" end t)
	(replace-match "Я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡E" end t)
	(replace-match "Ѣ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡U" end t)
	(replace-match "Ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "T͡S" end t)
	(replace-match "Ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡a" end t)
	(replace-match "я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡e" end t)
	(replace-match "ѣ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡u" end t)
	(replace-match "ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "t͡s" end t)
	(replace-match "ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ch" end t)
	(replace-match "Ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Kh" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Sh" end t)
	(replace-match "Ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Zh" end t)
	(replace-match "Ж")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ch" end t)
	(replace-match "ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "kh" end t)
	(replace-match "х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "sh" end t)
	(replace-match "ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "zh" end t)
	(replace-match "ж")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "´´" end t)
	(replace-match "ъ")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

;;; Mladići iz Raške  Takav je Macko
;;; Nema sumnje da je Macko bio najjači i najopasniji dasa Raške. A u Raškoj se najopasniji i najjači dasa teško postaje.
;;; Raška svake godine ispljune na asfalt desetine odvažnih mladića koji pesnicama i snagom kreću u osvajanje sveta.
;;; Macko je na glas izbio po dolasku iz fiskulturne škole, koju, izgleda, nikad nije završio.
;;; Sa školovanja je, osim visokog, mišićavog tela, doneo i ožiljak - trag oštrog noža, verovatno.
;;; Pomislićete da je Macko bio snažan, da je bio bukva, buldožer, kuća, planina. Ne, zaista ne!
;;; Bio je - nema šta ! - visok, ali suv, sve sama žila, u struku tanji od devojke. 
;;; 
;;; Младићи из Рашке  Такав је Мацко
;;; Нема сумње да је Мацко био најјачи и најопаснији даса Рашке. А у Рашкој се најопаснији и најјачи даса тешко постаје.
;;; Рашка сваке године испљуне на асфалт десетине одважних младића који песницама и снагом крећу у освајање света.
;;; Мацко је на глас избио по доласку из фискултурне школе, коју, изгледа, никад није завршио.
;;; Са школовања је, осим високог, мишићавог тела, донео и ожиљак - траг оштрог ножа, вероватно.
;;; Помислићете да је Мацко био снажан, да је био буква, булдожер, кућа, планина. Не, заиста не!
;;; Био је - нема шта ! - висок, али сув, све сама жила, у струку тањи од девојке. 
;;;
(defun translit-to-lcon-sr (beginning end)
  "transliterate region from cyrillic to latin using Library of Congress Serbian and Macedonian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?Ђ "Đ")
	       (cons ?Ѓ "ǵ")
	       (cons ?Ѕ "Dz")
	       (cons ?Љ "Lj")
	       (cons ?Њ "Nj")
	       (cons ?Ћ "Ć")
	       (cons ?Ќ "Ḱ")
	       (cons ?Џ "Dž")
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "G")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Ž")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "U")
	       (cons ?Ф "F")
	       (cons ?Х "H")
	       (cons ?Ц "C")
	       (cons ?Ч "Č")
	       (cons ?Ш "Š")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "g")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "ž")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "u")
	       (cons ?ф "f")
	       (cons ?х "h")
	       (cons ?ц "c")
	       (cons ?ч "č")
	       (cons ?ш "š")
	       (cons ?ђ "đ")
	       (cons ?ѓ "ǵ")
	       (cons ?ѕ "dz")
	       (cons ?ј "j")
	       (cons ?љ "lj")
	       (cons ?њ "nj")
	       (cons ?ћ "ć")
	       (cons ?ќ "ḱ")
	       (cons ?џ "dž")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))
(defun translit-from-lcon-sr (beginning end)
  "retransliterate region from latin to cyrillic using Library of Congress Serbian and Macedonian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?C "Ц")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Г")
	       (cons ?H "Х")
	       (cons ?I "И")
	       (cons ?J "Ј")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "У")
	       (cons ?V "В")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?c "ц")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "г")
	       (cons ?h "х")
	       (cons ?i "и")
	       (cons ?j "ј")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "у")
	       (cons ?v "в")
	       (cons ?z "з")
	       (cons ?Ć "Ћ")
	       (cons ?ć "ћ")
	       (cons ?Č "Ч")
	       (cons ?č "ч")
	       (cons ?Đ "Ђ")
	       (cons ?đ "ђ")
	       (cons ?Š "Ш")
	       (cons ?š "ш")
	       (cons ?Ž "Ж")
	       (cons ?ž "ж")
	       (cons ?ǵ "Ѓ")
	       (cons ?Ḱ "Ќ")
	       (cons ?ḱ "ќ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "DZ" end t)
	(replace-match "Ѕ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "DŽ" end t)
	(replace-match "Џ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "LJ" end t)
	(replace-match "Љ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "NJ" end t)
	(replace-match "Њ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "dz" end t)
	(replace-match "ѕ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "dž" end t)
	(replace-match "џ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "lj" end t)
	(replace-match "љ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "nj" end t)
	(replace-match "њ")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-to-lcon-ua (beginning end)
  "transliterate region from cyrillic to latin using Library of Congress Ukrainian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?Є "I͡E")
	       (cons ?І "Ī")
	       (cons ?Ї "Ï")
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "H")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Z͡H")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?Й "Ĭ")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "U")
	       (cons ?Ф "F")
	       (cons ?Х "KH")
	       (cons ?Ц "T͡S")
	       (cons ?Ч "CH")
	       (cons ?Ш "SH")
	       (cons ?Щ "SHCH")
	       (cons ?Ь "´")
	       (cons ?Ю "I͡U")
	       (cons ?Я "I͡A")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "h")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "z͡h")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?й "ĭ")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "u")
	       (cons ?ф "f")
	       (cons ?х "kh")
	       (cons ?ц "t͡s")
	       (cons ?ч "ch")
	       (cons ?ш "sh")
	       (cons ?щ "shch")
	       (cons ?ь "´")
	       (cons ?ю "i͡u")
	       (cons ?я "i͡a")
	       (cons ?є "i͡e")
	       (cons ?і "ī")
	       (cons ?ї "ï")
	       (cons ?Ґ "G")
	       (cons ?ґ "g")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))
(defun translit-from-lcon-ua (beginning end)
  "retransliterate region from latin to cyrillic using Library of Congress Ukrainian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Ґ")
	       (cons ?H "Г")
	       (cons ?I "И")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "У")
	       (cons ?V "В")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "ґ")
	       (cons ?h "г")
	       (cons ?i "и")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "у")
	       (cons ?v "в")
	       (cons ?z "з")
	       (cons ?´ "Ь")
	       (cons ?Ï "Ї")
	       (cons ?ï "ї")
	       (cons ?Ī "І")
	       (cons ?ī "і")
	       (cons ?Ĭ "Й")
	       (cons ?ĭ "й")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "SHCH" end t)
	(replace-match "Щ")
	(setq e (- e 3))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "shch" end t)
	(replace-match "щ")
	(setq e (- e 3))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡A" end t)
	(replace-match "Я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡E" end t)
	(replace-match "Є")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡U" end t)
	(replace-match "Ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "T͡S" end t)
	(replace-match "Ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Z͡H" end t)
	(replace-match "Ж")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡a" end t)
	(replace-match "я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡e" end t)
	(replace-match "є")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡u" end t)
	(replace-match "ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "t͡s" end t)
	(replace-match "ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "z͡h" end t)
	(replace-match "ж")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "CH" end t)
	(replace-match "Ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "KH" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "SH" end t)
	(replace-match "Ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ch" end t)
	(replace-match "ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "kh" end t)
	(replace-match "х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "sh" end t)
	(replace-match "ш")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-to-lcon-be (beginning end)
  "transliterate region from cyrillic to latin using Library of Congress Belorussian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?Є "I͡E")
	       (cons ?І "Ī")
	       (cons ?Ї "Ï")
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "H")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Z͡H")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?Й "Ĭ")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "U")
	       (cons ?Ф "F")
	       (cons ?Х "KH")
	       (cons ?Ц "T͡S")
	       (cons ?Ч "CH")
	       (cons ?Ш "SH")
	       (cons ?Щ "SHCH")
	       (cons ?Ь "´")
	       (cons ?Ю "I͡U")
	       (cons ?Я "I͡A")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "h")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "z͡h")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?й "ĭ")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "u")
	       (cons ?ф "f")
	       (cons ?х "kh")
	       (cons ?ц "t͡s")
	       (cons ?ч "ch")
	       (cons ?ш "sh")
	       (cons ?щ "shch")
	       (cons ?ь "´")
	       (cons ?ю "i͡u")
	       (cons ?я "i͡a")
	       (cons ?є "i͡e")
	       (cons ?і "ī")
	       (cons ?ї "ï")
	       (cons ?Ґ "G")
	       (cons ?ґ "g")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))
(defun translit-from-lcon-be (beginning end)
  "retransliterate region from latin to cyrillic using Library of Congress Belorussian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Ґ")
	       (cons ?H "Г")
	       (cons ?I "И")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "У")
	       (cons ?V "В")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "ґ")
	       (cons ?h "г")
	       (cons ?i "и")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "у")
	       (cons ?v "в")
	       (cons ?z "з")
	       (cons ?´ "Ь")
	       (cons ?Ï "Ї")
	       (cons ?ï "ї")
	       (cons ?Ī "І")
	       (cons ?ī "і")
	       (cons ?Ĭ "Й")
	       (cons ?ĭ "й")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "SHCH" end t)
	(replace-match "Щ")
	(setq e (- e 3))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "shch" end t)
	(replace-match "щ")
	(setq e (- e 3))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡A" end t)
	(replace-match "Я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡E" end t)
	(replace-match "Є")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡U" end t)
	(replace-match "Ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "T͡S" end t)
	(replace-match "Ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Z͡H" end t)
	(replace-match "Ж")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡a" end t)
	(replace-match "я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡e" end t)
	(replace-match "є")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡u" end t)
	(replace-match "ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "t͡s" end t)
	(replace-match "ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "z͡h" end t)
	(replace-match "ж")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "CH" end t)
	(replace-match "Ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "KH" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "SH" end t)
	(replace-match "Ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ch" end t)
	(replace-match "ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "kh" end t)
	(replace-match "х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "sh" end t)
	(replace-match "ш")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

;;; БАЩАТА - Гаврил, е син на поп Рашко от Еникьой, тръгнал по
;;; време на Освободителната война с руските войски. Като
;;; първороден син, след завършване на гимназията е трябвало да
;;; стане свещеник, но желанието му да получи висше образование
;;; е по-силно от семейната традиция. Търговец, приятел на поп
;;; Рашко, дава на заем на Гаврил осем златни наполеона, с
;;; четири от които той си взима паспорт от общината и заминава
;;; да учи в Полша. За своето решение уведомява баща си с писмо,
;;; на което поп Рашко отговаря, че няма да се противопоставя на
;;; учението на сина си, а даже ще му помага. Така Гаврил Зайков
;;; завършва висшето си образование, завръща се в родината и
;;; става първият български инженер-лесовъд.
;;;
;;; BASHTATA - Gavril, e sin na pop Rashko ot Enikoĭ, trŭgnal po
;;; vreme na Osvoboditelnata voĭna s ruskite voĭski. Kato
;;; pŭrvoroden sin, sled zavŭrshvane na gimnazii͡ata e tri͡abvalo da
;;; stane sveshtenik, no z͡helanieto mu da poluchi visshe obrazovanie
;;; e po-silno ot semeĭnata tradit͡sii͡a. Tŭrgovet͡s, prii͡atel na pop
;;; Rashko, dava na zaem na Gavril osem zlatni napoleona, s
;;; chetiri ot koito toĭ si vzima pasport ot obshtinata i zaminava
;;; da uchi v Polsha. Za svoeto reshenie uvedomi͡ava bashta si s pismo,
;;; na koeto pop Rashko otgovari͡a, che ni͡ama da se protivopostavi͡a na
;;; uchenieto na sina si, a daz͡he shte mu pomaga. Taka Gavril Zaĭkov
;;; zavŭrshva vissheto si obrazovanie, zavrŭshta se v rodinata i
;;; stava pŭrvii͡at bŭlgarski inz͡hener-lesovŭd.
;;;
(defun translit-to-lcon-bg (beginning end)
  "transliterate region from cyrillic to latin using Library of Congress Bulgarian"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "G")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Z͡H")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?Й "Ĭ")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "U")
	       (cons ?Ф "F")
	       (cons ?Х "KH")
	       (cons ?Ц "T͡S")
	       (cons ?Ч "CH")
	       (cons ?Ш "SH")
	       (cons ?Щ "SHT")
	       (cons ?Ъ "Ŭ")
	       (cons ?Ь "")
	       (cons ?Ю "I͡U")
	       (cons ?Я "I͡A")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "g")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "z͡h")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?й "ĭ")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "u")
	       (cons ?ф "f")
	       (cons ?х "kh")
	       (cons ?ц "t͡s")
	       (cons ?ч "ch")
	       (cons ?ш "sh")
	       (cons ?щ "sht")
	       (cons ?ъ "ŭ")
	       (cons ?ь "")
	       (cons ?ю "i͡u")
	       (cons ?я "i͡a")
	       (cons ?Ѣ "I͡E")
	       (cons ?ѣ "i͡e")
	       (cons ?Ѫ "U̐")
	       (cons ?ѫ "u̐")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-from-lcon-bg (beginning end)
  "retransliterate region from latin to cyrillic using Library of Bulgarian Congress"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Г")
	       (cons ?I "И")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "У")
	       (cons ?V "В")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "г")
	       (cons ?i "и")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "у")
	       (cons ?v "в")
	       (cons ?z "з")
	       (cons ?Ĭ "Й")
	       (cons ?ĭ "й")
	       (cons ?Ŭ "Ъ")
	       (cons ?ŭ "ъ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "I͡A" end t)
	(replace-match "Я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡E" end t)
	(replace-match "Ѣ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡U" end t)
	(replace-match "Ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "SHT" end t)
	(replace-match "Щ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "T͡S" end t)
	(replace-match "Ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Z͡H" end t)
	(replace-match "Ж")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡a" end t)
	(replace-match "я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡e" end t)
	(replace-match "ѣ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡u" end t)
	(replace-match "ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "sht" end t)
	(replace-match "щ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "t͡s" end t)
	(replace-match "ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "z͡h" end t)
	(replace-match "ж")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "CH" end t)
	(replace-match "Ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "KH" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "SH" end t)
	(replace-match "Ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "U̐" end t)
	(replace-match "Ѫ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ch" end t)
	(replace-match "ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "kh" end t)
	(replace-match "х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "sh" end t)
	(replace-match "ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "u̐" end t)
	(replace-match "ѫ")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-to-lcon-ocs (beginning end)
  "transliterate region from cyrillic to latin using Library of Congress Old Church Slavonic"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?Є "Ē")
	       (cons ?Ѕ "Ż")
	       (cons ?Ћ "Ǵ")
	       (cons ?А "A")
	       (cons ?Б "B")
	       (cons ?В "V")
	       (cons ?Г "G")
	       (cons ?Д "D")
	       (cons ?Е "E")
	       (cons ?Ж "Zh")
	       (cons ?З "Z")
	       (cons ?И "I")
	       (cons ?Й "Ĭ")
	       (cons ?К "K")
	       (cons ?Л "L")
	       (cons ?М "M")
	       (cons ?Н "N")
	       (cons ?О "O")
	       (cons ?П "P")
	       (cons ?Р "R")
	       (cons ?С "S")
	       (cons ?Т "T")
	       (cons ?У "Ū")
	       (cons ?Ф "F")
	       (cons ?Х "Kh")
	       (cons ?Ц "T͡S")
	       (cons ?Ч "Ch")
	       (cons ?Ш "Sh")
	       (cons ?Щ "Sht")
	       (cons ?Ъ "´´")
	       (cons ?Ы "Y")
	       (cons ?Ь "´")
	       (cons ?Ю "I͡U")
	       (cons ?Я "I͡A")
	       (cons ?а "a")
	       (cons ?б "b")
	       (cons ?в "v")
	       (cons ?г "g")
	       (cons ?д "d")
	       (cons ?е "e")
	       (cons ?ж "zh")
	       (cons ?з "z")
	       (cons ?и "i")
	       (cons ?й "ĭ")
	       (cons ?к "k")
	       (cons ?л "l")
	       (cons ?м "m")
	       (cons ?н "n")
	       (cons ?о "o")
	       (cons ?п "p")
	       (cons ?р "r")
	       (cons ?с "s")
	       (cons ?т "t")
	       (cons ?у "ū")
	       (cons ?ф "f")
	       (cons ?х "kh")
	       (cons ?ц "t͡s")
	       (cons ?ч "ch")
	       (cons ?ш "sh")
	       (cons ?щ "sht")
	       (cons ?ъ "´´")
	       (cons ?ы "y")
	       (cons ?ь "´")
	       (cons ?ю "i͡u")
	       (cons ?я "i͡a")
	       (cons ?є "ē")
	       (cons ?ѕ "ż")
	       (cons ?ћ "ǵ")
	       (cons ?Ѡ "Ō")
	       (cons ?ѡ "ō")
	       (cons ?Ѣ "Ě")
	       (cons ?ѣ "ě")
	       (cons ?Ѥ "I͡E")
	       (cons ?ѥ "i͡e")
	       (cons ?Ѧ "Ȩ")
	       (cons ?ѧ "ȩ")
	       (cons ?Ѩ "I͡Ȩ")
	       (cons ?ѩ "i͡ȩ")
	       (cons ?Ѫ "Ǫ")
	       (cons ?ѫ "ǫ")
	       (cons ?Ѭ "I͡Ǫ")
	       (cons ?ѭ "i͡ǫ")
	       (cons ?Ѯ "K͡S")
	       (cons ?ѯ "k͡s")
	       (cons ?Ѱ "P͡S")
	       (cons ?ѱ "p͡s")
	       (cons ?Ѳ "Ḟ")
	       (cons ?ѳ "ḟ")
	       (cons ?Ѵ "V̇")
	       (cons ?ѵ "v̇")
	       (cons ?Ѷ "Ẏ")
	       (cons ?ѷ "ẏ")
	       (cons ?Ѹ "U")
	       (cons ?ѹ "u")
	       (cons ?Ѿ "Ō͡T")
	       (cons ?ѿ "ō͡t")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

(defun translit-from-lcon-ocs (beginning end)
  "retransliterate region from latin to cyrillic using Library of Congress Old Church Slavonic"
   (interactive "r")
   (message "Transliterating region ... ")
   (save-excursion
     (let ((e end)
	   (count 0)
	   (old-value-of-case-fold-search case-fold-search) ;; save buffer-global var
	     (translit-table
	      (list
	       (cons ?A "А")
	       (cons ?B "Б")
	       (cons ?D "Д")
	       (cons ?E "Е")
	       (cons ?F "Ф")
	       (cons ?G "Г")
	       (cons ?I "И")
	       (cons ?K "К")
	       (cons ?L "Л")
	       (cons ?M "М")
	       (cons ?N "Н")
	       (cons ?O "О")
	       (cons ?P "П")
	       (cons ?R "Р")
	       (cons ?S "С")
	       (cons ?T "Т")
	       (cons ?U "Ѹ")
	       (cons ?V "В")
	       (cons ?Y "Ы")
	       (cons ?Z "З")
	       (cons ?a "а")
	       (cons ?b "б")
	       (cons ?d "д")
	       (cons ?e "е")
	       (cons ?f "ф")
	       (cons ?g "г")
	       (cons ?i "и")
	       (cons ?k "к")
	       (cons ?l "л")
	       (cons ?m "м")
	       (cons ?n "н")
	       (cons ?o "о")
	       (cons ?p "п")
	       (cons ?r "р")
	       (cons ?s "с")
	       (cons ?t "т")
	       (cons ?u "ѹ")
	       (cons ?v "в")
	       (cons ?y "ы")
	       (cons ?z "з")
	       (cons ?´ "Ь")
	       (cons ?Ē "Є")
	       (cons ?ē "є")
	       (cons ?Ě "Ѣ")
	       (cons ?ě "ѣ")
	       (cons ?Ĭ "Й")
	       (cons ?ĭ "й")
	       (cons ?Ō "Ѡ")
	       (cons ?ō "ѡ")
	       (cons ?Ū "У")
	       (cons ?ū "у")
	       (cons ?Ż "Ѕ")
	       (cons ?ż "ѕ")
	       (cons ?Ǫ "Ѫ")
	       (cons ?ǫ "ѫ")
	       (cons ?Ǵ "Ћ")
	       (cons ?ǵ "ћ")
	       (cons ?Ȩ "Ѧ")
	       (cons ?ȩ "ѧ")
	       (cons ?Ḟ "Ѳ")
	       (cons ?ḟ "ѳ")
	       (cons ?Ẏ "Ѷ")
	       (cons ?ẏ "ѷ")
	       )))
       (setq case-fold-search nil) ;; case-sensitive search for transliterating
      (goto-char beginning)
      (while (search-forward "I͡A" end t)
	(replace-match "Я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡E" end t)
	(replace-match "Ѥ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡U" end t)
	(replace-match "Ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡Ǫ" end t)
	(replace-match "Ѭ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "I͡Ȩ" end t)
	(replace-match "Ѩ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "K͡S" end t)
	(replace-match "Ѯ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "P͡S" end t)
	(replace-match "Ѱ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Sht" end t)
	(replace-match "Щ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "T͡S" end t)
	(replace-match "Ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡a" end t)
	(replace-match "я")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡e" end t)
	(replace-match "ѥ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡u" end t)
	(replace-match "ю")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡ǫ" end t)
	(replace-match "ѭ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "i͡ȩ" end t)
	(replace-match "ѩ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "k͡s" end t)
	(replace-match "ѯ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "p͡s" end t)
	(replace-match "ѱ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "sht" end t)
	(replace-match "щ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "t͡s" end t)
	(replace-match "ц")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ō͡T" end t)
	(replace-match "Ѿ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ō͡t" end t)
	(replace-match "ѿ")
	(setq e (- e 2))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Ch" end t)
	(replace-match "Ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Kh" end t)
	(replace-match "Х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Sh" end t)
	(replace-match "Ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "V̇" end t)
	(replace-match "Ѵ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "Zh" end t)
	(replace-match "Ж")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "ch" end t)
	(replace-match "ч")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "kh" end t)
	(replace-match "х")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "sh" end t)
	(replace-match "ш")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "v̇" end t)
	(replace-match "ѵ")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "zh" end t)
	(replace-match "ж")
	(setq e (- e 1))
	(setq count (1+ count)))
      (goto-char beginning)
      (while (search-forward "´´" end t)
	(replace-match "Ъ")
	(setq e (- e 1))
	(setq count (1+ count)))
       (goto-char beginning)
       (while (< (point) e)
	 (setq
             tr (assq (char-after (point)) translit-table))
           (if (null tr)
               (forward-char 1)
             (delete-char 1)
             (insert (cdr tr))
             (setq count (1+ count))
             (setq e (+ e (1- (length (cdr tr)))))))
       (cond ((zerop count)
	      (message "Nothing to transliterate!"))
	     ((= 1 count)
	      (message "1 character transliterated."))
	     (t
	      (message "%d characters transliterated." count)))
       (goto-char end)
       (setq case-fold-search old-value-of-case-fold-search))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Copyright (C) 2004 Sebastian Nagel <wastl((at))cis.uni-muenchen.de>        ;;
;; License: GPL                                                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


