Subject: bug#66470: 29.1; Provide Urdu input method

From: Rahguzar <[email-masked]>
Date: Wed, 11 Oct 2023 20:50:33 +0200

Please find attached the patch I mentioned earlier and let me know any changes that need to be made.

The input method is usable for common Urdu input, but here are some of
the things I want to improve in addition to what I asked on the
help-gnu-emacs:

1) Better coverage of Urdu zabta takhti
http://www.unicode.org/L2/L2002/02004-uzt.pdf It is a code page
developed for Urdu and supposedly was the basis of current Urdu support
of Unicode. However I can't figure out exactly what is the mapping from
UZT to Unicode. If anyone has pointers please share.

2) Another input method for the common Urdu keyboard support. Despite
Urdu being my mother tongue I never learned to type in it which is why I
prefer a phonetic keyboard. However I will like to make an input method
with the layout of a physical Urdu keyboard. If a keyboard layout was
standardized in Pakistan or India, I can't find the specification. If
such a document exists and anyone can point me to it, I will be happy to
use it as a basis for addition to the `urdu.el` in attached patch.
Otherwise I will use the layout of Urdu keyboard from some free software
project. But this will probably be closer to Emacs 30 than now.

3) The key for 'w' is unused in the input method for now. I am tempted
to bind a version of `insert-char` but restricted to Arabic range of
Unicode to cover the rare cases not covered by the input method now. Any
opinions about that?

Thanks,
Rahguzar

Rahguzar <[email-masked]> writes:

