--- /dev/null
+;; vi-base.mim -- Provide bases for Vietnamese Input method
+;; Copyright (C) 2008
+;; National Institute of Advanced Industrial Science and Technology (AIST)
+;; Registration Number H15PRO112
+
+;; This file is part of the m17n database; a sub-part of the m17n
+;; library.
+
+;; The m17n library is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU Lesser General Public License
+;; as published by the Free Software Foundation; either version 2.1 of
+;; the License, or (at your option) any later version.
+
+;; The m17n library 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
+;; Lesser General Public License for more details.
+
+;; You should have received a copy of the GNU Lesser General Public
+;; License along with the m17n library; if not, write to the Free
+;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+(input-method t nil vi-base)
+
+(description "Provide bases for Vietnamese input methods.
+This is acutually not a standalone input method, but is expected
+to be included in the other Vietnamese input method (e.g. vi-telex, vi-vni).
+")
+
+(description (_"Vietnames input method using the TELEX key sequence.
+Typing Backslash ('\\') toggles the normal mode and English mode.
+The following variables are customizable:
+ tone-mark-on-last: control tone mark position in equivocal cases
+ backspace-is-undo: control the action of Backspace key (delete or undo)"))
+
+;;; Usage of variables:
+;;; M (mark): point after the last vowel
+;;; T (mark): point after the tone-mark-attached vowel
+;;; TPLACE: On which vowel a tone is attached (0:none, 1:1st, 2:2nd, or 3:3rd)
+;;; C: The initial consonant
+;;; V-1: The last vowel
+;;; V-2: The second from the last vowel (or 0 if there aren't two vowels)
+;;; V-3: The third from the last vowel (or 0 if there aren't three vowels)
+;;; C-AFTER-V: Number of the final consonants
+;;; SELECT: Which tone is selected
+
+(macro
+ (handle-mark
+ ;; At first, cancel the tone mark if already put.
+ (move T) (select 0)
+ (move M)
+ (cond (V-3
+ ;; Tripple-vowel
+ ;; Put a tone mark on the last vowel if it is ê, or ơ.
+ ;; Otherwise put a tone mark on the second vowel.
+ (cond ((| (= V-1 ?ê) (= V-1 ?ơ) (= V-1 ?Ê) (= V-1 ?Ơ))
+ (set TPLACE 3))
+ (1 (move @-) (set TPLACE 2))))
+ (V-2
+ ;; Double-vowel
+ ;; Put a tone mark on the last vowel in the following cases:
+ ;; * The last vowel is â, ă, ê, ô, ơ, ư, or ư (i.e. non-ASCII).
+ ;; * The initial consonant and the first vowel is "gi" or "qu".
+ ;; * tone-mark-on-last is customized to 1 in such equivocal
+ ;; cases as "oa", "oe", "oo", and "uy".
+ ;; Otherwise put a tone mark on the first vowel.
+ (cond ((| (> V-1 127)
+ (& (| (= C ?g) (= C ?G)) (| (= V-2 ?i) (= V-2 ?I)))
+ (& (| (= C ?q) (= C ?Q)) (| (= V-2 ?u) (= V-2 ?U)))
+ (& (| tone-mark-on-last (> C-AFTER-V 0))
+ (| (& (| (= V-2 ?o) (= V-2 ?O))
+ (| (= V-1 ?a) (= V-1 ?A) (= V-1 ?e) (= V-1 ?E)
+ (= V-1 ?o) (= V-1 ?O)))
+ (& (| (= V-2 ?u) (= V-2 ?U))
+ (| (= V-1 ?y) (= V-1 ?Y))))))
+ (set TPLACE 2))
+ (1 (move @-) (set TPLACE 1))))
+ (1 (set TPLACE 1)))
+ (select SELECT)
+ (mark T)
+ (move @>)))
+
+(map
+ ;; These must be defined in each input method.
+ ;; (vowel-ext)
+ ;; (consonant-ext)
+ ;; (tone-mark)
+ ;; (consonant-or-tone-mark)
+ ;; (temporary-escape)
+
+ (vowel
+ ("a" ("aáàảãạ")) ("A" ("AÁÀẢÃẠ"))
+ ("e" ("eéèẻẽẹ")) ("E" ("EÉÈẺẼẸ"))
+ ("i" ("iíìỉĩị")) ("I" ("IÍÌỈĨỊ"))
+ ("o" ("oóòỏõọ")) ("O" ("OÓÒỎÕỌ"))
+ ("u" ("uúùủũụ")) ("U" ("UÚÙỦŨỤ"))
+ ("y" ("yýỳỷỹỵ")) ("Y" ("YÝỲỶỸỴ")))
+
+ (consonant
+ ("b" ?b) ("c" ?c) ("d" ?d) ("g" ?g) ("h" ?h) ("k" ?k) ("l" ?l) ("m" ?m)
+ ("n" ?n) ("p" ?p) ("q" ?q) ("t" ?t) ("v" ?v)
+ ("B" ?B) ("C" ?C) ("D" ?D) ("G" ?G) ("H" ?H) ("K" ?K) ("L" ?L) ("M" ?M)
+ ("N" ?N) ("P" ?P) ("Q" ?Q) ("T" ?T) ("V" ?V))
+
+ (alnum
+ ("a" ?a) ("b" ?b) ("c" ?c) ("d" ?d) ("e" ?e) ("f" ?f) ("g" ?g)
+ ("h" ?h) ("i" ?i) ("j" ?j) ("k" ?k) ("l" ?l) ("m" ?m) ("n" ?n)
+ ("o" ?o) ("p" ?p) ("q" ?q) ("r" ?r) ("s" ?s) ("t" ?t) ("u" ?u)
+ ("v" ?v) ("w" ?w) ("x" ?x) ("y" ?y) ("z" ?z)
+ ("A" ?A) ("B" ?B) ("C" ?C) ("D" ?D) ("E" ?E) ("F" ?F) ("G" ?G)
+ ("H" ?H) ("I" ?I) ("J" ?J) ("K" ?K) ("L" ?L) ("M" ?M) ("N" ?N)
+ ("O" ?O) ("P" ?P) ("Q" ?Q) ("R" ?R) ("S" ?S) ("T" ?T) ("U" ?U)
+ ("V" ?V) ("W" ?W) ("X" ?X) ("Y" ?Y) ("Z" ?Z)
+ ("0" ?0) ("1" ?1) ("2" ?2) ("3" ?3) ("4" ?4)
+ ("5" ?5) ("6" ?6) ("7" ?7) ("8" ?8) ("9" ?9))
+
+ (permanent-escape
+ ("\\"))
+
+ (backspace
+ ((BackSpace) (cond (backspace-is-undo (undo))))))
+
+;; Local Variables:
+;; coding: utf-8
+;; mode: emacs-lisp
+;; End: