Article View: fj.editor.emacs
Article #410Re: a simple tategaki typesetter
From: Takashi Ikeda
Date: Thu, 18 Mar 1999 00:00
Date: Thu, 18 Mar 1999 00:00
393 lines
17018 bytes
17018 bytes
ๆฑ ็ฐใงใใ
satoru@isoternet.org (Satoru Takabayashi) writes:
> hiroki-t@is.aist-nara.ac.jp wrote:
>
> > ใ ใใ ใ ใ ใ ้ ๆฉ ๅ ไฝฟ ๅ ใช ๆฅ ใ ใใ ใ ไฝ ใซ ใ ใๅคง ใ
> > ๅพก ใ๏ผ ๏ฝ ใใพ ใฎ ใ ใ ใ ใซ ใ ใช ใ ใใฃ ใช ใฃ ใฏ ๅฝ ใๅญฆ ใ
> > ๆ ใ ใใ ไบบ ใ ใ ใจ ใ ไบบ ้ข ๆฐฃ ใ ใ ใใ ใ ใฆ ใช ๅ ใใง ใซ
> > ่ฆ ใ ใใ ้ ใใจ ใ ใช ใ ใ ใ ใจ ใ ใใฎ ใฎ ใฟ ใ ใ ใใ ใก
> > ๅพก ใ ใใฉ ๅทฅ ใญ ใ ใพ ใ ไบบ ใ ใ ็ ไฝ ใใง ใง ใพ ใช Eใ ใ ใใฏ
> > ๆ ใ ใใ ๅญฆ ๏ฝ ่ ใ ใ ้ ใ ใฆ ใซ ใ ใๅฐ ใ ใ ใ mใ ใ ใ ใ
> > ๆณ ใ ใใ ใซ ใ ใ ็ฐ ใฆ ใง ใจ ใ ๆฅ ๅง ใใช ใ ใ ใ aใ ใ ใ็
> > ใช ใ ใใฆ ๅ ๏ฝ ใฆ ๅข ๆฌฒ ใ ใฏ ใพ ๆฌ ใ ใใ ๏ฝ ใใช cใ ใ ใ่ถ
> > ใฉ ใ ใๆจ ใฃ ใ ใ ใ ใ ใ ๅ ใ ่ช ใฆ ใใ ใก ็ตถ ใฎ sใ ใ ใ๏ผ
> > ๏ฝ ใ ใๆบ ใ ใ ใช ไฝฟ ใ ใจ ใซ ใ ๅฆ ใ ใใ ใ ๅฏพ ใง ใ ใ ใๅฅ
> > ใ ใ ใใซ ๏ฝใ ใ ใ ใ ใ ๆ ใ็ ใ ใ้ฉ ใฃ ่ชฐ ๏ฝใฏ ใ ใ่ฏ
> > ๆฐ ใ ใใช ใ ใฆ ใ ใซ ใฎ ใ ่ก ็ธฆ ใ ๏ฝ ใใ ใจ ใ ้ ็ธฆ ใ ใๅ
> > ่ปฝ ใ ใใ ใฃ ใน ใ ใ ใง ใ ็ ๆธ ใ ใ ใใฆ ๆข ใ ใณ ๆธ ใ ใ็ซฏ
> > ใซ ใ ใใช ใจ ใช ใง ใ ใ ใจ ใช ใ ใฆ ใฏ ใใ ใ ๆข ใง ใ ใ ใ็ง
> > ใฉ ใ ใใ ไฝฟ ใฉ ใฏ ใฎ ใใ ใ ใซ ใ ใ ใใพ ใ ใซ ใ ใ ใ ใๅญฆ
> > ใ ใ ใใฎ ใ ใฏ ใช ใฏ ็พ ่ ใจ ้ ใ ็ธฆ ใใ ้ ไฝ ใ ๅบ ใ ใๆ
> > ใ ใ ใใง ๆ ใ ใ ๏ฝๅจ ใ ใง ใ ใจ ๆธ ใ ใใ ใฃ ใช ๆฅ ใ ใ่ก
> > ใ ใ ใใ ใ ใฎ ใ ไฝฟ ใฎ ใฆ ใฏ ใ ใฏ ใ ใ ใใง ใฆ ใ ใ ใ ใๅคง
> > ใ ใ ใใ ใญ ไพ ใจ ใ ่จ ่ฆ ใช ๏ฝ่จ ใ ใ ใใฏ ใ ใฎ ใ ใ ใๅญฆ
> > ใ ใ ใใ ๏ฝ ใง ๆ ไบบ ็ฎ ๆ ผ ใ ๆ ใ ๅบ ใ ใใช ใ ใ ใ ใ ใ้ข
>
> tategaki.el ใฎใณใกใณใใซใใใจ
>
> | * emacs-version ใ 20.x ไปฅไธใงใชใใจๅใใพใใใ
19็ณปใงใๅใใใฎใไฝใฃใฆใฟใพใใใใฒใใฃใจใใใจ18ใโฆ
ใใใใใใปใฉใฎใใฎใงใใชใใฎใง็ดๆฅ้ใใพใใ
ใใ ใใใฎelใฏใใฐใฃใฆใใฆใregionๅ
ใ ใใๅฏพ่ฑกใซใใ่จณใงใฏใชใใregion
ไปฅ้ใซใๅฝฑ้ฟใไธใใฆใใพใใพใใๅฝนๆใชใฉใซๆๅบใใ้ใซใฏๆณจๆใๅฟ
่ฆใงใใ
ใใญใ
ใใใใใณใกใณใใ่งฆใฃใฆใพใใใใใใใชใซโฆ
# ใใจใใใฐใฃใฆใใ็ดใใชใใผใใซๅ ฑๅใใใชใrmใใใชใ่ชญใฟ้ฃใฐใใชใ
้ฉๅฝใซๅฆ็ใใฆไธใใใ
;;; tategaki.el --- a simple ็ธฆ
;; ๆธ
;; ใ typesetter
;;; Copyright (C) 1999 Tamakoshi Hiroki <hiroki-t@is.aist-nara.ac.jp>
;;; Last modified on Mon Mar 15 03:34:17 1999
;; Author: Tamakoshi Hiroki <hiroki-t@is.aist-nara.ac.jp>
;; Maintainer: Tamakoshi Hiroki <hiroki-t@is.aist-nara.ac.jp>
;; Created: 10 Mar 1999
;; Version: 1.0
;; Keywords: wp
;;; Commentary:
;; 1. Set region, and invoke the program by typing M-x tategaki-region.
;; 2. Then it asks the number of letters in one line, please answer.
;; 3. The result is what you will see.
;;
;; 1. ็ฏๅฒใๆๅฎใใฆใM-x tategaki-region ใใฆไธใใใ
;; 2. ไธ่กใฎๅญๆฐใ่ใใฆใใใฎใงๅ
ฅๅใใพใใ
;; 3. ็ธฆๆธใใซๆดๅฝขใใใพใใ
;;; Features:
;; * ใผ ใ ๏ฝ ใซใโ ใ โ ใซใใใชใฉ 90 ๅบฆๅ่ปขใใใจใใซๆญฃใใใชใใใใซ
;; ๅคๆใใพใใๅฅ่ชญ็นใชใฉใๅๆงใงใใ
;; * ็ฆๅๅฆ็ใใใพใใ
;; * ็ฉบ่ก(ๆญฃ็ขบใซใฏไบใค้ฃ็ถใใ \n)ใใใๅ ดๅใใใใๆฎต่ฝใฎๅบๅใใจใใฆ
;; ๅใฎๆใฎๆๅพใงๅผทๅถ็ใซๆน่กใใพใใ
;;; Tips:
;; * HTML ใฎไธญใงใฏ <pre> </pre> ใงๅฒใใฐๅคงไฝใใพใ่ฆใใใใใใงใใ
;; * TeX ใงใฏ็ด ็ดใซ pTeX ใไฝฟใใพใใใใ
;; * ็ธฆๆธใใฎใกใผใซใไนใชใใฎใงใใ
;;; Bugs:
;; * ็ต็ใฎๆนๆณใฏใใๅ ๆธใงใใ
;; * ๅคใใฎๅคๆไธ่ฝใช่จๅทใใใใพใใไพใใฐ ( ) ใซๅฏพๅฟใใใ
;; ็ธฆๆธใใซไฝฟใใ่จๅทใๅญๅจใใพใใ(ใใใฐๆใใฆไธใใ)ใ
;; * 12ๆ ใฏ 12
;; ๆ ใจใในใใงใใใใใใใฃใฆใใพใใใ
;; * emacs-version ใ 20.x ไปฅไธใงใชใใจๅใใพใใใ
;;; A simple sample ใ ใฎ ใ ใช ๏ผ ใ ๆฅ ใใ
;; ใง ๅผท ใ ใ ็ธฆ ใ ๆฌ ใใ
;; ใใใซใกใฏใ ใ ใ ใใฆ ๆธ ใจ ่ช ใใซ
;; ใๆ ใ ๏ฝใ ๆ ใฏ ใใก
;; ๆฅๆฌ่ชใฏใใฏใ็ธฆๆธใใ ใจ ใๅ ใ ็
ใ ใ ใ ใใฏ
;; ๆใใพใใใ๏ผ โ ใใฎ ใ ใ ๅบ ใพ ใฏ ใ ใ
;; ็ธฆๆธใใๅบๆฅใชใใชใใฆใ ใใ ใฏ ใง ๆฅ ใ ใ ใ ใ
;; ็
ใใงใใพใใใใใใใฏ ใไป ่ฅฟ ใ ใช ใ ็ธฆ ใ ใ
;; ่ฅฟๆฌงใฎๅผทใๆๅใฎใไป็ใใงใใ ใ็ ๆฌง ใพ ใ ใ ๆธ ใ ใ
;;; Feature Work:
;; 12ๆใ(1) ใชใฉใซๅฏพๅฟใใใ
;; *, โ, ใป ใชใฉใงใคใณใใณใใๆใใใ
;; ็ธฆๆธใใซใใใใฎใๆจชๆธใใซๆปใๆฉๆงใ่ใใใ
;;; History:
;; 1999ๅนด03ๆ15ๆฅ: ใชใใจใชใๅ
ฌ้ใใฆใฟใใ
;; http://mimi.aist-nara.ac.jp/~hiroki-t/Distribution/Tategaki/
;;; Code:
(defvar tategaki-tmp-buffer " *Tategaki tmp*")
(defun tategaki-emu-substring (string start &optional end)
(let ((buffer (get-buffer-create " *tategaki-emu-substring*")))
(save-excursion
(set-buffer buffer)
(erase-buffer)
(insert string)
(goto-char (point-min))
(forward-char start)
(format "%s"
(prog1
(if (not end)
(buffer-substring (point) (point-max))
(let ((point (point)))
(goto-char (point-min))
(forward-char end)
(buffer-substring point (point)))
)
(kill-buffer buffer))))))
(defun tategaki-emu-length (string)
(and (listp string) (setq string (nth 1 string)))
(let ((buffer (get-buffer-create " *tategaki-emu-length*")))
(save-excursion
(set-buffer buffer)
(erase-buffer)
(insert string)
(let ((n 0))
(goto-char (point-min))
(while (not (eobp))
(forward-char)
(setq n (1+ n)))
(kill-buffer buffer)
n
))))
(defun tategaki-get-string (number start end)
(let ((string (buffer-substring start end)))
(kill-buffer (get-buffer-create tategaki-tmp-buffer))
(get-buffer-create tategaki-tmp-buffer)
(save-excursion
(set-buffer tategaki-tmp-buffer)
(insert string)
(goto-char (point-min))
(let* ((str (let ((tmp '())
(start-point (point-min)))
(while (search-forward "\n\n" nil t 1)
(setq tmp (cons (tategaki-emu-buffer-substring start-point
(- (point) 2))
tmp))
(save-excursion (insert (make-string number ? )))
(setq start-point (point)))
(setq tmp (cons (buffer-substring (point) (point-max))
tmp))
tmp))
(purged (let ((tmp '()))
(while str
(erase-buffer)
(insert (car str))
(goto-char (point-min))
(replace-string "\n" "")
(setq tmp (cons (buffer-substring (point-min)
(point-max))
tmp))
(setq str (cdr str)))
tmp)))
(kill-buffer tategaki-tmp-buffer)
purged))))
(defvar tategaki-tobe-converted-letters
'(("ใ" " ใ" t) ("ใ" " ๏ฝ" t) ("ใผ" "๏ฝ") ("๏ฝ" "โ")
("โ" "โ") ("โ" "โ") ("โ" "โ") ("โ" "โ")
("ใ" " โ" t) ("ใ" (if (bolp)
(insert "โ")
(backward-delete-char 1)
(insert "โ ")) )
("๏ผ" "โง") ("๏ผ" "โจ") (":" "โฅ") ("๏ผ" "โฅ") ("โฅ" "๏ผ")
)
)
(defun tategaki-convert-letter (letter)
(let ((hit (assoc letter tategaki-tobe-converted-letters)))
(if hit
(progn
(if (stringp (nth 1 hit))
(insert (nth 1 hit))
(eval (nth 1 hit)))
(if (= 3 (tategaki-emu-length hit))
(cons t (nth 2 hit))
(cons t nil)))
nil)))
(defun tategaki-insert-car-of-divided-sentence (divided)
(let ((tmp divided)
(half-slipp nil))
(while tmp
(let ((substr (car tmp)))
(if (string= "" substr)
(insert " ใ")
(if half-slipp
()
(insert " "))
(setq half-slipp nil)
;; (let ((result (tategaki-convert-letter (aref substr 0))))
(let ((result (tategaki-convert-letter (tategaki-emu-substring substr 0 1))))
(if result
(setq half-slipp (cdr result))
(insert (tategaki-emu-substring substr 0 1))
(if (= 1 (string-width (tategaki-emu-substring substr 0 1)))
(progn (insert "ใ") (setq half-slipp t)))
))
))
(setq tmp (cdr tmp)))))
(defun tategaki-all-null-string (list)
(or (null list)
(and (string= "" (car list))
(tategaki-all-null-string (cdr list)))))
(defun tategaki-divide-string-to-pieces (number string)
(let ((divided (if (string= "" string)
(list (make-string (1+ number) ? ))
'())))
(while (not (string= "" string))
(let* ((limit (min number (tategaki-emu-length string)))
(substr (tategaki-emu-substring string 0 limit))
(kinsokup
(if (< limit (tategaki-emu-length string))
(let ((nextletter (tategaki-emu-substring string limit (1+ limit))))
(or (string="ใ" nextletter)
(string="ใ" nextletter)
(string="ใ" nextletter)
))
nil)))
(setq divided (cons (if kinsokup
(concat substr (tategaki-emu-substring string limit
(1+ limit)))
(concat substr
(make-string (- (+ number 1)
(tategaki-emu-length substr))
? )))
divided)
string (tategaki-emu-substring string (if kinsokup (1+ limit) limit)))))
divided))
(defun tategaki-region-aux (number string newlinep)
(let ((divided (tategaki-divide-string-to-pieces number string)))
(while (not (tategaki-all-null-string divided))
(tategaki-insert-car-of-divided-sentence divided)
(let ((tmp '()))
(while divided
(setq tmp (cons (if (string= "" (car divided))
""
(tategaki-emu-substring (car divided) 1))
tmp))
(setq divided (cdr divided)))
(setq divided (reverse tmp)))
; the next sentence doesn't work. very curious.
; (setq divided (mapcar (function (lambda (s)
; (if (string= "" s)
; ()
; (setq s (substring s 1)))))
; divided))
(if newlinep (insert "\n")
; (if (not newlinep) (insert "\n")
(let ((before (format "%s" (buffer-substring
(if (bobp)
""
(save-excursion (backward-char) (point)) (point))))))
;; ใโฆ
;; (if (or (string= "ใ" before)
;; (string= "๏ฝ" before)
;; (string= "โ" before)
;; (string= "ใ" before)
;; )
;; (delete-char 1))
(forward-line)))
)))
(defun tategaki-finalize (start)
(let* ((zure-regexp "ใ\\|๏ฝ\\|โ"))
(save-excursion
(goto-char start)
(while (search-forward-regexp zure-regexp nil t)
(if (eolp) () (delete-char 1))))
))
(defun tategaki-region (number start end)
(interactive "nLine width: \nr")
(let ((strings (tategaki-get-string number start end))
(newlinep t))
(delete-region start end)
(while strings
(tategaki-region-aux number (car strings) newlinep)
(setq newlinep nil)
(goto-char start)
(setq strings (cdr strings)))
(tategaki-finalize start)
))
(provide 'tategaki)
;;; tategaki.el ends here
> ใจใฎใใจใงใๆๅ
ใฎ็ฐๅขใงใฏๅใใใพใใใใใใใใฎใง perl ใง
> ไผผใใใใชใใฃใซใฟใไฝใฃใฆใฟใพใใใ
ๆฎๅใใใญใฆใRubyใงใไฝใฃใฆใฟใพใใใใใฏใใEUCใงใใๅใใพใใใใ
ใใจ็ฆๅๅฆ็ใใใพใใใๅ่งใซใใชใฉใฏใใฃใฆใฎใปใใงใใใโฆ
% nkf -e foobar.txt | ruby tategaki.rb
ใจใใงไฝฟใฃใฆไธใใใ
ใใฃใกใ็กไฟ่จผใงใใใฉใใ้ฉๅฝใซใ
#!/usr/local/bin/ruby -Ke
$column = 20
$tateyoko = {
"-" => "| ",
"ใผ" => "๏ฝ",
"๏ฝ" => "โ",
"โ" => "โ",
"โ" => "โ",
"โ" => "โ",
"โ" => "โ",
"ใ" => "โ",
"๏ผ" => "โง",
"๏ผ" => "โจ",
": " => "โฅ",
"๏ผ" => "โฅ",
"โฅ" => "๏ผ"
}
$zure_chars = {
"ใ" => "ใ",
"ใ" => "๏ฝ",
"ใ" => "โ"
}
w = readlines.join.gsub!("\n", "")
w.gsub!("^[ \t]+", "")
w.gsub!("\s", "")
chars = w.split("")
lines = []
s = 0
i = 0
while s < chars.length
if s + $column > chars.length then
lines[i] = chars[s,chars.length] + (" "*(s + $column - chars.length)).split("")
else
lines[i] = chars[s,$column]
end
i += 1
s += $column
end
count = i
lines.reverse!
for i in 0..($column-1)
for j in 0..(count-1)
c = lines[j][0]
if c =~ /^[\x20-\x7e]/ then
if $tateyoko[c] then
print $tateyoko[c], " "
else
print c, " "
end
elsif c =~ /^[\xa1-\xfe]/ then
if $tateyoko[c] then
print $tateyoko[c], " "
elsif $zure_chars[c] then
print " ", $zure_chars[c]
else
print c, " "
end
end
lines[j] = lines[j][1,(lines[j].length-1)]
end
print "\n"
end
takashi ikeda cercine@kcn.ne.jp
chemicals
Technical Details
Message-ID:
<m2sob3du3l.fsf@kcn.ne.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<lzovhg3ewcq.fsf@kmserver.aist-nara.ac.jp> <7cie2i$jpd$1@vega2.aichi-u.ac.jp>Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 10eba4,31ca5aaa33f2e671 X-Google-Attributes: gid10eba4,public X-Google-Thread: 10fe86,2e0e669784f264a5,start X-Google-Attributes: gid10fe86,public X-Google-Thread: 1107f7,31ca5aaa33f2e671 X-Google-Attributes: gid1107f7,public X-Google-Thread: f9898,3ba4fd057be66f09 X-Google-Attributes: gidf9898,public X-Google-Thread: ff358,31ca5aaa33f2e671 X-Google-Attributes: gidff358,public From: Takashi Ikeda <cercine@kcn.ne.jp> Subject: Re: a simple tategaki typesetter Date: 1999/03/18 Message-ID: <m2sob3du3l.fsf@kcn.ne.jp> X-Deja-AN: 456060316 References: <lzovhg3ewcq.fsf@kmserver.aist-nara.ac.jp> <7cie2i$jpd$1@vega2.aichi-u.ac.jp> Content-Type: text/plain; charset=ISO-2022-JP Organization: KCN-Net Mime-Version: 1.0 (generated by tm-edit 7.106) Newsgroups: fj.editor.emacs,fj.editor.mule,fj.editor.xemacs,fj.comp.lang.perl,fj.comp.lang.ruby