diff lisp/international/kinsoku.el @ 17052:d0d7b244b1d0

Initial revision
author Karl Heuer <kwzh@gnu.org>
date Thu, 20 Feb 1997 07:02:49 +0000
parents
children 70194012fb3a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/international/kinsoku.el	Thu Feb 20 07:02:49 1997 +0000
@@ -0,0 +1,141 @@
+;;; kinsoku.el --- `Kinsoku' processing functions.
+
+;; Copyright (C) 1995 Free Software Foundation, Inc.
+;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
+
+;; Keywords: kinsoku
+
+;; 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 2, 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Commentary:
+
+;; `Kinsoku' processing is to prohibit specific characters to be
+;; placed at beginning of line or at end of line.  Characters not to
+;; be placed at beginning and end of line have character category `>'
+;; and `<' respectively.   This restriction is dissolved by making a
+;; line longer or shorter.
+;;
+;; `Kinsoku' is a Japanese word which originally means ordering to
+;; stay in one place, and is used for the text processing described
+;; above in the context of text formatting.
+
+;;; Code:
+
+(defvar kinsoku-limit 4
+  "How many more columns we can make lines longer by `kinsoku' processing.
+The value 0 means there's no limitation.")
+
+;; Setting character category `>' for characters which should not be
+;; placed at beginning of line.
+(let* ((kinsoku-bol
+	(concat
+	 ;; ASCII
+	 "!)-_~}]:;',.?"
+	 ;; Japanese JISX0208
+	 "$B!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!<!=!>(B\
+$B!?!@!A!B!C!D!E!G!I!K!M!O!Q!S!U!W!Y![!k!l!m!n(B\
+$B$!$#$%$'$)$C$c$e$g$n%!%#%%%'%)%C%c%e%g%n%u%v(B"
+	 ;; Chinese GB2312
+	 "$A!"!##.#,!$!%!&!'!(!)!*!+!,!-!/!1#)!3!5!7!9!;!=(B\
+$A!?#;#:#?#!!@!A!B!C!c!d!e!f#/#\#"#_#~#|(e(B"
+	 ;; Chinese BIG5
+	 "$(0!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2(B\
+$(0!3!4!5!6!7!8!9!:!;!<!=!?!A!C!E!G!I!K(B\
+$(0!M!O!Q(B	$(0!S!U!W!Y![!]!_!a!c!e!g!i!k!q(B\
+$(0"#"$"%"&"'"(")"*"+","2"3"4"j"k"l"x%7(B"))
+       (len (length kinsoku-bol))
+       (idx 0)
+       ch)
+  (while (< idx len)
+    (setq ch (sref kinsoku-bol idx)
+	  idx (+ idx (char-bytes ch)))
+    (modify-category-entry ch ?>)))
+
+;; Setting character category `<' for characters which should not be
+;; placed at end of line.
+(let* ((kinsoku-eol
+	(concat
+	 ;; ASCII
+	 "({[`"
+	 ;; Japanese JISX0208
+	 "$B!F!H!J!L!N!P!R!T!V!X!Z!k!l!m!n!w!x(B\
+$A!.!0#"#(!2!4!6!8!:!<!>!c!d!e#@!f!l(B"
+	 ;; Chinese GB2312
+	 "$A(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(h(B\
+$(0!>!@!B!D!F!H!J!L!N!P!R!T!V!X!Z!\!^!`!b(B"
+	 ;; Chinese BIG5
+	 "$(0!d!f!h!j!k!q!p"i"j"k"n"x$u$v$w$x$y$z${(B\
+$(0$|$}$~%!%"%#%$%%%&%'%(%)%*%+%:(B"))
+       (len (length kinsoku-eol))
+       (idx 0)
+       ch)
+  (while (< idx len)
+    (setq ch (sref kinsoku-eol idx)
+	  idx (+ idx (char-bytes ch)))
+    (modify-category-entry ch ?<)))
+
+;; Try to resolve `kinsoku' restriction by making the current line longer.
+(defun kinsoku-longer ()
+  (let ((pos-and-column (save-excursion
+			  (forward-char 1)
+			  (while (aref (char-category-set (following-char)) ?>)
+			    (forward-char 1))
+			  (cons (point) (current-column)))))
+    (if (or (<= kinsoku-limit 0)
+	    (< (cdr pos-and-column) (+ (current-fill-column) kinsoku-limit)))
+	(goto-char (car pos-and-column)))))
+
+;; Try to resolve `kinsoku' restriction by making the current line shorter.
+;; The line can't be broken before the buffer position LINEBEG."
+(defun kinsoku-shorter (linebeg)
+  (let ((pos (save-excursion
+	       (forward-char -1)
+	       (while (and (< linebeg (point))
+			   (or (aref (char-category-set (preceding-char)) ?<)
+			       (aref (char-category-set (following-char)) ?>)))
+		 (forward-char -1))
+	       (point))))
+    (if (< linebeg pos)
+	(goto-char pos))))
+
+;;;###autoload
+(defun kinsoku (linebeg)
+  "Go to a line breaking position near point by doing `kinsoku' processing.
+LINEBEG is a buffer position we can't break a line before.
+
+`Kinsoku' processing is to prohibit specific characters to be placed
+at beginning of line or at end of line.  Characters not to be placed
+at beginning and end of line have character category `>' and `<'
+respectively.  This restriction is dissolved by making a line longer or
+shorter.
+
+`Kinsoku' is a Japanese word which originally means ordering to stay
+in one place, and is used for the text processing described above in
+the context of text formatting."
+  (if (or (and
+	   ;; The character after point can't be placed at beginning
+	   ;; of line.  
+	   (aref (char-category-set (following-char)) ?>)
+	   ;; We at first try to dissolve this situation by making a
+	   ;; line longer.  If it fails, then try making a line
+	   ;; shorter.
+	   (not (kinsoku-longer)))
+	  ;; The character before point can't be placed at end of line.
+	  (aref (char-category-set (preceding-char)) ?<))
+      (kinsoku-shorter linebeg)))
+
+;; kinsoku.el ends here