Sync to HEAD
[bpt/emacs.git] / lisp / international / kinsoku.el
CommitLineData
60370d40 1;;; kinsoku.el --- `Kinsoku' processing funcs -*- coding: iso-2022-7bit; -*-
4ed46869 2
4ed46869 3;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
fa526c4a 4;; Licensed to the Free Software Foundation.
4ed46869 5
fa526c4a 6;; Keywords: mule, kinsoku
4ed46869
KH
7
8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software; you can redistribute it and/or modify
11;; it under the terms of the GNU General Public License as published by
12;; the Free Software Foundation; either version 2, or (at your option)
13;; any later version.
14
15;; GNU Emacs is distributed in the hope that it will be useful,
16;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;; GNU General Public License for more details.
19
20;; You should have received a copy of the GNU General Public License
369314dc
KH
21;; along with GNU Emacs; see the file COPYING. If not, write to the
22;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23;; Boston, MA 02111-1307, USA.
4ed46869
KH
24
25;;; Commentary:
26
27;; `Kinsoku' processing is to prohibit specific characters to be
28;; placed at beginning of line or at end of line. Characters not to
29;; be placed at beginning and end of line have character category `>'
30;; and `<' respectively. This restriction is dissolved by making a
31;; line longer or shorter.
32;;
33;; `Kinsoku' is a Japanese word which originally means ordering to
34;; stay in one place, and is used for the text processing described
35;; above in the context of text formatting.
36
37;;; Code:
38
39(defvar kinsoku-limit 4
40 "How many more columns we can make lines longer by `kinsoku' processing.
41The value 0 means there's no limitation.")
42
43;; Setting character category `>' for characters which should not be
44;; placed at beginning of line.
45(let* ((kinsoku-bol
46 (concat
47 ;; ASCII
48 "!)-_~}]:;',.?"
a09244e6 49 ;; Latin JISX0201
e8dd0160 50 ;; Instead of putting Latin JISX0201 string directly, we
a09244e6
KH
51 ;; generate the string as below to avoid character
52 ;; unification problem.
53 (let* ((str1 "!)-_~}]:;',.?")
54 (len (length str1))
55 (idx 0)
56 (str2 "")
57 ch)
58 (while (< idx len)
59 (setq ch (make-char 'latin-jisx0201 (aref str1 idx))
60 str2 (concat str2 (char-to-string ch))
61 idx (1+ idx)))
62 str2)
63 ;; Katakana JISX0201
64 "\e(I!#'()*+,-./0^_\e(B"
4ed46869
KH
65 ;; Japanese JISX0208
66 "\e$B!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!<!=!>\e(B\
67\e$B!?!@!A!B!C!D!E!G!I!K!M!O!Q!S!U!W!Y![!k!l!m!n\e(B\
68\e$B$!$#$%$'$)$C$c$e$g$n%!%#%%%'%)%C%c%e%g%n%u%v\e(B"
69 ;; Chinese GB2312
70 "\e$A!"!##.#,!$!%!&!'!(!)!*!+!,!-!/!1#)!3!5!7!9!;!=\e(B\
71\e$A!?#;#:#?#!!@!A!B!C!c!d!e!f#/#\#"#_#~#|(e\e(B"
72 ;; Chinese BIG5
73 "\e$(0!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2\e(B\
74\e$(0!3!4!5!6!7!8!9!:!;!<!=!?!A!C!E!G!I!K\e(B\
4c0f6426 75\e$(0!M!O!Q!S!U!W!Y![!]!_!a!c!e!g!i!k!q\e(B\
4ed46869
KH
76\e$(0"#"$"%"&"'"(")"*"+","2"3"4"j"k"l"x%7\e(B"))
77 (len (length kinsoku-bol))
78 (idx 0)
79 ch)
80 (while (< idx len)
4a027a0d
KH
81 (setq ch (aref kinsoku-bol idx)
82 idx (1+ idx))
4ed46869
KH
83 (modify-category-entry ch ?>)))
84
85;; Setting character category `<' for characters which should not be
86;; placed at end of line.
87(let* ((kinsoku-eol
88 (concat
89 ;; ASCII
90 "({[`"
a09244e6
KH
91 ;; Latin JISX0201
92 ;; See the comment above.
93 (let* ((str1 "({[`")
94 (len (length str1))
95 (idx 0)
96 (str2 "")
97 ch)
98 (while (< idx len)
99 (setq ch (make-char 'latin-jisx0201 (aref str1 idx))
100 str2 (concat str2 (char-to-string ch))
101 idx (1+ idx)))
102 str2)
103 ;; JISX0201 Katakana
104 "\e(I"\e(B"
4ed46869
KH
105 ;; Japanese JISX0208
106 "\e$B!F!H!J!L!N!P!R!T!V!X!Z!k!l!m!n!w!x\e(B\
107\e$A!.!0#"#(!2!4!6!8!:!<!>!c!d!e#@!f!l\e(B"
108 ;; Chinese GB2312
109 "\e$A(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(h\e(B\
110\e$(0!>!@!B!D!F!H!J!L!N!P!R!T!V!X!Z!\!^!`!b\e(B"
111 ;; Chinese BIG5
112 "\e$(0!d!f!h!j!k!q!p"i"j"k"n"x$u$v$w$x$y$z${\e(B\
113\e$(0$|$}$~%!%"%#%$%%%&%'%(%)%*%+%:\e(B"))
114 (len (length kinsoku-eol))
115 (idx 0)
116 ch)
117 (while (< idx len)
4a027a0d
KH
118 (setq ch (aref kinsoku-eol idx)
119 idx (1+ idx))
4ed46869
KH
120 (modify-category-entry ch ?<)))
121
122;; Try to resolve `kinsoku' restriction by making the current line longer.
123(defun kinsoku-longer ()
6b61353c
KH
124 (let ((pos-and-column
125 (save-excursion
126 (forward-char 1)
127 (while (and (not (eobp))
128 (or (aref (char-category-set (following-char)) ?>)
129 ;; protect non-kinsoku words
130 (not (or (eq (preceding-char) ? )
131 (aref (char-category-set (preceding-char))
132 ?|)))))
133 (forward-char 1))
134 (cons (point) (current-column)))))
4ed46869
KH
135 (if (or (<= kinsoku-limit 0)
136 (< (cdr pos-and-column) (+ (current-fill-column) kinsoku-limit)))
137 (goto-char (car pos-and-column)))))
138
139;; Try to resolve `kinsoku' restriction by making the current line shorter.
a09244e6 140;; The line can't be broken before the buffer position LINEBEG.
4ed46869
KH
141(defun kinsoku-shorter (linebeg)
142 (let ((pos (save-excursion
143 (forward-char -1)
6b61353c
KH
144 (while (and
145 (< linebeg (point))
146 (or (aref (char-category-set (preceding-char)) ?<)
147 (aref (char-category-set (following-char)) ?>)
148 ;; protect non-kinsoku words
149 (not (or (eq (preceding-char) ? )
150 (aref (char-category-set (preceding-char))
151 ?|)))))
4ed46869
KH
152 (forward-char -1))
153 (point))))
154 (if (< linebeg pos)
155 (goto-char pos))))
156
157;;;###autoload
158(defun kinsoku (linebeg)
159 "Go to a line breaking position near point by doing `kinsoku' processing.
160LINEBEG is a buffer position we can't break a line before.
161
162`Kinsoku' processing is to prohibit specific characters to be placed
163at beginning of line or at end of line. Characters not to be placed
164at beginning and end of line have character category `>' and `<'
165respectively. This restriction is dissolved by making a line longer or
166shorter.
167
168`Kinsoku' is a Japanese word which originally means ordering to stay
169in one place, and is used for the text processing described above in
170the context of text formatting."
11e60d92
KH
171 (if enable-kinsoku
172 (if (or (and
173 ;; The character after point can't be placed at beginning
a1506d29 174 ;; of line.
11e60d92
KH
175 (aref (char-category-set (following-char)) ?>)
176 ;; We at first try to dissolve this situation by making a
177 ;; line longer. If it fails, then try making a line
178 ;; shorter.
179 (not (kinsoku-longer)))
180 ;; The character before point can't be placed at end of line.
181 (aref (char-category-set (preceding-char)) ?<))
182 (kinsoku-shorter linebeg))))
4ed46869 183
6b61353c 184;;; arch-tag: e6b036bc-9e5b-4e9f-a22c-4ed04e37777e
60370d40 185;;; kinsoku.el ends here