> Dear Emacs developers,
>
> Emacs should provide an Urdu input method. The closet input methods
> available are those for Farsi. However Urdu has additional letters which
> can't be inputted using those and divergence between Urdu and Farsi
> makes some of the choices less than ideal for Urdu.
>
> I have written a simple input method for Urdu which I will attach as a
> patch with a followup email for review and eventual inclusion. I have
> questions about quail which I asked at
> https://lists.gnu.org/archive/html/help-gnu-emacs/2023-10/msg00082.html
> . If someone on this list knows the answer to those please let me know.
>
> Thanks in advance,
> Rahguzar
>
>
>
> In GNU Emacs 29.1 (build 1, x86_64-suse-linux-gnu, GTK+ Version 3.24.38,
>  cairo version 1.17.8) of 2023-09-23 built on i02-ch2c
> System Description: openSUSE Tumbleweed
>
> Configured using:
>  'configure --host=x86_64-suse-linux-gnu --build=x86_64-suse-linux-gnu
>  --program-prefix= --disable-dependency-tracking --prefix=/usr
>  --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin
>  --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include
>  --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var
>  --sharedstatedir=/var/lib --mandir=/usr/share/man
>  --infodir=/usr/share/info --with-pgtk --with-native-compilation=aot
>  --with-cairo --with-libotf --with-jpeg --with-tiff --with-gif
>  --with-png --with-rsvg --with-xft --with-xml2 --with-dbus --with-sound
>  --with-json --with-mailutils --with-gnutls --with-tree-sitter
>  --enable-locallisppath=/usr/share/emacs/29.1/site-lisp:/usr/share/emacs/site-lisp
>  'CFLAGS=-O2 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3
>  -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables
>  -fstack-clash-protection -Werror=return-type -flto=auto'
>  LDFLAGS=-Wl,-O2'
>
> Configured features:
> CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON
> LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY
> PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF
> TOOLKIT_SCROLL_BARS TREE_SITTER XIM GTK3 ZLIB
>
> Important settings:
>   value of $LANG: en_US.UTF-8
>   locale-coding-system: utf-8-unix
>
> Major mode: mu4e:main
>
> Minor modes in effect:
>   shell-dirtrack-mode: t
>   global-evil-surround-mode: t
>   evil-surround-mode: t
>   eros-mode: t
>   recentf-mode: t
>   global-so-long-mode: t
>   save-place-mode: t
>   pdf-occur-global-minor-mode: t
>   projectile-mode: t
>   which-key-mode: t
>   savehist-mode: t
>   better-jumper-mode: t
>   better-jumper-local-mode: t
>   global-company-mode: t
>   company-mode: t
>   vertico-mode: t
>   nerd-icons-completion-mode: t
>   marginalia-mode: t
>   evil-goggles-mode: t
>   evil-escape-mode: t
>   evil-snipe-override-mode: t
>   evil-snipe-mode: t
>   gcmh-mode: t
>   winner-mode: t
>   smartparens-global-mode: t
>   ws-butler-global-mode: t
>   undo-fu-session-global-mode: t
>   undo-fu-mode: t
>   satchel-mode: t
>   mu4e-search-minor-mode: t
>   global-hl-line-mode: t
>   hl-line-mode: t
>   mu4e-update-minor-mode: t
>   mu4e-context-minor-mode: t
>   dirvish-override-dired-mode: t
>   server-mode: t
>   pixel-scroll-precision-mode: t
>   repeat-mode: t
>   evil-mode: t
>   evil-local-mode: t
>   +popup-mode: t
>   +modeline-global-mode: t
>   +modeline-mode: t
>   global-ligature-mode: t
>   ligature-mode: t
>   override-global-mode: t
>   general-override-mode: t
>   global-eldoc-mode: t
>   show-paren-mode: t
>   electric-indent-mode: t
>   mouse-wheel-mode: t
>   file-name-shadow-mode: t
>   global-font-lock-mode: t
>   font-lock-mode: t
>   window-divider-mode: t
>   buffer-read-only: t
>   size-indication-mode: t
>   line-number-mode: t
>   transient-mark-mode: t
>   auto-composition-mode: t
>   auto-encryption-mode: t
>   auto-compression-mode: t
>   abbrev-mode: t
>
> Load-path shadows:
> /home/azeem/.emacs.d/.local/straight/build-29.1/emacsql/emacsql-sqlite-builtin hides /home/azeem/.emacs.d/.local/straight/build-29.1/emacsql-sqlite-builtin/emacsql-sqlite-builtin
> /home/azeem/.emacs.d/.local/straight/build-29.1/citar-embark/citar-embark hides /home/azeem/.emacs.d/.local/straight/build-29.1/citar/citar-embark
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-view hides /usr/share/emacs/site-lisp/mu4e/mu4e-view
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-search hides /usr/share/emacs/site-lisp/mu4e/mu4e-search
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-org hides /usr/share/emacs/site-lisp/mu4e/mu4e-org
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-contacts hides /usr/share/emacs/site-lisp/mu4e/mu4e-contacts
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-config hides /usr/share/emacs/site-lisp/mu4e/mu4e-config
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e hides /usr/share/emacs/site-lisp/mu4e/mu4e
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-window hides /usr/share/emacs/site-lisp/mu4e/mu4e-window
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-vars hides /usr/share/emacs/site-lisp/mu4e/mu4e-vars
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-update hides /usr/share/emacs/site-lisp/mu4e/mu4e-update
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-speedbar hides /usr/share/emacs/site-lisp/mu4e/mu4e-speedbar
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-server hides /usr/share/emacs/site-lisp/mu4e/mu4e-server
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-query-items hides /usr/share/emacs/site-lisp/mu4e/mu4e-query-items
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-obsolete hides /usr/share/emacs/site-lisp/mu4e/mu4e-obsolete
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-notification hides /usr/share/emacs/site-lisp/mu4e/mu4e-notification
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-modeline hides /usr/share/emacs/site-lisp/mu4e/mu4e-modeline
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-message hides /usr/share/emacs/site-lisp/mu4e/mu4e-message
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-mark hides /usr/share/emacs/site-lisp/mu4e/mu4e-mark
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-main hides /usr/share/emacs/site-lisp/mu4e/mu4e-main
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-lists hides /usr/share/emacs/site-lisp/mu4e/mu4e-lists
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-icalendar hides /usr/share/emacs/site-lisp/mu4e/mu4e-icalendar
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-helpers hides /usr/share/emacs/site-lisp/mu4e/mu4e-helpers
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-headers hides /usr/share/emacs/site-lisp/mu4e/mu4e-headers
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-folders hides /usr/share/emacs/site-lisp/mu4e/mu4e-folders
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-draft hides /usr/share/emacs/site-lisp/mu4e/mu4e-draft
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-contrib hides /usr/share/emacs/site-lisp/mu4e/mu4e-contrib
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-context hides /usr/share/emacs/site-lisp/mu4e/mu4e-context
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-compose hides /usr/share/emacs/site-lisp/mu4e/mu4e-compose
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-bookmarks hides /usr/share/emacs/site-lisp/mu4e/mu4e-bookmarks
> /home/azeem/.emacs.d/.local/straight/build-29.1/mu4e/mu4e-actions hides /usr/share/emacs/site-lisp/mu4e/mu4e-actions
>
> Features:
> (shadow emacsbug evil-collection-help url-http url-gw url-cache url-auth
> password-store auth-source-pass with-editor shell gts-engine-deepl
> gts-implements gts-faces gts-core cl-print cus-start guess-language
> flyspell evil-embrace evil-surround eros highlight-quoted
> rainbow-delimiters highlight-numbers parent-mode hl-todo
> evil-collection-elisp-mode elisp-mode org-eldoc embrace expand-region
> text-mode-expansions the-org-mode-expansions er-basic-expansions
> expand-region-core expand-region-custom cdlatex evil-collection-reftex
> reftex-toc reftex-cite reftex-ref reftex-parse reftex reftex-loaddefs
> reftex-vars toc-org evil-org org-indent org-element org-persist xdg
> org-id org-refile avl-tree generator ol-bibtex evil-collection-consult
> consult magit-base evil-collection-magit-section magit-section crm
> evil-collection-indent evil-collection-helpful helpful cc-langs cc-vars
> cc-defs trace evil-collection-edebug edebug evil-collection-debug debug
> backtrace info-look evil-collection-info info f f-shortdoc help-fns
> radix-tree evil-collection-elisp-refs elisp-refs s link-hint ffap
> goto-addr avy company-ispell company-yasnippet company-dabbrev delsel
> display-line-numbers adaptive-wrap jit-spell ispell face-remap recentf
> tree-widget evil-collection-so-long so-long vertico-directory pdf-annot
> facemenu pdf-outline pdf-links pdf-roll saveplace-pdf-view saveplace
> pdf-loader pdf-occur evil-collection-tablist tablist tablist-filter
> semantic/wisent/comp semantic/wisent semantic/wisent/wisent
> semantic/util-modes semantic/util semantic semantic/tag semantic/lex
> semantic/fw mode-local cedet pdf-isearch pdf-misc evil-collection-imenu
> imenu evil-collection-pdf pdf-history pdf-tools
> evil-collection-package-menu doom-packages package url-handlers pdf-view
> pdf-cache pdf-info tq pdf-util pdf-macs image-mode exif shr-color
> whitespace jka-compr gnus-fun smerge-mode diff evil-collection-diff-mode
> diff-mode auto-minor-mode qp mm-archive sort smiley gnus-cite mail-extr
> textsec uni-scripts idna-mapping ucs-normalize uni-confusable
> textsec-check gnus-async gnus-bcklg gnus-ml disp-table nndraft nnmh
> nnfolder cursor-sensor vertico-repeat epa-file network-stream nsm
> gnus-agent gnus-srvr gnus-score score-mode nnvirtual gnus-msg nntp
> gnus-cache projectile lisp-mnt evil-collection-grep grep hide-mode-line
> evil-collection-which-key which-key savehist better-jumper company-capf
> company evil-collection-vertico vertico orderless nerd-icons-completion
> marginalia compat evil-goggles pulse color evil-easymotion evil-escape
> evil-snipe autorevert filenotify gcmh winner smartparens-config
> smartparens-text smartparens loadhist dash ws-butler undo-fu-session
> undo-fu satchel ibuf-ext evil-collection-ibuffer ibuffer
> ibuffer-loaddefs desktop frameset evil-collection-mu4e mu4e mu4e-org
> evil-collection-org smartparens-org org ob ob-tangle ob-ref ob-lob
> ob-table ob-exp org-macro org-src ob-comint org-pcomplete pcomplete
> org-list org-footnote org-faces org-entities noutline outline
> ob-emacs-lisp ob-core ob-eval org-cycle org-table ol org-fold
> org-fold-core org-keys oc-natbib oc-csl bibtex oc-biblatex oc
> org-loaddefs find-func org-version org-compat org-macs mu4e-notification
> notifications mu4e-main mu4e-view gnus-art mm-uu mml2015 mm-view
> mml-smime smime gnutls dig gnus-sum gnus-group gnus-undo gnus-start
> gnus-dbus dbus gnus-cloud nnimap nnmail mail-source utf7 nnoo parse-time
> iso8601 gnus-spec gnus-int gnus-range gnus-win evil-collection-gnus gnus
> nnheader range evil-collection-calendar cal-menu calendar cal-loaddefs
> mu4e-headers mu4e-compose mu4e-draft mu4e-actions smtpmail mu4e-search
> mu4e-lists mu4e-bookmarks mu4e-mark mu4e-message shr pixel-fill kinsoku
> url-file svg xml dom browse-url url url-proxy url-privacy url-expand
> url-methods url-history url-cookie generate-lisp-file url-domsuf
> url-util url-parse auth-source json map url-vars flow-fill mule-util
> hl-line mu4e-contacts mu4e-update mu4e-folders mu4e-context
> mu4e-query-items mu4e-server mu4e-modeline mu4e-vars mu4e-helpers
> mu4e-config mu4e-window evil-collection-bookmark bookmark ido message
> sendmail mailcap yank-media puny dirvish transient format-spec eieio
> eieio-core evil-collection-dired dired dired-loaddefs rfc822 mml mml-sec
> password-cache evil-collection-epa epa epg rfc6068 epg-config gnus-util
> time-date mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047
> rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils gmm-utils
> mailheader mu4e-obsolete server dtrt-indent ef-spring-theme ef-themes
> pixel-scroll cua-base repeat midnight html2text let-alist
> evil-collection-flymake flymake-proc flymake project
> evil-collection-compile evil-collection-custom cus-edit cus-load
> wid-edit evil-collection-comint evil-collection annalist compile
> text-property-search comint ansi-osc ansi-color ibuf-macs evil
> evil-integration evil-maps evil-commands reveal evil-jumps
> evil-command-window evil-types evil-search evil-macros evil-repeat
> evil-states evil-core byte-opt advice evil-common thingatpt rect
> evil-vars ring nerd-icons nerd-icons-faces nerd-icons-data
> nerd-icons-data-mdicon nerd-icons-data-flicon nerd-icons-data-codicon
> nerd-icons-data-devicon nerd-icons-data-sucicon nerd-icons-data-wicon
> nerd-icons-data-faicon nerd-icons-data-powerline nerd-icons-data-octicon
> nerd-icons-data-pomicon nerd-icons-data-ipsicon ligature derived edmacro
> kmacro use-package-bind-key bind-key comp comp-cstr warnings icons rx
> doom-editor doom-projects doom-ui easy-mmode doom-keybinds pp cl-extra
> help-mode use-package-core bytecomp byte-compile general tex-site
> doom-start doom-modules cl-seq doom doom-lib cl-macs cl-loaddefs cl-lib
> pcase gv harfbuzz jansson dynamic-modules subr-x rmc iso-transl tooltip
> cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type
> mwheel term/pgtk-win pgtk-win term/common-win pgtk-dnd tool-bar dnd
> fontset image regexp-opt fringe tabulated-list replace newcomment
> text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow
> isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax
> font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic
> indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
> tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
> romanian slovak czech european ethiopic indian cyrillic chinese
> composite emoji-zwj charscript charprop case-table epa-hook
> jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
> theme-loaddefs faces cus-face macroexp files window text-properties
> overlay sha1 md5 base64 format env code-pages mule custom widget keymap
> hashtable-print-readable backquote threads dbusbind inotify
> dynamic-setting system-font-setting font-render-setting cairo gtk pgtk
> multi-tty make-network-process native-compile emacs)
>
> Memory information:
> ((conses 16 1093296 205022)
>  (symbols 48 53308 119)
>  (strings 32 240871 24675)
>  (string-bytes 1 8170002)
>  (vectors 16 136989)
>  (vector-slots 8 3133020 258974)
>  (floats 8 1833 1721)
>  (intervals 56 28999 88)
>  (buffers 984 58))

