changeset 89296:5f226da850bf

Register combining characters in composition-function-table. (diacritic-composition-function): Change arguments to conform to composition-function-table.
author Kenichi Handa <handa@m17n.org>
date Thu, 07 Nov 2002 06:29:59 +0000
parents ea8374ccb41f
children 4a475cc23487
files lisp/language/european.el
diffstat 1 files changed, 85 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/language/european.el	Thu Nov 07 06:29:31 2002 +0000
+++ b/lisp/language/european.el	Thu Nov 07 06:29:59 2002 +0000
@@ -563,7 +563,48 @@
   :mnemonic ?*
   :charset-list '(adobe-standard-encoding)
   :mime-charset 'adobe-standard-encoding)
+
 
+;; For automatic composing of diacritics and combining marks.
+(dolist (range '( ;; combining diacritical marks
+		 (#x0300 #x0314 (tc . bc))
+		 (#x0315	(tr . bl))
+		 (#x0316 #x0319 (bc . tc))
+		 (#x031A	(tr . cl))
+		 (#x031B #x0320 (bc . tc))
+		 (#x0321	(Br . tr))
+		 (#x0322	(Br . tl))
+		 (#x0323 #x0333 (bc . tc))
+		 (#x0334 #x0338 (Bc . Bc))
+		 (#x0339 #x033C (bc . tc))
+		 (#x033D #x033F (tc . bc))
+		 (#x0340	(tl . bc))
+		 (#x0341	(tr . bc))
+		 (#x0342 #x0344 (tc . bc))
+		 (#x0345	(bc . tc))
+		 (#x0346	(tc . bc))
+		 (#x0347 #x0349 (bc . tc))
+		 (#x034A #x034C (tc . bc))
+		 (#x034D #x034E (bc . tc))
+		 ;; combining diacritical marks for symbols
+		 (#x20D0 #x20D1 (tc . bc))
+		 (#x20D2 #x20D3 (Bc . Bc))
+		 (#x20D4 #x20D7 (tc . bc))
+		 (#x20D8 #x20DA (Bc . Bc))
+		 (#x20DB #x20DC (tc . bc))
+		 (#x20DD #x20E0 (Bc . Bc))
+		 (#x20E1	(tc . bc))
+		 (#x20E2 #x20E3 (Bc . Bc))))
+  (let* ((from (car range))
+	 (to (if (= (length range) 3)
+		 (nth 1 range)
+	       from))
+	 (composition (car (last range))))
+    (while (<= from to)
+      (put-char-code-property from 'diacritic-composition composition)
+      (aset composition-function-table from 'diacritic-composition-function)
+      (setq from (1+ from)))))
+
 (defconst diacritic-composition-pattern "\\C^\\c^+")
 
 (defun diacritic-compose-region (beg end)
@@ -594,30 +635,52 @@
   (diacritic-compose-region (point) (+ (point) len))
   len)
 
-(defun diacritic-composition-function (from to pattern &optional string)
-  "Compose diacritic text in the region FROM and TO.
-The text matches the regular expression PATTERN.
-Optional 4th argument STRING, if non-nil, is a string containing text
+(defun diacritic-composition-function (pos &optional string)
+  "Compose diacritic text around POS.
+Optional 2nd argument STRING, if non-nil, is a string containing text
 to compose.
 
-The return value is number of composed characters."
-  (if (< (1+ from) to)
-      (prog1 (- to from)
-	(if string
-	    (compose-string string from to)
-	  (compose-region from to))
-	(- to from))))
-
-;; Register a function to compose Unicode diacrtics and marks.
-(let ((patterns '(("\\C^\\c^+" . diacritic-composition-function))))
-  (let ((c #x300))
-    (while (<= c #x362)
-      (aset composition-function-table c patterns)
-      (setq c (1+ c)))
-    (setq c #x20d0)
-    (while (<= c #x20e3)
-      (aset composition-function-table c patterns)
-      (setq c (1+ c)))))
+The return value is the end position of composed characters,
+or nil if no characters are composed."
+  (setq pos (1- pos))
+  (if string
+      (let ((ch (aref string pos))
+	    start end components ch composition)
+	(when (and (>= pos 0)
+		   ;; Previous character is latin.
+		   (aref (char-category-set ch) ?l)
+		   (/= ch 32))
+	  (setq start pos
+		end (length string)
+		components (list ch)
+		pos (1+ pos))
+	  (while (and
+		  (< pos end)
+		  (setq ch (aref string pos)
+			composition
+			(get-char-code-property ch 'diacritic-composition)))
+	    (setq components (cons ch (cons composition components))
+		  pos (1+ pos)))
+	  (compose-string string start pos (nreverse components))
+	  pos))
+    (let ((ch (char-after pos))
+	  start end components composition)
+      (when (and (>= pos (point-min))
+		 (aref (char-category-set ch) ?l)
+		 (/= ch 32))
+	(setq start pos
+	      end (point-max)
+	      components (list ch)
+	      pos (1+ pos))
+	(while (and
+		(< pos end)
+		(setq ch (char-after pos)
+		      composition
+		      (get-char-code-property ch 'diacritic-composition)))
+	  (setq components (cons ch (cons composition components))
+		pos (1+ pos)))
+	(compose-region start pos (nreverse components))
+	pos))))
 
 (provide 'european)