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

From: Rahguzar <[email-masked]>
Date: Sun, 29 Oct 2023 17:27:38 +0100

Hi Eli,
  Thanks for the review. I have made the changes you asked for, please
  let me know of other changes need.

Eli Zaretskii <[email-masked]> writes:

> Thanks.  This lacks a ChangeLog-style commit log message (see
> CONTRIBUTE and "git log" for how we write those).

I have added the commit message with some help from magit. Please let me
know if changes to it are needed.

> Can you come up with a shorter mode-line indicator for this and other
> input methods?  We usually use just 1 or 2 letters for it; you used
> something much longer.

Done now, all of them are now 1 or 2 letters.

>> +(defun pakistan--define-quail-rules (rules &optional prefix package)
>> +  "Define the rules for an input method.
>
> Our style is to have the first sentence of a doc string be a summary
> of what the function does and also mention all the mandatory
> arguments.  I would suggest something like
>
>   Define rules for a Pakistan input method as determined by RULES.

Done, with a slight rewording.

>> +(defun pakistan--make-setter (&optional prefix package)
>> +  "Retrun the setter function.
>       ^^^^^^
> Typo.

Thanks, fixed now.

>> +The function add rules to PACKAGE with PREFIX."
>                 ^^^
> "adds".
>
>> +(defun pakistan--set-numeral-translations (var val)
>> +  "Add translations for digits.
>
> This should mention the arguments.

It does now but awkwardly. Maybe instead of defining this function, the
setter should be lambda?

>> +(quail-define-package
>> + "urdu-custom" "Urdu" "اردو انفر۱دی" t
>> + "Intuitive and customizable transl input method for Urdu.
>> +By default this input method doesn't try to follow the common romanization of Urdu
>> +very closely.  The reason for this is allow to for input efficiency. It works as
>> +follows:
>
> Please try not to use lines longer than 79 characters in doc strings.

I have filled the lines in the doc string with a fill column of 78.

> Thanks.

Thanks for the review,
Rahguzar

>From e2a5f5ce78f3fe0b0f8256f6f2b61412f137200f Mon Sep 17 00:00:00 2001
From: Rahguzar <[email-masked]>
Date: Sun, 29 Oct 2023 17:14:02 +0100
Subject: [PATCH] Input methods for Urdu, Pashto and Sindhi

* lisp/leim/quail/pakistan.el (quail):
("urdu-keyboard"): new input method
("urdu-phonetic-keyboard"): new input method
("urdu-custom"): new input method
("sindhi-keyboard"): new input method
("pashto-keyboard"): new input method
; (pakistan--define-quail-rules): helper function
; (pakistan--make-setter): helper function
; (pakistan--regenerate-translations): helper function
; (pakistan--set-prefixes): helper function
; (pakistan--set-numeral-translations):
(pakistan-urdu-input): new customization group
(pakistan-urdu-prefixes): new custom variable
(pakistan-urdu-translations): new custom variable
(pakistan-urdu-diacritics-and-other-symbols): new custom var
(pakistan-urdu-poetic-symbols): new custom var
(pakistan-urdu-religious-symbols): new custom var
(pakistan-extra-balochi-brahui-translations): new custom var
(pakistan-extra-pashto-translations): new custom var
(pakistan-extra-sindhi-translations): new custom var
(pakistan-extra-saraiki-hindko-translations): new custom var
(pakistan-urdu-use-roman-digits): new custom var
(pakistan): new package
---
 lisp/leim/quail/pakistan.el | 700 ++++++++++++++++++++++++++++++++++++
 1 file changed, 700 insertions(+)
 create mode 100644 lisp/leim/quail/pakistan.el

diff --git a/lisp/leim/quail/pakistan.el b/lisp/leim/quail/pakistan.el
new file mode 100644
index 00000000000..25c1c7a08b8
--- /dev/null
+++ b/lisp/leim/quail/pakistan.el
@@ -0,0 +1,700 @@
+;;; pakistan.el --- Input methods for some languages from Pakistan -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2023 Free Software Foundation, Inc.
+
+;; Author: Rahguzar <[email-masked]>
+;; Keywords: convenience, multilingual, input method, Urdu, Balochi, Pashto, Sindhi, Hindko, Brahui
+;;
+;; 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)
+
+;;;; Urdu Input Methods
+;;;;; Keyboard
+;; Layout taken from https://www.branah.com/urdu
+(quail-define-package
+ "urdu-keyboard" "Urdu" "ات" t
+ "Input method for Urdu.
+Uses keyboard layout from https://www.branah.com/urdu"
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?ط)
+ ("w" ?ص)
+ ("e" ?ھ)
+ ("r" ?د)
+ ("t" ?ٹ)
+ ("y" ?پ)
+ ("u" ?ت)
+ ("i" ?ب)
+ ("o" ?ج)
+ ("p" ?ح)
+ ("a" ?م)
+ ("s" ?و)
+ ("d" ?ر)
+ ("f" ?ن)
+ ("g" ?ل)
+ ("h" ?ہ)
+ ("j" ?ا)
+ ("k" ?ک)
+ ("l" ?ی)
+ ("z" ?ق)
+ ("x" ?ف)
+ ("c" ?ے)
+ ("v" ?س)
+ ("b" ?ش)
+ ("n" ?غ)
+ ("m" ?ع)
+ ("Q" ?ظ)
+ ("W" ?ض)
+ ("E" ?ذ)
+ ("R" ?ڈ)
+ ("T" ?ث)
+ ("Y" ?ّ)
+ ("U" ?ۃ)
+ ("I" ?ـ)
+ ("O" ?چ)
+ ("P" ?خ)
+ ("A" ?ژ)
+ ("S" ?ز)
+ ("D" ?ڑ)
+ ("F" ?ں)
+ ("G" ?ۂ)
+ ("H" ?ء)
+ ("J" ?آ)
+ ("K" ?گ)
+ ("L" ?ي)
+ ("C" ?ۓ)
+ ("B" ?ؤ)
+ ("N" ?ئ)
+ ("[" ?\])
+ ("]" ?\[)
+ ("{" ?})
+ ("}" ?{)
+ (";" ?؛)
+ ("." ?۔)
+ ("," ?،)
+ ("?" ?؟))
+
+;;;;; Phonetic Keyboard
+(quail-define-package
+ "urdu-phonetic-keyboard" "Urdu" "اص" t
+ "Input method for Urdu.
+Uses phonetic keyboard layout from https://www.branah.com/urdu"
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?ق)
+ ("w" ?و)
+ ("e" ?ع)
+ ("r" ?ر)
+ ("t" ?ت)
+ ("y" ?ے)
+ ("u" ?ء)
+ ("i" ?ی)
+ ("o" ?ہ)
+ ("p" ?پ)
+ ("a" ?ا)
+ ("s" ?س)
+ ("d" ?د)
+ ("f" ?ف)
+ ("g" ?گ)
+ ("h" ?ح)
+ ("j" ?ج)
+ ("k" ?ک)
+ ("l" ?ل)
+ ("z" ?ز)
+ ("x" ?ش)
+ ("c" ?چ)
+ ("v" ?ط)
+ ("b" ?ب)
+ ("n" ?ن)
+ ("m" ?م)
+ ("Q" ?ْ)
+ ("W" ?ٔ)
+ ("E" ?ٰ)
+ ("R" ?ڑ)
+ ("T" ?ٹ)
+ ("Y" ?َ)
+ ("U" ?ئ)
+ ("I" ?ِ)
+ ("O" ?ۃ)
+ ("P" ?ُ)
+ ("A" ?آ)
+ ("S" ?ص)
+ ("D" ?ڈ)
+ ("F" ?أ)
+ ("G" ?غ)
+ ("H" ?ھ)
+ ("J" ?ض)
+ ("K" ?خ)
+ ("L" ?ٖ)
+ ("Z" ?ذ)
+ ("X" ?ژ)
+ ("C" ?ث)
+ ("V" ?ظ)
+ ("B" ?ً)
+ ("N" ?ں)
+ ("M" ?ّ)
+ ("1" ?۱)
+ ("2" ?۲)
+ ("3" ?۳)
+ ("4" ?۴)
+ ("5" ?۵)
+ ("6" ?٦)
+ ("7" ?۷)
+ ("8" ?۸)
+ ("9" ?۹)
+ ("0" ?۰)
+ ("`" ?؏)
+ ("#" ?ؔ)
+ ("$" ?ؒ)
+ ("%" ?٪)
+ ("^" ?ؓ)
+ ("&" ?ؑ)
+ ("*" ?ؐ)
+ ("(" ?\))
+ (")" ?\()
+ ("=" ?+)
+ (";" ?؛)
+ ("\\" ?÷)
+ ("|" ?x)
+ ("," ?،)
+ ("." ?۔)
+ ("<" ?ٗ)
+ (">" ?.)
+ ("?" ?؟)
+ ("[" ?﷽)
+ ("]" ?ﷲ)
+ ("{" ?ﷺ))
+
+;;;;; Customizable Input Method
+;;;;;; Helper functions
+(defun pakistan--define-quail-rules (rules &optional prefix package)
+  "Define translations for `urdu-custom' input method as determined by RULES.
+PACKAGE determines the input method and defaults to `urdu-custom'.  RULES is
+the list of rules to define, see `quail-defrule' for details.  If non-nil
+PREFIX is a string that is prefixed to each string in RULES.  PREFIX can be a
+symbol in which case it is looked up in `pakistan-urdu-prefixes' to obtain the
+string."
+  (setq package (or package "urdu-custom"))
+  (when (and prefix (symbolp prefix))
+    (setq prefix (car (alist-get prefix pakistan-urdu-prefixes))))
+  (dolist (rule rules)
+    (quail-defrule (concat prefix (car rule)) (cadr rule) package)))
+
+(defun pakistan--make-setter (&optional prefix package)
+  "Return the setter function.
+The function adds rules to PACKAGE with PREFIX."
+  (lambda (var val)
+    (set-default-toplevel-value var val)
+    (pakistan--define-quail-rules val prefix package)
+    (when (equal current-input-method (quail-name))
+      (activate-input-method current-input-method))))
+
+(defun pakistan--regenerate-translations ()
+  "Regenerate the translations for urdu-custom input method."
+  (quail-install-map '(nil) "urdu-custom")
+  (pakistan--define-quail-rules pakistan-urdu-translations)
+  (pakistan--define-quail-rules
+   pakistan-urdu-diacritics-and-other-symbols 'diacritics)
+  (pakistan--define-quail-rules pakistan-urdu-poetic-symbols 'poetic)
+  (pakistan--define-quail-rules pakistan-urdu-religious-symbols 'religious)
+  (pakistan--define-quail-rules pakistan-extra-balochi-translations 'balochi-brahui)
+  (pakistan--define-quail-rules pakistan-extra-pashto-translations 'pashto)
+  (pakistan--define-quail-rules pakistan-extra-saraiki-translations 'saraiki-hindko)
+  (pakistan--define-quail-rules pakistan-extra-sindhi-translations 'sindhi))
+
+(defun pakistan--set-prefixes (var val)
+  "Setter function for `pakistan-urdu-prefixes'.
+VAR should be `pakistan-urdu-prefixes' and VAL is value to be set."
+  (set-default-toplevel-value var val)
+  (when (boundp 'pakistan-urdu-translations)
+    (pakistan--regenerate-translations)))
+
+(defun pakistan--set-numeral-translations (var val)
+  "VAR should be `pakistan-urdu-use-roman-digits' and VAL its value.
+This is a setter function for the custom-variable."
+  (set-default-toplevel-value var val)
+  (if val
+      (pakistan--regenerate-translations)
+    (pakistan--define-quail-rules
+     '(("0"  ?۰)
+       ("1"  ?۱)
+       ("2"  ?۲)
+       ("3"  ?۳)
+       ("4"  ?۴)
+       ("5"  ?۵)
+       ("6"  ?۶)
+       ("7"  ?۷)
+       ("8"  ?۸)
+       ("9"  ?۹)
+       ("%" ?٪)))))
+
+;;;;;; Package definition
+(quail-define-package
+ "urdu-custom" "Urdu" "اا" t
+ "Intuitive and customizable transl input method for Urdu.
+By default this input method doesn't try to follow the common romanization of
+Urdu very closely.  The reason for this is allow to 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.
+
+These translations can be changed by customizing `pakistan-urdu-translations'.
+
+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 → pesh (o for the circle in pesh)
+
+6) The poetic symbols are also available under G (for غزل), while religious
+symbols are also available under M (for مزہب).
+
+7) Characters from Balochi, Brahui Pashto, Saraiki and Sindhi which are not
+part of Urdu alphabet can also be input.  Each set of these sets correspond to
+a different prefixes. See `pakistan-urdu-prefixes' for the prefixes.
+
+The translations and the prefixes described above can be customized. Various
+customization options can be found under the customization group
+`pakistan-urdu-input'."
+ nil t t t t nil nil nil nil nil t)
+
+;;;;;; Customizations
+(defgroup pakistan-urdu-input nil
+  "Customization group for Urdu input methods."
+  :group 'quail)
+
+(defcustom pakistan-urdu-prefixes
+  '((diacritics "o")
+    (poetic "G")
+    (religious "M")
+    (balochi-brahui "B")
+    (pashto "P")
+    (sindhi "C")
+    (saraiki-hindko "X"))
+  "Prefixes for `urdu-custom' input method."
+  :set #'pakistan--set-prefixes
+  :type '(repeat (list symbol string))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-translations
+  '(("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" ?أ)
+    ("." ?۔)
+    ("," ?،)
+    (";"  ?؛)
+    ("?"  ?؟))
+  "Translations for Urdu characters and common punctuations."
+  :set (pakistan--make-setter)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-diacritics-and-other-symbols
+  '(("a" ?َ)  ;; zabar زبر
+    ("b" ?ِ)  ;; zer زير
+    ("o" ?ُ)  ;; pesh پيش
+    ("j" ?ْ)  ;; jazam جزم
+    ("S" ?ّ)  ;; tashdid تشدید
+    ("k" ?ٰ)  ;; khari zabar کھڑی زبر
+    ("u" ?٘)  ;; ulti jazm الٹی جزم
+    ("s" ?؎)
+    ("m" ?؏)
+    ("t" ?ؔ)
+    ("c" ?ؐ)
+    ("r" ?ؒ)
+    ("R" ?ؓ)
+    ("A" ?ؑ))
+  "Translations to input Urdu diacrtics.
+These are available under the prefix specified in `pakistan-urdu-prefixes'."
+  :set (pakistan--make-setter 'diacritics)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-poetic-symbols
+  '(("s" ?؎)
+    ("m" ?؏)
+    ("t" ?ؔ))
+  "Translation to input Urdu peotic symbols.
+These are available under the prefix specified in `pakistan-urdu-prefixes'."
+  :set (pakistan--make-setter 'poetic)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-religious-symbols
+  '(("s" ?ؐ)
+    ("r" ?ؒ)
+    ("R" ?ؓ)
+    ("a" ?ؑ)
+    ("A" ?ﷲ)
+    ("S" ?ﷺ))
+  "Translation to input Urdu peotic symbols.
+These are available under the prefix specified in `pakistan-urdu-prefixes'."
+  :set (pakistan--make-setter 'religious)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+;; I don't understand how many of these letters are pronounced.
+;; So better translations are welcome.
+(defcustom pakistan-extra-balochi-brahui-translations
+  '(("v" ?ۏ)
+    ("y" ?ݔ)
+;; Brahui
+   ("l" ?ڷ))
+  "Translations to input Balochi and Brahui letters not found in Urdu.
+These are available under the prefix specified in `pakistan-urdu-prefixes'."
+  :set (pakistan--make-setter 'balochi-brahui)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-extra-pashto-translations
+  '(("t" ?ټ)
+    ("d" ?ډ)
+    ("r" ?ړ)
+    ("n" ?ڼ)
+    ("s" ?ښ)
+    ("R" ?ږ)
+    ("h" ?څ)
+    ("H" ?ځ))
+  "Translations to input Pashto letters not found in Urdu.
+These are available under the prefix specified in `pakistan-urdu-prefixes'."
+  :set (pakistan--make-setter 'pashto)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-extra-sindhi-translations
+  '(("k" ?ڪ)
+    ("j" ?ڄ)
+    ("t" ?ٺ)
+    ("T" ?ٽ)
+    ("tx" ?ٿ)
+    ("b" ?ٻ)
+    ("B" ?ڀ)
+    ("r" ?ڙ)
+    ("d" ?ڌ)
+    ("D" ?ڏ)
+    ("dx" ?ڊ)
+    ("Dx" ?ڍ)
+    ("h" ?ڃ)
+    ("c" ?ڇ)
+    ("p" ?ڦ)
+    ("n" ?ڻ)
+    ("g" ?ڳ)
+    ("G" ?ڱ))
+  "Translations to input Sindhi letters not found in Urdu.
+These are available under the prefix specified in `pakistan-urdu-prefixes'."
+  :set (pakistan--make-setter 'sindhi)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-extra-saraiki-hindko-translations
+  '(("b" ?ٻ)
+    ("h" ?ڄ)
+    ("g" ?ڳ)
+    ("d" ?ݙ)
+    ("n" ?ݨ)
+;; Hindko
+    ("r" ?ݬ)
+    ("v" ?ڨ)
+    ("N" ?ݩ)
+    ("V" ?ٷ))
+"Translations to input Saraiki letters not found in Urdu.
+These are available under the prefix specified in `pakistan-urdu-prefixes'."
+  :set (pakistan--make-setter 'saraiki-hindko)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-use-roman-digits
+  nil
+  "Whether urdu-custom input method should use roman digits."
+  :set #'pakistan--set-numeral-translations
+  :type 'boolean
+  :group 'pakistan-urdu-input)
+
+;;;; Sindhi Input Methods
+;;;;; Keyboard
+;; Layout taken from https://www.branah.com/sindhi
+(quail-define-package
+ "sindhi-keyboard" "Sindhi" "سِ" t
+ "Input method for Sindhi.
+Uses keyboard layout from https://www.branah.com/sindhi ."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?ق)
+ ("w" ?ص)
+ ("e" ?ي)
+ ("r" ?ر)
+ ("t" ?ت)
+ ("y" ?ٿ)
+ ("u" ?ع)
+ ("i" ?ڳ)
+ ("o" ?و)
+ ("p" ?پ)
+ ("a" ?ا)
+ ("s" ?س)
+ ("d" ?د)
+ ("f" ?ف)
+ ("g" ?گ)
+ ("h" ?ه)
+ ("j" ?ج)
+ ("k" ?ڪ)
+ ("l" ?ل)
+ ("z" ?ز)
+ ("x" ?خ)
+ ("c" ?ط)
+ ("v" ?ڀ)
+ ("b" ?ب)
+ ("n" ?ن)
+ ("m" ?م)
+ ("Q" ?َ)
+ ("W" ?ض)
+ ("E" ?ِ)
+ ("R" ?ڙ)
+ ("T" ?ٽ)
+ ("Y" ?ث)
+ ("U" ?غ)
+ ("I" ?ھ)
+ ("O" ?ُ)
+ ("P" ?ڦ)
+ ("A" ?آ)
+ ("S" ?ش)
+ ("D" ?ڊ)
+ ("F" ?ڦ)
+ ("G" ?ً)
+ ("H" ?ح)
+ ("J" ?ٍ)
+ ("K" ?ۡ)
+ ("L" ?:)
+ ("Z" ?ذ)
+ ("X" ?ّ)
+ ("C" ?ظ)
+ ("V" ?ء)
+ ("B" ?ٻ)
+ ("N" ?ڻ)
+ ("M" ?۾)
+ ("1" ?۱)
+ ("2" ?۲)
+ ("3" ?۳)
+ ("4" ?۴)
+ ("5" ?۵)
+ ("6" ?٦)
+ ("7" ?۷)
+ ("8" ?۸)
+ ("9" ?۹)
+ ("0" ?۰)
+ ("`" ?’)
+ ("-" ?ڏ)
+ ("=" ?ڌ)
+ ("~" ?‘)
+ ("@" ?ى)
+ ("#" ?ؔ)
+ ("$" ?ؒ)
+ ("%" ?٪)
+ ("^" ?ؓ)
+ ("&" ?۽)
+ ("*" ?ؤ)
+ ("(" ?\))
+ (")" ?\()
+ ("[" ?ڇ)
+ ("]" ?چ)
+ ("{" ?ڃ)
+ ("}" ?ڄ)
+ (";" ?ک)
+ ("'" ?ڱ)
+ ("\\" ?ڍ)
+ (":" ?؛)
+ ("|" ?ٺ)
+ ("," ?،)
+ ("/" ?ئ)
+ ("<" ?“)
+ (">" ?”)
+ ("?" ?؟))
+
+
+;;;; Pashto Input Methods
+;;;;; Keyboard
+(quail-define-package
+ "pashto-keyboard" "Pashto" "پ" t
+ "Input method for Pashto.
+Uses keyboard layout from https://www.branah.com/pashto ."
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?ض)
+ ("w" ?ص)
+ ("e" ?ث)
+ ("r" ?ق)
+ ("t" ?ف)
+ ("y" ?غ)
+ ("u" ?ع)
+ ("i" ?ه)
+ ("o" ?خ)
+ ("p" ?ح)
+ ("a" ?ش)
+ ("s" ?س)
+ ("d" ?ی)
+ ("f" ?ب)
+ ("g" ?ل)
+ ("h" ?ا)
+ ("j" ?ت)
+ ("k" ?ن)
+ ("l" ?م)
+ ("z" ?ۍ)
+ ("x" ?ې)
+ ("c" ?ز)
+ ("v" ?ر)
+ ("b" ?ذ)
+ ("n" ?د)
+ ("m" ?ړ)
+ ("Q" ?ْ)
+ ("W" ?ٌ)
+ ("E" ?ٍ)
+ ("R" ?ً)
+ ("T" ?ُ)
+ ("Y" ?ِ)
+ ("U" ?َ)
+ ("I" ?ّ)
+ ("O" ?څ)
+ ("P" ?ځ)
+ ("A" ?ښ)
+ ("S" ?ﺉ)
+ ("D" ?ي)
+ ("F" ?پ)
+ ("G" ?أ)
+ ("H" ?آ)
+ ("J" ?ټ)
+ ("K" ?ڼ)
+ ("L" ?ة)
+ ("Z" ?ظ)
+ ("X" ?ط)
+ ("C" ?ژ)
+ ("V" ?ء)
+ ("B" ?‌)
+ ("N" ?ډ)
+ ("M" ?ؤ)
+ ("1" ?۱)
+ ("2" ?۲)
+ ("3" ?۳)
+ ("4" ?۴)
+ ("5" ?۵)
+ ("6" ?۶)
+ ("7" ?۷)
+ ("8" ?۸)
+ ("9" ?۹)
+ ("0" ?۰)
+ ("`" ?‍)
+ ("~" ?÷)
+ ("@" ?٬)
+ ("#" ?٫)
+ ("%" ?٪)
+ ("^" ?×)
+ ("&" ?«)
+ ("*" ?»)
+ ("_" ?ـ)
+ ("[" ?ج)
+ ("]" ?چ)
+ ("{" ?\[)
+ ("}" ?\])
+ (";" ?ک)
+ ("'" ?ګ)
+ ("\"" ?؛)
+ ("|" ?٭)
+ ("," ?و)
+ ("." ?ږ)
+ ("<" ?،)
+ (">" ?.)
+ ("?" ?؟))
+
+;;; End Matter
+(provide 'pakistan)
+;;; pakistan.el ends here
-- 
2.42.0