From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Aidan Kehoe Newsgroups: gmane.emacs.bugs,gmane.emacs.pretest.bugs Subject: bug#1750: [PATCH] Support standard ASCII-IPA mappings in leim/quail/ipa.el. Date: Mon, 19 Jan 2009 07:11:39 +0000 Message-ID: <18804.10155.343841.133931@parhasard.net> References: <18779.30356.834146.410474@parhasard.net> <18779.52574.593394.579421@parhasard.net> Reply-To: Aidan Kehoe , 1750@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="V0wqEiOxMR" X-Trace: ger.gmane.org 1232349836 13862 80.91.229.12 (19 Jan 2009 07:23:56 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 19 Jan 2009 07:23:56 +0000 (UTC) To: Stefan Monnier , 1750@emacsbugs.donarmstrong.com, emacs-pretest-bug@gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Jan 19 08:25:07 2009 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1LOoVG-0006t4-2j for geb-bug-gnu-emacs@m.gmane.org; Mon, 19 Jan 2009 08:25:06 +0100 Original-Received: from localhost ([127.0.0.1]:43568 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LOoTy-0005gv-6e for geb-bug-gnu-emacs@m.gmane.org; Mon, 19 Jan 2009 02:23:38 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LOoTt-0005gg-2c for bug-gnu-emacs@gnu.org; Mon, 19 Jan 2009 02:23:33 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LOoTr-0005gJ-Vv for bug-gnu-emacs@gnu.org; Mon, 19 Jan 2009 02:23:32 -0500 Original-Received: from [199.232.76.173] (port=33029 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LOoTr-0005gA-8P for bug-gnu-emacs@gnu.org; Mon, 19 Jan 2009 02:23:31 -0500 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:45775) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LOoTq-0006Mx-0e for bug-gnu-emacs@gnu.org; Mon, 19 Jan 2009 02:23:31 -0500 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id n0J7NRq4007724; Sun, 18 Jan 2009 23:23:27 -0800 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.13.8/8.13.8/Submit) id n0J7K5V1006735; Sun, 18 Jan 2009 23:20:05 -0800 X-Loop: owner@emacsbugs.donarmstrong.com Resent-From: Aidan Kehoe Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs Resent-Date: Mon, 19 Jan 2009 07:20:04 +0000 Resent-Message-ID: Resent-Sender: owner@emacsbugs.donarmstrong.com X-Emacs-PR-Message: followup 1750 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: Original-Received: via spool by 1750-submit@emacsbugs.donarmstrong.com id=B1750.12323491015366 (code B ref 1750); Mon, 19 Jan 2009 07:20:04 +0000 Original-Received: (at 1750) by emacsbugs.donarmstrong.com; 19 Jan 2009 07:11:41 +0000 X-Spam-Bayes: score:0.5 Bayes not run. spammytokens:Tokens not available. hammytokens:Tokens not available. Original-Received: from daedalus.asclepian.ie (daedalus.ipv4.asclepian.ie [213.133.100.226]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id n0J7BSKv005352 for <1750@emacsbugs.donarmstrong.com>; Sun, 18 Jan 2009 23:11:31 -0800 Original-Received: by daedalus.asclepian.ie (Postfix, from userid 1002) id 10922B82D; Mon, 19 Jan 2009 07:11:40 +0000 (GMT) In-Reply-To: <18779.52574.593394.579421@parhasard.net> X-Mailer: VM 8.0.12 under 21.5 (beta28) "fuki" XEmacs Lucid (x86_64-unknown-freebsd7.1) X-Echelon-distraction: FALN DSNET3 Ft. Meade NAIAG DSNET2 Sayeret Tzanhanim X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) Resent-Date: Mon, 19 Jan 2009 02:23:32 -0500 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:24270 gmane.emacs.pretest.bugs:23716 Archived-At: --V0wqEiOxMR Content-Type: text/plain; charset=utf-8 Content-Description: message body and .signature Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by rzlab.ucr.edu id n0J7NRq4007724 Ar an t-aon=C3=BA l=C3=A1 is triochad de m=C3=AD na Nollaig, scr=C3=ADob= h Aidan Kehoe:=20 > [...] I=E2=80=99m not sure if you=E2=80=99re waiting for an updated patch from = me, or what. Here=E2=80=99s one, anyway, against the current file with the 2009 copyright year, and w= ith better handling of the precomposed Mule IPA nasals. I=E2=80=99ve also att= ached a compressed version of the new file, in case anyone=E2=80=99s mail client = does Bad Things with the encoding. James, see the entries below corresponding to /3~ for how to tell quail t= o insert a series of characters.=20 --- ipa.el.GNU-Emacs 2009-01-19 07:01:35.000000000 +0000 +++ ipa.el.new 2009-01-19 07:04:18.000000000 +0000 @@ -1,4 +1,4 @@ -;;; ipa.el --- Quail package for inputting IPA characters -*-coding: is= o-2022-7bit;-*- +;;; ipa.el --- Quail package for inputting IPA characters. -*- coding: u= tf-8 -*-=20 =20 ;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, ;; 2006, 2007, 2008, 2009 @@ -21,12 +21,16 @@ =20 ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see . +;; Copyright (C) 1997 Electrotechnical Laboratory, JAPAN. +;; Copyright (C) 2006 Free Software Foundation, Inc. +;; Licensed to the Free Software Foundation. =20 ;;; Commentary: =20 ;;; Code: =20 (require 'quail) +(eval-when-compile (require 'cl)) =20 (quail-define-package "ipa" "IPA" "IPA" t @@ -36,77 +40,477 @@ nil t nil nil nil nil nil nil nil nil t) =20 (quail-define-rules - ("i" ?=1B,0 =1B(B) - ("I" ?=1B,0!=1B(B) - ("e" ?=1B,0"=1B(B) - ("/3" ?=1B,0#=1B(B) - ("E" ?=1B,0#=1B(B) - ("ae" ?=1B,0$=1B(B) - ("a" ?=1B,0%=1B(B) - ("i-" ?=1B,0&=1B(B) - ("/e" ?=1B,0'=1B(B) - ("/a" ?=1B,0(=1B(B) - ("/m" ?=1B,0)=1B(B) - ("&" ?=1B,0*=1B(B) - ("/v" ?=1B,0+=1B(B) - ("A" ?=1B,0,=1B(B) - ("o|" ?=1B,0,=1B(B) - ("y" ?=1B,0-=1B(B) - ("Y" ?=1B,0.=1B(B) - ("o/" ?=1B,0/=1B(B) - ("oe" ?=1B,00=1B(B) - ("OE" ?=1B,01=1B(B) - ("u-" ?=1B,02=1B(B) - ("o-" ?=1B,03=1B(B) - ("u" ?=1B,04=1B(B) - ("U" ?=1B,05=1B(B) - ("o" ?=1B,06=1B(B) - ("/c" ?=1B,07=1B(B) - ("/A" ?=1B,08=1B(B) - ("|o" ?=1B,08=1B(B) - ("e-" ?=1B,0:=1B(B) - ("e|" ?=1B,0:=1B(B) - ("/3~" ?=1B,0;=1B(B) - ("E~" ?=1B,0;=1B(B) - ("A~" ?=1B,0<=1B(B) - ("oe~" ?=1B,0=3D=1B(B) - ("/c~" ?=1B,0>=1B(B) - ("p" ?=1B,0@=1B(B) - ("b" ?=1B,0A=1B(B) - ("t" ?=1B,0B=1B(B) - ("d" ?=1B,0C=1B(B) - ("k" ?=1B,0D=1B(B) - ("g" ?=1B,0E=1B(B) - ("f" ?=1B,0F=1B(B) - ("v" ?=1B,0G=1B(B) - ("th" ?=1B,0H=1B(B) - ("dh" ?=1B,0I=1B(B) - ("s" ?=1B,0J=1B(B) - ("z" ?=1B,0K=1B(B) - ("sh" ?=1B,0L=1B(B) - ("zh" ?=1B,0M=1B(B) - ("3" ?=1B,0M=1B(B) - ("c," ?=1B,0N=1B(B) - ("x" ?=1B,0O=1B(B) - ("/R" ?=1B,0P=1B(B) - ("h" ?=1B,0Q=1B(B) - ("m" ?=1B,0R=1B(B) - ("n" ?=1B,0S=1B(B) - ("gn" ?=1B,0T=1B(B) - ("ng" ?=1B,0U=1B(B) - ("r" ?=1B,0V=1B(B) - ("R" ?=1B,0W=1B(B) - ("/r" ?=1B,0X=1B(B) - ("j" ?=1B,0Y=1B(B) - ("l" ?=1B,0Z=1B(B) - ("/y" ?=1B,0[=1B(B) - ("L" ?=1B,0\=1B(B) - ("/h" ?=1B,0]=1B(B) - ("w" ?=1B,0^=1B(B) - ("M" ?=1B,0_=1B(B) - ("'" ?=1B,0p=1B(B) - ("`" ?=1B,0q=1B(B) - (":" ?=1B,0r=1B(B)) + ("i" ?i) + ("I" ?=C9=AA) + ("e" ?e) + ("/3" ?=C9=9B) + ("E" ?=C9=9B) + ("ae" ?=C3=A6) + ("a" ?a) + ("i-" ?=C9=A8) + ("/e" ?=C9=99) + ("/a" ?=C9=90) + ("/m" ?=C9=AF) + ("&" ?=C9=A4) + ("/v" ?=CA=8C) + ("A" ?=C9=91) + ("o|" ?=C9=91) + ("y" ?y) + ("Y" ?=CA=8F) + ("o/" ?=C3=B8) + ("oe" ?=C5=93) + ("OE" ?=C9=B6) + ("u-" ?=CA=89) + ("o-" ?=C9=B5) + ("u" ?u) + ("U" ?=CA=8A) + ("o" ?o) + ("/c" ?=C9=94) + ("/A" ?=C9=92) + ("|o" ?=C9=92) + ("e-" ?=C9=9A) + ("e|" ?=C9=9A) + ("/3~" ["=C9=9B=CC=83"]) + ("E~" ["=C9=9B=CC=83"]) + ("A~" ["=C9=91=CC=83"]) + ("oe~" ["=C5=93=CC=83"]) + ("/c~" ["=C9=94=CC=83"]) + ("p" ?p) + ("b" ?b) + ("t" ?t) + ("d" ?d) + ("k" ?k) + ("g" ?g) + ("f" ?f) + ("v" ?v) + ("th" ?=CE=B8) + ("dh" ?=C3=B0) + ("s" ?s) + ("z" ?z) + ("sh" ?=CA=83) + ("zh" ?=CA=92) + ("3" ?=CA=92) + ("c," ?=C3=A7) + ("x" ?x) + ("/R" ?=CA=81) + ("h" ?h) + ("m" ?m) + ("n" ?n) + ("gn" ?=C9=B2) + ("ng" ?=C5=8B) + ("r" ?r) + ("R" ?=CA=80) + ("/r" ?=C9=B9) + ("j" ?j) + ("l" ?l) + ("/y" ?=CA=8E) + ("L" ?=CA=9F) + ("/h" ?=C9=A5) + ("w" ?w) + ("M" ?=CA=8D) + ("'" ?=CB=88) + ("`" ?=CB=8C) + (":" ?=CB=90)) =20 -;; arch-tag: cf2614cc-ecce-4ef5-ba51-37faeed41691 -;;; ipa.el ends here +(quail-define-package + "kirshenbaum-ipa" "IPA" "IPA-K" t + "The International Phonetic Alphabet, using Kirshenbaum ASCII translit.= =20 + +Kirshenbaum IPA is an ASCII transliteration of the phonetic alphabet, co= mmon +in the Usenet groups `sci.lang' and `alt.usage.english'. This input met= hod +allows you to type Kirshenbaum on your ASCII-capable keyboard, producing= the +corresponding actual IPA characters in your editor. + +See http://www.kirshenbaum.net/IPA/ascii-ipa.pdf for full details of the +transliteration. + +A caveat with regard to that document; while XEmacs currently preserves +Unicode diacritics on reading and emitting them, it displays them, +incorrectly, as separate from the modified glyphs. ") + +(quail-define-rules + ("r" "=C9=B9") ;; Alveolar approximant U+0279 + ("A" "=C9=91") ;; Low back unrounded vowel U+0251 + ("B" "=CE=B2") ; + ; Voiced bilabial fricative U+03B2 + ("C" "=C3=A7") ;; Voiced palatal fricative U+00E7 + ("D" "=C3=B0") ;; Voiced dental fricative U+00F0 + ("E" "=C9=9B") ;; Lower-mid front unrounded vowel U+025B + ("G" "=C9=A2") ;; Voiced uvular stop U+0262 + ("H" "=C4=A7") ;; Voiced pharyngeal fricative U+0127 + ("I" "=C9=AA") ;; Semi-high front unrounded vowel U+026A + ("J" "=C9=9F") ;; Voiced palatal stop U+025F + ("L" ["=C9=AB" ;; Voiced velar lateral U+026B + "=CA=9F" ;; Voiced velar lateral U+029F + "=C9=AC"]) ;; Voiced alveolar lateral fricative U+026C + ("M" "=C9=B1") ;; Labio-dental nasal U+0271 + ("N" "=C5=8B") ;; Velar nasal U+014B + ("O" "=C9=94") ;; Low-mid back rounded vowel U+0254 + ("P" "=C9=B8") ;; Voiceless bilabial fricative U+0278 + ("Q" "=C9=A3") ;; Voiced velar fricative U+0263 + ("R" ["=CA=80" ;; Alveolar trill U+0280 + "=C9=9A"]) ;; Rhotacised schwa U+025A + ("@" "=C9=9A") ;; Mid central rhotacised vowel U+025A + ("S" "=CA=83") ;; Voiced postalveolar fricative U+0283 + ("T" "=CE=B8") ;; Voiced dental fricative U+03B8 + ("U" "=CA=8A") ;; Semi-high back rounded vowel U+028A + ("V" "=CA=8C") ;; Low-mid back unrounded vowel U+028C + ("W" "=C5=93") ;; Low-mid front rounded vowel U+0153 + ("X" "=CF=87") ;; Voiceless uvular fricative U+03C7 + ("Y" "=C3=B8") ;; Upper-mid front rounded vowel U+00F8 + ("Z" "=CA=92") ;; Voiced postalveolar fricative U+0292 + ("?" "=CA=94") ;; Glottal stop U+0294 + ("@" "=C9=99") ;; Mid central unrounded vowel (schwa) U+0259 + ("&" "=C3=A6") ;; Low front unrounded vowel U+00E6 + ("*" "=C9=BE") ;; Voiced alveolar flap U+027E + + ("a~" "=C3=A3") ;; Low central unrounded vowel, nasal U+00E3 + ("o~" "=C3=B5") ;; Upper-mid back rounded vowel, nasal U+00F5 + ("u~" "=C5=A9") ;; High back rounded vowel, nasal U+0169 + ("~" "=CC=83") ;; +Nasalised modifier U+0303 + (":" "=CB=90") ;; +Long modifier U+02D0 + ("-" "=CC=A9") ;; +Syllabic modifier U+0329 + ("." "=CC=A3") ;; +Retroflex modifier U+0323 + ("`" "=CA=BC") ;; +Ejective modifier U+02BC + ("[" "=CC=AA") ;; +Dental modifier U+032A + (";" "=CA=B2") ;; +Palatalised modifier U+02B2 + ("" "=CC=B4") ;; +Pharyngealised modifier U+0334 + ("" "=CA=B0") ;; +Aspirated modifier U+02B0 + ("" ["=CC=A5" ;; +Voiceless modifier U+0325 + "=CB=9A"]) ;; +Unexploded modifier U+02DA + ("" "=CA=B3") ;; +Rhotacised modifier U+02B3 + ("" "=CA=B7") ;; +Labialised modifier U+02B7 + ("" "=CA=B1") ;; +Murmured modififer U+02B1 + + ("b" "=CA=99") ;; Bilabial trill U+0299 + ("b`" "=C9=93") ;; Bilabial implosive U+0253 + ("p!" "=CA=98") ;; Bilabial click U+0298 + ("r" "=CA=8B") ;; Labio-dental approximant U+028B + ("d`" "=C9=97") ;; Dental implosive U+0257 + ("t!" "=CA=87") ;; Dental click U+0287 + ("s" "=C9=AC") ;; Voiceless alveolar lateral fricative U+026C + ("z" "=C9=AE") ;; Voiced alveolar lateral fricative U+026E + ("r" "=CA=80") ;; Alveolar trill U+0280 + + ("*" "=C9=BA") ;; Voiced alveolar lateral flap U+027A + ("c!" "=CA=97") ;; Alveolar click U+0297 + ("l!" "=CA=96") ;; Alveolar lateral click U+0296 + ("n." "=C9=B3") ;; Retroflex nasal U+0273 + ("t." "=CA=88") ;; Voiceless retroflex stop U+0288 + ("d." "=C9=96") ;; Voiced retroflex stop U+0256 + ("s." "=CA=82") ;; Voiceless retroflex fricative U+0282 + ("z." "=CA=90") ;; Voiceless retroflex fricative U+0290 + ("r." "=C9=BB") ;; Retroflex approximant U+027B + ("l." "=C9=AD") ;; Retroflex lateral U+026D + ("*." "=C9=BD") ;; Retroflex flap U+027D + + ("C" "=CA=9D") ;; Voiced palatal fricative U+029D + ("j" "=C9=A5") ;; Rounded palatal approximant U+0265 + ("l^" "=CA=8E") ;; Palatal lateral U+028E + ("J`" "=CA=84") ;; Palatal implosive U+0284 + ("j" "=C9=B0") ;; Velar approximant U+0270 + ("g`" "=C9=A0") ;; Velar implosive U+0260 + ("k!" "=CA=9E") ;; Velar click U+029E +=20 + ("n" ["n=E2=81=80g"]) ;; Labio-velar nasal + ("t" ["k=E2=81=80p"]) ;; Voiceless labio-velar stop + + ;; "n for "gb" WITH U+2030 CHARACTER TIE was ambiguous and + ;; misleading. I _believe_ this is what was meant instead.=20 + ("d" ["g=E2=81=80b"]) ;; Voiced labio-velar stop.=20 + + ("w" "=CA=8D") ;; Voiceless labio-velar stop U+028D + ("n\"" "=C9=B4") ;; Uvular nasal U+0274 + ("g\"" "=CA=81") ;; Voiced uvular fricative U+0281 + ("r\"" "=CA=80") ;; Uvular trill U+0280 + ("G`" "=CA=9B") ;; Voiced uvular implosive U+029B + ("H" "=CA=95") ;; Voiced pharyngeal fricative U+0295 + + ("h" "=C9=A6") ;; Murmured glottal fricative U+0266 + ("I." "=CA=8F") ;; Semi-high front rounded vowel U+028F + ("&." "=C9=B6") ;; Low front unrounded vowel U+0276 + + ("i\"" "=C9=A8") ;; High central unrounded vowel U+0268 + ("u\"" "=CA=89") ;; High central rounded vowel U+0289 + ("@" "=C9=98") ;; Upper-mid central unrounded vowel U+0258 + + ("R" "=C9=9D") ;; Upper-mid central rhotacised vowel U+025D + + ("@." "=C9=B5") ;; Mid central rounded vowel U+0275 + ("V\"" "=C9=9C") ;; Lower-mid central unrounded vowel U+025C + ("O\"" "=C9=9E") ;; Lower-mid central rounded vowel U+025E + ("u-" "=C9=AF") ;; High back unrounded vowel U+026F + ("o-" "=C9=A4") ;; Upper-mid back unrounded vowel U+0264 + ("A." "=C9=92")) ;; Lower back rounded vowel U+0252 + +;; On XEmacs, with the supplied X-SAMPA data, this function is capably +;; implemented with:=20 +;; +;; (list (vector (concat to-prepend quail-keymap))) +;;=20 +;; Supporting GNU Emacs too makes it a good deal more complicated.=20 + +(defun x-sampa-prepend-to-keymap-entry (to-prepend quail-keymap) + "Return QUAIL-KEYMAP with TO-PREPEND at the beginning of each result. + +QUAIL-KEYMAP is a cons that satisfies `quail-map-p'; TO-PREPEND is a +string. " + (when (consp quail-keymap) (setq quail-keymap (cdr quail-keymap))) + (if (or (integerp quail-keymap)=20 + (and (fboundp 'characterp) (characterp quail-keymap))) + (setq quail-keymap (list (string quail-keymap))) + (if (stringp quail-keymap) + (setq quail-keymap (list quail-keymap)) + (assert (vectorp quail-keymap) t) + (setq quail-keymap (append quail-keymap nil)))) + (list=20 + (apply 'vector=20 + (mapcar=20 + #'(lambda (entry) + (assert (char-or-string-p entry) t) + (format "%s%s" to-prepend=20 + (if (integerp entry) (string entry) entry))) + quail-keymap)))) + +(defun x-sampa-underscore-implosive (input-string length) + "Return keymap with IPA implosives, for INPUT-STRING, length LENGTH. + +The implosive consonants in X-SAMPA are represented with more or less a +diacritic syntax, but the property +implosive in the IPA is expressed us= ing +separate characters, and not using a diacritic. This function works aro= und +the confusion that implies when generating IPA from X-SAMPA; it returns = a +Quail map that is a copy of the map for `_', but with all the DIACRITIC +entries changed to return the diacritic together with the base character= , +and with the map to the implosive added to its end. + +Like all `quail-defrule'-assigned functions, this will be called once fo= r +each particular sequence of keys, the first time the user types that +particular sequence of keys, and the result will be cached by Quail. " + (let* ((input-string (substring input-string 0 (or length))) + (underscore-map (copy-tree (quail-lookup-key "_"))) + (split-input (split-string input-string "_")) + (pre-underscore (car split-input)) + (pre-underscore-map (quail-lookup-key pre-underscore)) + (x-sampa-submap-entry=20 + (assoc (format "%s<" input-string) x-sampa-implosive-submap)) + underscore-map-entry) + (if (and (consp pre-underscore-map) (car pre-underscore-map)) + (setq pre-underscore-map (car pre-underscore-map)) + (setq pre-underscore-map pre-underscore)) + (unless (stringp pre-underscore-map) + (setq pre-underscore-map (string pre-underscore-map))) + (dolist (underscoring underscore-map) + (cond ((null underscoring)) + ((eq (length underscoring) 2) + (setq underscore-map-entry (second underscoring)) + (setcdr underscoring (x-sampa-prepend-to-keymap-entry=20 + pre-underscore-map underscore-map-entry))) + ((eq (length underscoring) 3) + (setq underscore-map-entry (second (third underscoring))) + (setcdr (third underscoring)=20 + (x-sampa-prepend-to-keymap-entry=20 + pre-underscore-map underscore-map-entry))) + (t=20 + (assert (null t) t=20 + "Can't handle subtrees of this level right now.")))) + (append underscore-map (list (list ?< (second x-sampa-submap-entry))= )))) + +(quail-define-package + "x-sampa-ipa" "IPA" "IPA-X" t + "The International Phonetic Alphabet, using J.C. Wells' X-SAMPA.=20 + +X-SAMPA is an ASCII transliteration of the IPA, normally used for data +exchange in environments where Unicode is not available. This input met= hod +uses this transliteration to allow you to produce the IPA in your editor +with a keyboard that's limited to ASCII. + +See http://www.phon.ucl.ac.uk/home/sampa/ipasam-x.pdf for a full definit= ion +of the mapping. A caveat with regard to that document; while XEmacs +currently preserves Unicode diacritics on reading and emitting them, it +displays them, incorrectly, as separate from the modified glyphs. " nil = t t) + +(quail-define-rules + ;; Table taken from http://en.wikipedia.org/wiki/X-SAMPA, checked with + ;; http://www.phon.ucl.ac.uk/home/sampa/ipasam-x.pdf + + ("d`" "=C9=96") ;; Voiced retroflex plosive U+0256 + + ;; In the Wikipedia article, they list ASCII g as mapping to U+0261, LA= TIN + ;; SMALL LETTER SCRIPT G. The typeset g is equally acceptable as the vo= iced + ;; velar plosive, however, and we don't override the identity mapping h= ere. + + ("h\\" "=C9=A6") ;; Voiced glottal fricative U+0266 + ("j\\" "=CA=9D") ;; Voiced palatal fricative U+029D + ("l`" "=C9=AD") ;; Retroflex lateral approximant U+026D + ("l\\" "=C9=BA") ;; Alveolar lateral flap U+027A + ("n`" "=C9=B3") ;; Retroflex nasal U+0273 + ("p\\" "=C9=B8") ;; Voiceless bilabial fricative U+0278 + ("r`" "=C9=BD") ;; Retroflex flap U+027D + ("r\\" "=C9=B9") ;; Alveolar approximant U+0279 + ("r\\`" "=C9=BB") ;; Retroflex approximant U+027B + ("s`" "=CA=82") ;; Voiceless retroflex fricative U+0282 + ("s\\" "=C9=95") ;; Voiceless alveolo-palatal fricative U+0255 + ("t`" "=CA=88") ;; Voiceless retroflex plosive U+0288 + ("v\\" "=CA=8B") ;; Labiodental approximant U+028B + ("x\\" "=C9=A7") ;; Voiceless palatal-velar fricative U+0267 + ("z`" "=CA=90") ;; Voiced retroflex fricative U+0290 + ("z\\" "=CA=91") ;; Voiced alveolo-palatal fricative U+0291 + ("A" "=C9=91") ;; Open back unrounded vowel U+0251 + ("B" "=CE=B2") ;; Voiced bilabial fricative U+03B2 + ("B\\" "=CA=99") ;; Bilabial trill U+0299 + ("C" "=C3=A7") ;; Voiceless palatal fricative U+00E7 + ("D" "=C3=B0") ;; Voiced dental fricative U+00F0 + ("E" "=C9=9B") ;; Open-mid front unrounded vowel U+025B + ("F" "=C9=B1") ;; Labiodental nasal U+0271 + ("G" "=C9=A3") ;; Voiced velar fricative U+0263 + ("G\\" "=C9=A2") ;; Voiced uvular plosive U+0262 + ("H" "=C9=A5") ;; Labial-palatal approximant U+0265 + ("H\\" "=CA=9C") ;; Voiceless epiglottal fricative U+029C + ("I" "=C9=AA") ;; Near-close near-front unrounded vowel U+026A + ("I\\" "=C6=97") ;; Central lax close unrounded vowel U+0197 + ("J" "=C9=B2") ;; Palatal nasal U+0272 + ("J\\" "=C9=9F") ;; Voiceless palatal plosive U+025F + ("K" "=C9=AC") ;; Voiceless alveolar lateral fricative U+026C + ("K\\" "=C9=AE") ;; Voiced alveolar lateral fricative U+026E + ("L" "=CA=8E") ;; Palatal lateral approximant U+028E + ("L\\" "=CA=9F") ;; Velar lateral approximant U+029F + ("M" "=C9=AF") ;; Close back unrounded vowel U+026F + ("M\\" "=C9=B0") ;; Velar approximant U+0270 + ("N" "=C5=8B") ;; Velar nasal U+014B + ("N\\" "=C9=B4") ;; Uvular nasal U+0274 + ("O" "=C9=94") ;; Open-mid back rounded vowel U+0254 + ("O\\" "=CA=98") ;; Bilabial click U+0298 + ("P" "=CA=8B") ;; Labiodental approximant U+028B + ("Q" "=C9=92") ;; Open back rounded vowel U+0252 + ("R" "=CA=81") ;; Voiced uvular fricative U+0281 + ("R\\" "=CA=80") ;; Uvular trill U+0280 + ("S" "=CA=83") ;; Voiceless postalveolar fricative U+0283 + ("T" "=CE=B8") ;; Voiceless dental fricative U+03B8 + ("U" "=CA=8A") ;; Near-close near-back rounded vowel U+028A + ("U\\" ["=CA=8A=CC=B5"]) ;; Central lax close rounded vowel, U+028A U+0= 335 + ("V" "=CA=8C") ;; Open-mid back unrounded vowel U+028C + ("W" "=CA=8D") ;; Voiceless labial-velar fricative U+028D + ("X" "=CF=87") ;; Voiceless uvular fricative U+03C7 + ("X\\" "=C4=A7") ;; Voiceless pharyngeal fricative U+0127 + ("Y" "=CA=8F") ;; Near-close near-front rounded vowel U+028F + ("Z" "=CA=92") ;; Voiced postalveolar fricative U+0292 + + ("\"" "=CB=88") ;; Primary stress U+02C8 + ("%" "=CB=8C") ;; Secondary stress U+02CC + (":" "=CB=90") ;; Long U+02D0 + (":\\" "=CB=91") ;; Half-long U+02D1 + ("@" "=C9=99") ;; Schwa U+0259 + ("@\\" "=C9=98") ;; Close-mid central unrounded vowel U+0258 + ("@`" "=C9=9A") ;; Rhotacised schwa U+025A + ("{" "=C3=A6") ;; Near-open front unrounded vowel U+00E6 + ("}" "=CA=89") ;; Close central rounded vowel U+0289 + ("1" "=C9=A8") ;; Close central unrounded vowel U+0268 + ("2" "=C3=B8") ;; Close-mid front rounded vowel U+00F8 + ("3" "=C9=9C") ;; Open-mid central unrounded vowel U+025C + ("3\\" "=C9=9E") ;; Open-mid central rounded vowel U+025E + ("4" "=C9=BE") ;; Alveolar flap U+027E + ("5" "=C9=AB") ;; Velarised alveolar lateral approximant U+026B + ("6" "=C9=90") ;; Near-open central vowel U+0250 + ("7" "=C9=A4") ;; Close-mid back unrounded vowel U+0264 + ("8" "=C9=B5") ;; Close-mid central rounded vowel U+0275 + ("9" "=C5=93") ;; Open-mid front rounded vowel U+0153 + ("&" "=C9=B6") ;; Open front rounded vowel U+0276 + ("?" "=CA=94") ;; Glottal stop U+0294 + ("?\\" "=CA=95") ;; Voiced pharyngeal fricative U+0295 + ;; The undefined escape character, ignored.=20 + ;; Indeterminacy in French vowels, ignored. + ;; Begin nonsegmental notation, ignored.=20 + ("<\\" "=CA=A2") ;; Voiced epiglottal fricative U+02A2 + ;; End nonsegmental notation, ignored.=20 + (">\\" "=CA=A1") ;; Epiglottal plosive U+02A1 + ("^" "=E2=86=91") ;; Upstep U+2191 + ("!" "=E2=86=93") ;; Downstep U+2193 + ("!\\" "=C7=83") ;; Postalveolal click U+01C3 + ("\\" "=C7=80") ;; Dental click U+01C0 + ("\\|\\" "=C7=81") ;; Lateral alveolar click U+01C1 + ("=3D\\" "=C7=82") ;; Palatal click U+01C2 + ("-\\" "=CC=AE") ;; Linking mark U+032E + + ;; Diacritics. Note that XEmacs doesn't yet have composed characters, s= o we + ;; can input them, but they won't display properly. If you send email u= sing + ;; them, and the recipient's client is capable, they will get through, + ;; though. + + ("_\"" "=CC=88") ;; Centralised U+0308 + ("_+" "=CC=9F") ;; Advanced U+031F + ("_-" "=CC=A0") ;; Retracted U+0320 + ("_/" "=CB=87") ;; Rising tone U+02C7 + ("_0" "=CC=A5") ;; Voiceless U+0325 + ("_=3D" "=CC=A9") ;; Syllabic U+0329 + ("=3D" "=CC=A9") ;; Syllabic U+0329 + ("_>" "=CA=BC") ;; Ejective U+02BC + ("_?\\" "=CB=A4") ;; Pharyngealised U+02E4 + ("_\\" "=CB=86") ;; Falling Tone U+02C6 + ("_^" "=CC=AF") ;; Non-syllabic U+032F + ("_}" "=CC=9A") ;; No audible release U+031A + ;; ` is alternatively; retroflexion in consonants + ("`" "=CB=9E") ;; Rhotacization in vowels U+02DE + ("_~" "=CC=83") ;; Nasalisation U+0303 + ("~" "=CC=83") ;; Nasalisation U+0303 + ("_A" "=CC=98") ;; Advanced tongue root U+0318 + ("_a" "=CC=BA") ;; Apical U+033A + ("_B" "=CC=8F") ;; Extra low tone U+030F + ;; _B_L omitted, no Unicode code point for "low rising tone." + ("_c" "=CC=9C") ;; Less rounded U+031C + ("_d" "=CC=AA") ;; Dental U+032A + ("_e" "=CC=B4") ;; Velarised or pharyngeal U+0334 + + ("" "=E2=86=99") ;; Global fall; SOUTH EAST ARROW; may be a bit smal= ler than + ;; intended. + ("_F" "=CC=82") ;; Falling tone U+0302 + ("_G" "=CB=A0") ;; Velarised U+02E0 + ("_H" "=CC=81") ;; High tone U+0301 + ;; "_H_T omitted, no Unicode code point for "high rising tone" + ("_h" "=CA=B0") ;; Aspirated U+02B0 + ("_j" "=CA=B2") ;; Palatalised U+02B2 + ("'" "=CA=B2") ;; Palatalised U+02B2 + ("_k" "=CC=B0") ;; Creaky voice U+0330 + ("_L" "=CC=80") ;; Low tone U+0300 + ("_l" "=CB=A1") ;; Lateral release U+02E1 + ("_M" "=CC=84") ;; Mid tone U+0304 + ("_m" "=CC=BB") ;; Laminal U+033B + ("_N" "=CC=BC") ;; Linguolabial U+033C + ("_n" "=E2=81=BF") ;; Nasal release U+207F + ("_O" "=CC=B9") ;; More rounded U+0339 + ("_o" "=CC=9E") ;; Lowered U+031E + ("_q" "=CC=99") ;; Retracted tongue root U+0319 + ("" "=E2=86=97") ;; NORTH EAST ARROW; may be a bit smaller than inte= nded.=20 + ("_R" "=CC=8C") ;; Ha=C4=8Dek, caron, rising tone. U+030C + ;; _R_F omitted, apparently there's no corresponding Unicode entry.=20 + ("_r" "=CC=9D") ;; Raised U+031D + ("_T" "=CC=8B") ;; Extra high tone U+030B + ("_t" "=CC=A4") ;; Breathy voice U+0324 + ("_v" "=CC=AC") ;; Voiced U+032C + ("_w" "=CA=B7") ;; Labialised U+02B7 + ("_X" "=CC=86") ;; Extra-short U+0306 + ("_x" "=CC=BD")) ;; Mid-centralised U+033D + +(defconst x-sampa-implosive-submap=20 + '(("b_<" ?=C9=93) ;; Voiced bilabial implosive U+0253=20 + ("d_<" ?=C9=97) ;; Voiced alveolar implosive U+0257 + ("g_<" ?=C9=A0) ;; Voiced velar implosive U+0260 + ("G\\_<" ?=CA=9B) ;; Voiced uvular implosive U+029B + ("J\\_<" ?=CA=84)) ;; Voiced palatal implosive U+0284 + "A map from the X-SAMPA for some implosive consonants to characters. +This is used because their X-SAMPA syntax is quasi-diacritic, but the +corresponding Unicode characters themselves don't have diacritics, they = are +separate code points. So we need to implement some extra logic that isn= 't +normally provided by Quail. ") + +;; Putting in place rules for the implosives like for the others above +;; breaks the "_" rules for b, d, g, G and J a little--you ne= ed +;; to interrupt Quail before typing the underscore if you want the +;; diacritic. To avoid this, handle the input specially with the functio= n +;; x-sampa-underscore-implosive. + +(dolist (implosive-x-sampa (mapcar 'car x-sampa-implosive-submap)) + (setq implosive-x-sampa (car (split-string implosive-x-sampa "_"))) + (quail-defrule (format "%s_" implosive-x-sampa) + 'x-sampa-underscore-implosive)) + +(provide 'ipa) --=20 =C2=BFD=C3=B3nde estar=C3=A1 ahora mi sobrino Yoghurtu Nghe, que tuvo que= huir precipitadamente de la aldea por culpa de la escasez de rinocerontes? --V0wqEiOxMR Content-Type: application/octet-stream; name="ipa.el.new.bz2" Content-Disposition: attachment; filename="ipa.el.new.bz2" Content-Transfer-Encoding: base64 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 +XEBHVIIAYIEuePFhD/F3JFOFCQf7nQtAA== --V0wqEiOxMR--