>From 8c0fc53efef493e151bd5893d5b5ca7b390b4a6b Mon Sep 17 00:00:00 2001
From: Rahguzar <[email-masked]>
Date: Wed, 11 Oct 2023 20:45:27 +0200
Subject: [PATCH] Provide an Urdu input method

---
 lisp/leim/quail/urdu.el | 193 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 193 insertions(+)
 create mode 100644 lisp/leim/quail/urdu.el

diff --git a/lisp/leim/quail/urdu.el b/lisp/leim/quail/urdu.el
new file mode 100644
index 00000000000..b5b909c4467
--- /dev/null
+++ b/lisp/leim/quail/urdu.el
@@ -0,0 +1,193 @@
+;;; urdu.el --- Quail package for Urdu -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2011-2023 Free Software Foundation, Inc.
+
+;; Author: Rahguzar <[email-masked]>
+;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Provides a semi-phonetic input method for Urdu
+;;
+;;; Code:
+(require 'quail)
+
+(quail-define-package
+ "urdu-phonetic" "Urdu" "اردو صوتی"
+ `((?a . "a → ا , A → آ , ax → أ , u → ع")
+   (?y . "y → ی , e → ے , i → ئ")
+   (?r . "r → ر , R → ڑ")
+   (?n . "n → ن , N → ں")
+   (?v . "v → و , V → ؤ")
+   (?t . "t → ت, T → ٹ , tx → ط , Tx → ۃ")
+   (?k . "k → ک , q → ق, kx → خ")
+   (?d . "d → د , D → ڈ")
+   (?h . "h → ہ , H → ھ , hx → ح , Hx → ۂ")
+   (?s . "s → س , c → ص , sx → ش , S → ث , cx → چ")
+   (?g . "g → گ , gx → غ")
+   (?z . "z → ز , Z → ض, zx → ذ , Zx → ظ , Y → ژ")
+   (?u . "u → ع , a → ا , A → آ , ax → أ")
+   (?A . "A → آ , a → ا ,  ax → أ , u → ع ")
+   (?e . "e → ے , y → ی , i → ئ")
+   (?y . "i → ئ , y → ی , e → ے")
+   (?R . "R → ڑ , r → ر")
+   (?N . "N → ں , n → ن")
+   (?V . "V → ؤ , v → و")
+   (?T . "T → ٹ , Tx → ۃ , t → ت, tx → ط")
+   (?q . "q → ق, k → ک , kx → خ")
+   (?D . "D → ڈ , d → د")
+   (?H . "Hx → ۂ , H → ھ , h → ہ , hx → ح")
+   (?c . "c → ص,  cx → چ , s → س , sx → ش , S → ث")
+   (?S . "S → ث , s → س , c → ص , sx → ش , cx → چ")
+   (?Z . "Z → ض, Zx → ظ , z → ز , zx → ذ , Y → ژ")
+   (?Y . "Y → ژ , Z → ض, Zx → ظ , z → ز , zx → ذ"))
+ "Intuitive transliteration keyboard layout for Urdu.
+However this input method doesn't try to follow the common romanization of Urdu
+very closely. The reason for this is allow for input efficiency. It works as
+follows:
+
+1) All lower case letters on QWERTY keyboard are translated to an urdu
+character. When more than one Urdu letter corresponds to the same Roman letter,
+the most common Urdu letter has been chosen. The frequency analysis was done
+on the basis of Urdu word list at
+https://github.com/urduhack/urdu-words/blob/master/words.txt
+As a result some of the translations are:
+h → ہ
+s → س , c → ص
+z → ز
+
+2) For the next common letter the uppercase English letter is used, e.g.
+r → ر , R → ڑ
+n → ن , N → ں
+
+3) The letter x is used for postfix completions. There are two subcases:
+3a) When more than two urdu letter map to the same roman letter,
+e.g.
+t → ت, T → ٹ , tx → ط , Tx → ۃ
+h → ہ , H → ھ , hx → ح , Hx → ۂ
+s → س , c → ص , sx → ش , S → ث , cx → چ
+z → ز , Z → ض, zx → ذ , Zx → ظ
+3b) The urdu letters that are commonly romanized by a English letter + h
+can be obtained by the same English letter + x i.e.
+gx → غ , cx → چ, kx → خ , sx → ش
+
+4) Y → ژ is somewhat of an abberation. All four of z, Z, zx and Zx which are
+used by more common letters. Y is used for ژ because it is sometimes pronounced
+close to Y for some European languages.
+
+5) o is used for prefix completion of diacrtics or اعر۱ب as well as some
+poetic and religious symbols. The most common three diacritics are mapped to
+oa → zabr (a for above)
+ob → zer  (b for below)
+oo → peesh (o for the circle in pesh)
+
+6) The poetic symbols are also available under P, while religious symbols are
+also available under M (for مزہب)."
+
+ nil t t t t nil nil nil nil nil t)
+
+;; owx
+;; BCEFGIJKLMOPQUWX
+;; sckhtgzZHT
+
+(quail-define-rules
+ ("a" ?ا)
+ ("y" ?ی)
+ ("r" ?ر)
+ ("n" ?ن)
+ ("v" ?و)
+ ("m" ?م)
+ ("t" ?ت)
+ ("l" ?ل)
+ ("k" ?ک)
+ ("b" ?ب)
+ ("d" ?د)
+ ("h" ?ہ)
+ ("s" ?س)
+ ("H" ?ھ)
+ ("p" ?پ)
+ ("N" ?ں)
+ ("g" ?گ)
+ ("sx" ?ش)
+ ("j" ?ج)
+ ("T" ?ٹ)
+ ("f" ?ف)
+ ("cx" ?چ)
+ ("z" ?ز)
+ ("u" ?ع)
+ ("q" ?ق)
+ ("kx" ?خ)
+ ("e" ?ے)
+ ("E" ?ۓ)
+ ("hx" ?ح)
+ ("i" ?ئ)
+ ("R" ?ڑ)
+ ("tx" ?ط)
+ ("c" ?ص)
+ ("D" ?ڈ)
+ ("gx" ?غ)
+ ("A" ?آ)
+ ("Z" ?ض)
+ ("V" ?ؤ)
+ ("zx" ?ذ)
+ ("S" ?ث)
+ ("Zx" ?ظ)
+ ("Hx" ?ۂ)
+ ("ix" ?ء)
+ ("Tx" ?ۃ)
+ ("Y" ?ژ)
+ ("ax" ?أ)
+ ("0"  ?۰)
+ ("1"  ?۱)
+ ("2"  ?۲)
+ ("3"  ?۳)
+ ("4"  ?۴)
+ ("5"  ?۵)
+ ("6"  ?۶)
+ ("7"  ?۷)
+ ("8"  ?۸)
+ ("9"  ?۹)
+ ("%" ?٪)
+
+ ("." ?۔)
+ ("," ?،)
+ (";"  ?؛)
+ ("?"  ?؟)
+
+ ("oa" ?َ)  ;; zabar زبر
+ ("ob" ?ِ)  ;; zer زير
+ ("oo" ?ُ)  ;; pesh پيش
+ ("oj" ?ْ)  ;; jazam جزم
+ ("oS" ?ّ)  ;; tashdid تشدید
+ ("ok" ?ٰ)  ;; khari zabar کھڑی زبر
+ ("ou" ?٘)  ;; ulti jazm الٹی جزم
+ ("os" ?؎)
+ ("om" ?؏)
+ ("ot" ?ؔ)
+ ("Ps" ?؎)
+ ("Pm" ?؏)
+ ("Pt" ?ؔ)
+ ("oS" ?ؐ)
+ ("or" ?ؒ)
+ ("oR" ?ؓ)
+ ("oA" ?ؑ)
+ ("Ms" ?ؐ)
+ ("Mr" ?ؒ)
+ ("Mz" ?ؓ)
+ ("Ma" ?ؑ))
+
+(provide 'urdu)
+;;; urdu.el ends here
-- 
2.42.0