annotate lisp/mule/mule-composite.el @ 778:2923009caf47

[xemacs-hg @ 2002-03-16 10:38:59 by ben] cm.c, file-coding.c: fix warnings. .cvsignore: Those pesky *.tmp files. mule\arabic.el, mule\canna-leim.el, mule\china-util.el, mule\chinese.el, mule\cyril-util.el, mule\cyrillic.el, mule\devan-util.el, mule\devanagari.el, mule\english.el, mule\ethio-util.el, mule\ethiopic.el, mule\european.el, mule\greek.el, mule\hebrew.el, mule\indian.el, mule\japan-util.el, mule\japanese.el, mule\korea-util.el, mule\korean.el, mule\lao-util.el, mule\lao.el, mule\misc-lang.el, mule\mule-charset.el, mule\mule-cmds.el, mule\thai-util.el, mule\thai.el, mule\tibet-util.el, mule\tibetan.el, mule\viet-util.el, mule\vietnamese.el, unicode.el: Fix lots of warnings. Sync up some files to FSF 21.1. Copy over all charset definitions from FSF 21.1, convert them to our format, and stick them in the relevant files. Eventually we will actually be able to dump these files (though they may not quite work). autoload.el: Support defun*, defmacro*. mule/mule-composite.el, mule/mule-composite-stub.el: New file, stubs for nonexistent composition funs/vars. mule/viet-chars.el, dumped-lisp.el: Account for these changes. font.el, mouse.el, msw-font-menu.el, printer.el, startup.el: fix warnings.
author ben
date Sat, 16 Mar 2002 10:39:19 +0000
parents
children 308d34e9f07d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
1 ;;; mule-composite.el --- support character composition
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
2
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
3 ;; Copyright (C) 1999 Electrotechnical Laboratory, JAPAN.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
4 ;; Licensed to the Free Software Foundation.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
5
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
6 ;; Keywords: mule, multilingual, character composition
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
7
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
9
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
13 ;; any later version.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
14
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
18 ;; GNU General Public License for more details.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
19
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
23 ;; Boston, MA 02111-1307, USA.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
24
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
25 ;;; Synched up with: Emacs 21.1 (lisp/composite.el).
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
26
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
27 ;;; Commentary:
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
28
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
29 ;;; Code:
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
30
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
31 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
32 (defconst reference-point-alist
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
33 '((tl . 0) (tc . 1) (tr . 2)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
34 (Bl . 3) (Bc . 4) (Br . 5)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
35 (bl . 6) (bc . 7) (br . 8)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
36 (cl . 9) (cc . 10) (cr . 11)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
37 (top-left . 0) (top-center . 1) (top-right . 2)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
38 (base-left . 3) (base-center . 4) (base-right . 5)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
39 (bottom-left . 6) (bottom-center . 7) (bottom-right . 8)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
40 (center-left . 9) (center-center . 10) (center-right . 11)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
41 ;; For backward compatibility...
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
42 (ml . 3) (mc . 10) (mr . 5)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
43 (mid-left . 3) (mid-center . 10) (mid-right . 5))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
44 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
45 Alist of symbols vs integer codes of glyph reference points.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
46 A glyph reference point symbol is to be used to specify a composition
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
47 rule in COMPONENTS argument to such functions as `compose-region' and
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
48 `make-composition'.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
49
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
50 Meanings of glyph reference point codes are as follows:
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
51
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
52 0----1----2 <---- ascent 0:tl or top-left
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
53 | | 1:tc or top-center
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
54 | | 2:tr or top-right
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
55 | | 3:Bl or base-left 9:cl or center-left
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
56 9 10 11 <---- center 4:Bc or base-center 10:cc or center-center
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
57 | | 5:Br or base-right 11:cr or center-right
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
58 --3----4----5-- <-- baseline 6:bl or bottom-left
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
59 | | 7:bc or bottom-center
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
60 6----7----8 <---- descent 8:br or bottom-right
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
61
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
62 Glyph reference point symbols are to be used to specify composition
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
63 rule of the form \(GLOBAL-REF-POINT . NEW-REF-POINT), where
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
64 GLOBAL-REF-POINT is a reference point in the overall glyphs already
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
65 composed, and NEW-REF-POINT is a reference point in the new glyph to
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
66 be added.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
67
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
68 For instance, if GLOBAL-REF-POINT is `br' (bottom-right) and
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
69 NEW-REF-POINT is `tc' (top-center), the overall glyph is updated as
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
70 follows (the point `*' corresponds to both reference points):
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
71
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
72 +-------+--+ <--- new ascent
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
73 | | |
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
74 | global| |
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
75 | glyph | |
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
76 -- | | |-- <--- baseline \(doesn't change)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
77 +----+--*--+
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
78 | | new |
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
79 | |glyph|
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
80 +----+-----+ <--- new descent
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
81 ")
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
82
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
83 ;; Encode composition rule RULE into an integer value. RULE is a cons
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
84 ;; of global and new reference point symbols.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
85 ;; This must be compatible with C macro COMPOSITION_ENCODE_RULE
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
86 ;; defined in mule-composite.h.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
87
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
88 (defun encode-composition-rule (rule)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
89 (if (and (integerp rule) (< rule 144))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
90 ;; Already encoded.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
91 rule
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
92 (or (consp rule)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
93 (error "Invalid composition rule: %S" rule))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
94 (let ((gref (car rule))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
95 (nref (cdr rule)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
96 (or (integerp gref)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
97 (setq gref (cdr (assq gref reference-point-alist))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
98 (or (integerp nref)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
99 (setq nref (cdr (assq nref reference-point-alist))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
100 (or (and (>= gref 0) (< gref 12) (>= nref 0) (< nref 12))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
101 (error "Invalid composition rule: %S" rule))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
102 (+ (* gref 12) nref))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
103
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
104 ;; Decode encoded composition rule RULE-CODE. The value is a cons of
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
105 ;; global and new reference point symbols.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
106 ;; This must be compatible with C macro COMPOSITION_DECODE_RULE
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
107 ;; defined in mule-composite.h.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
108
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
109 (defun decode-composition-rule (rule-code)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
110 (or (and (natnump rule-code) (< rule-code 144))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
111 (error "Invalid encoded composition rule: %S" rule-code))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
112 (let ((gref (car (rassq (/ rule-code 12) reference-point-alist)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
113 (nref (car (rassq (% rule-code 12) reference-point-alist))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
114 (or (and gref (symbolp gref) nref (symbolp nref))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
115 (error "Invalid composition rule code: %S" rule-code))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
116 (cons gref nref)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
117
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
118 ;; Encode composition rules in composition components COMPONENTS. The
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
119 ;; value is a copy of COMPONENTS, where composition rules (cons of
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
120 ;; global and new glyph reference point symbols) are replaced with
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
121 ;; encoded composition rules. Optional 2nd argument NOCOPY non-nil
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
122 ;; means don't make a copy but modify COMPONENTS directly.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
123
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
124 (defun encode-composition-components (components &optional nocopy)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
125 (or nocopy
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
126 (setq components (copy-sequence components)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
127 (if (vectorp components)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
128 (let ((len (length components))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
129 (i 1))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
130 (while (< i len)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
131 (aset components i
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
132 (encode-composition-rule (aref components i)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
133 (setq i (+ i 2))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
134 (let ((tail (cdr components)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
135 (while tail
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
136 (setcar tail
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
137 (encode-composition-rule (car tail)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
138 (setq tail (nthcdr 2 tail)))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
139 components)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
140
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
141 ;; Decode composition rule codes in composition components COMPONENTS.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
142 ;; The value is a copy of COMPONENTS, where composition rule codes are
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
143 ;; replaced with composition rules (cons of global and new glyph
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
144 ;; reference point symbols). Optional 2nd argument NOCOPY non-nil
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
145 ;; means don't make a copy but modify COMPONENTS directly.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
146 ;; It is assumed that COMPONENTS is a vector and is for rule-base
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
147 ;; composition, thus (2N+1)th elements are rule codes.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
148
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
149 (defun decode-composition-components (components &optional nocopy)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
150 (or nocopy
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
151 (setq components (copy-sequence components)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
152 (let ((len (length components))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
153 (i 1))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
154 (while (< i len)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
155 (aset components i
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
156 (decode-composition-rule (aref components i)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
157 (setq i (+ i 2))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
158 components)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
159
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
160 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
161 (defun compose-region (start end &optional components modification-func)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
162 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
163 Compose characters in the current region.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
164
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
165 When called from a program, expects these four arguments.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
166
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
167 First two arguments START and END are positions (integers or markers)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
168 specifying the region.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
169
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
170 Optional 3rd argument COMPONENTS, if non-nil, is a character or a
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
171 sequence (vector, list, or string) of integers.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
172
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
173 If it is a character, it is an alternate character to display instead
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
174 of the text in the region.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
175
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
176 If it is a string, the elements are alternate characters.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
177
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
178 If it is a vector or list, it is a sequence of alternate characters and
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
179 composition rules, where (2N)th elements are characters and (2N+1)th
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
180 elements are composition rules to specify how to compose (2N+2)th
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
181 elements with previously composed N glyphs.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
182
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
183 A composition rule is a cons of global and new glyph reference point
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
184 symbols. See the documentation of `reference-point-alist' for more
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
185 detail.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
186
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
187 Optional 4th argument MODIFICATION-FUNC is a function to call to
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
188 adjust the composition when it gets invalid because of a change of
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
189 text in the composition."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
190 (interactive "r")
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
191 (let ((modified-p (buffer-modified-p))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
192 (buffer-read-only nil))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
193 (if (or (vectorp components) (listp components))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
194 (setq components (encode-composition-components components)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
195 (compose-region-internal start end components modification-func)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
196 (set-buffer-modified-p modified-p)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
197
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
198 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
199 (defun decompose-region (start end)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
200 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
201 Decompose text in the current region.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
202
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
203 When called from a program, expects two arguments,
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
204 positions (integers or markers) specifying the region."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
205 (interactive "r")
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
206 (let ((modified-p (buffer-modified-p))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
207 (buffer-read-only nil))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
208 (remove-text-properties start end '(composition nil))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
209 (set-buffer-modified-p modified-p)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
210
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
211 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
212 (defun compose-string (string &optional start end components modification-func)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
213 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
214 Compose characters in string STRING.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
215
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
216 The return value is STRING where `composition' property is put on all
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
217 the characters in it.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
218
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
219 Optional 2nd and 3rd arguments START and END specify the range of
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
220 STRING to be composed. They defaults to the beginning and the end of
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
221 STRING respectively.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
222
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
223 Optional 4th argument COMPONENTS, if non-nil, is a character or a
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
224 sequence (vector, list, or string) of integers. See the function
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
225 `compose-region' for more detail.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
226
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
227 Optional 5th argument MODIFICATION-FUNC is a function to call to
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
228 adjust the composition when it gets invalid because of a change of
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
229 text in the composition."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
230 (if (or (vectorp components) (listp components))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
231 (setq components (encode-composition-components components)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
232 (or start (setq start 0))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
233 (or end (setq end (length string)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
234 (compose-string-internal string start end components modification-func)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
235 string)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
236
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
237 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
238 (defun decompose-string (string)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
239 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
240 Return STRING where `composition' property is removed."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
241 (remove-text-properties 0 (length string) '(composition nil) string)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
242 string)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
243
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
244 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
245 (defun compose-chars (&rest args)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
246 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
247 Return a string from arguments in which all characters are composed.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
248 For relative composition, arguments are characters.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
249 For rule-based composition, Mth \(where M is odd) arguments are
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
250 characters, and Nth \(where N is even) arguments are composition rules.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
251 A composition rule is a cons of glyph reference points of the form
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
252 \(GLOBAL-REF-POINT . NEW-REF-POINT). See the documentation of
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
253 `reference-point-alist' for more detail."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
254 (let (str components)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
255 (if (consp (car (cdr args)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
256 ;; Rule-base composition.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
257 (let (;(len (length args))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
258 (tail (encode-composition-components args 'nocopy)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
259
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
260 (while tail
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
261 (setq str (cons (car tail) str))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
262 (setq tail (nthcdr 2 tail)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
263 (setq str (concat (nreverse str))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
264 components args))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
265 ;; Relative composition.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
266 (setq str (concat args)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
267 (compose-string-internal str 0 (length str) components)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
268
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
269 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
270 (defun find-composition (pos &optional limit string detail-p)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
271 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
272 Return information about a composition at or nearest to buffer position POS.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
273
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
274 If the character at POS has `composition' property, the value is a list
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
275 of FROM, TO, and VALID-P.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
276
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
277 FROM and TO specify the range of text that has the same `composition'
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
278 property, VALID-P is non-nil if and only if this composition is valid.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
279
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
280 If there's no composition at POS, and the optional 2nd argument LIMIT
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
281 is non-nil, search for a composition toward LIMIT.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
282
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
283 If no composition is found, return nil.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
284
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
285 Optional 3rd argument STRING, if non-nil, is a string to look for a
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
286 composition in; nil means the current buffer.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
287
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
288 If a valid composition is found and the optional 4th argument DETAIL-P
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
289 is non-nil, the return value is a list of FROM, TO, COMPONENTS,
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
290 RELATIVE-P, MOD-FUNC, and WIDTH.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
291
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
292 COMPONENTS is a vector of integers, the meaning depends on RELATIVE-P.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
293
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
294 RELATIVE-P is t if the composition method is relative, else nil.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
295
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
296 If RELATIVE-P is t, COMPONENTS is a vector of characters to be
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
297 composed. If RELATIVE-P is nil, COMPONENTS is a vector of characters
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
298 and composition rules as described in `compose-region'.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
299
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
300 MOD-FUNC is a modification function of the composition.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
301
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
302 WIDTH is a number of columns the composition occupies on the screen."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
303 (let ((result (find-composition-internal pos limit string detail-p)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
304 (if (and detail-p result (nth 2 result) (not (nth 3 result)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
305 ;; This is a valid rule-base composition.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
306 (decode-composition-components (nth 2 result) 'nocopy))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
307 result))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
308
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
309
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
310 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
311 (defun compose-chars-after (pos &optional limit object)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
312 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
313 Compose characters in current buffer after position POS.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
314
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
315 It looks up the char-table `composition-function-table' (which see) by
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
316 a character after POS. If non-nil value is found, the format of the
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
317 value should be an alist of PATTERNs vs FUNCs, where PATTERNs are
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
318 regular expressions and FUNCs are functions. If the text after POS
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
319 matches one of PATTERNs, call the corresponding FUNC with three
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
320 arguments POS, TO, and PATTERN, where TO is the end position of text
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
321 matching PATTERN, and return what FUNC returns. Otherwise, return
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
322 nil.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
323
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
324 FUNC is responsible for composing the text properly. The return value
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
325 is:
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
326 nil -- if no characters were composed.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
327 CHARS (integer) -- if CHARS characters were composed.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
328
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
329 Optional 2nd arg LIMIT, if non-nil, limits the matching of text.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
330
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
331 Optional 3rd arg OBJECT, if non-nil, is a string that contains the
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
332 text to compose. In that case, POS and LIMIT index to the string.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
333
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
334 This function is the default value of `compose-chars-after-function'."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
335 (let ((tail (get-char-table (char-after pos) composition-function-table))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
336 pattern func result)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
337 (when tail
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
338 (save-match-data
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
339 (save-excursion
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
340 (while (and tail (not func))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
341 (setq pattern (car (car tail))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
342 func (cdr (car tail)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
343 (goto-char pos)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
344 (if (if limit
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
345 (and (re-search-forward pattern limit t)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
346 (= (match-beginning 0) pos))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
347 (looking-at pattern))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
348 (setq result (funcall func pos (match-end 0) pattern nil))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
349 (setq func nil tail (cdr tail)))))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
350 result))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
351
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
352 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
353 (defun compose-last-chars (args)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
354 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
355 Compose last characters.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
356 The argument is a parameterized event of the form
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
357 \(compose-last-chars N COMPONENTS),
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
358 where N is the number of characters before point to compose,
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
359 COMPONENTS, if non-nil, is the same as the argument to `compose-region'
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
360 \(which see). If it is nil, `compose-chars-after' is called,
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
361 and that function find a proper rule to compose the target characters.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
362 This function is intended to be used from input methods.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
363 The global keymap binds special event `compose-last-chars' to this
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
364 function. Input method may generate an event (compose-last-chars N COMPONENTS)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
365 after a sequence character events."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
366 (interactive "e")
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
367 (let ((chars (nth 1 args)))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
368 (if (and (numberp chars)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
369 (>= (- (point) (point-min)) chars))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
370 (if (nth 2 args)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
371 (compose-region (- (point) chars) (point) (nth 2 args))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
372 (compose-chars-after (- (point) chars) (point))))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
373
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
374 ;;;###autoload(global-set-key [compose-last-chars] 'compose-last-chars)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
375
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
376
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
377 ;;; The following codes are only for backward compatibility with Emacs
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
378 ;;; 20.4 and the earlier.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
379
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
380 ;;;###autoload
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
381 (defun decompose-composite-char (char &optional type with-composition-rule)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
382 "UNIMPLEMENTED.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
383 Convert CHAR to string.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
384 This is only for backward compatibility with Emacs 20.4 and the earlier.
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
385
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
386 If optional 2nd arg TYPE is non-nil, it is `string', `list', or
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
387 `vector'. In this case, CHAR is converted string, list of CHAR, or
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
388 vector of CHAR respectively."
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
389 (cond ((or (null type) (eq type 'string)) (char-to-string char))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
390 ((eq type 'list) (list char))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
391 (t (vector char))))
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
392
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
393 (make-obsolete 'decompose-composite-char 'char-to-string
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
394 ;;"21.1"
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
395 )
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
396
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
397
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents:
diff changeset
398 ;;; mule-composite.el ends here