summaryrefslogtreecommitdiff
path: root/sample
diff options
context:
space:
mode:
Diffstat (limited to 'sample')
-rw-r--r--sample/blk.rb4
-rwxr-xr-xsample/from.rb140
-rw-r--r--sample/list.rb4
-rw-r--r--sample/list2.rb2
-rw-r--r--sample/list3.rb2
-rw-r--r--sample/ruby-mode.el134
-rw-r--r--sample/t2.rb2
-rw-r--r--sample/tt.rb2
8 files changed, 130 insertions, 160 deletions
diff --git a/sample/blk.rb b/sample/blk.rb
index 12d1038fd09..e11cc026ea8 100644
--- a/sample/blk.rb
+++ b/sample/blk.rb
@@ -2,8 +2,8 @@ def foo()
$block = Block.new
end
-foo(){i| print "i = ", i, "\n"}
+foo(){|i| print "i = ", i, "\n"}
$block.call(2)
-foo(){i| print "i*2 = ", i*2, "\n"}
+foo(){|i| print "i*2 = ", i*2, "\n"}
$block.call(2)
diff --git a/sample/from.rb b/sample/from.rb
index df82d5a745a..f21b1d10f59 100755
--- a/sample/from.rb
+++ b/sample/from.rb
@@ -1,7 +1,5 @@
#! /usr/local/bin/ruby
-$= = TRUE
-
module ParseDate
MONTHS = {
'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4,
@@ -10,7 +8,7 @@ module ParseDate
MONTHPAT = MONTHS.keys.join('|')
DAYPAT = 'mon|tue|wed|thu|fri|sat|sun'
- def ParseDate.parsedate(date)
+ def parsedate(date)
if date.sub(/(#{DAYPAT})/i, ' ')
dayofweek = $1
end
@@ -20,13 +18,13 @@ module ParseDate
if date =~ /19(\d\d)/
year = $1
end
- if date.sub(/\s*(\d+)\s+(#{MONTHPAT})\S*\s+/, ' ')
+ if date.sub(/\s*(\d+)\s+(#{MONTHPAT})\S*\s+/i, ' ')
dayofmonth = $1
monthname = $2
- elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\s+/, ' ')
+ elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\s+/i, ' ')
monthname = $1
dayofmonth = $2
- elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\D+/, ' ')
+ elsif date.sub(/\s*(#{MONTHPAT})\S*\s+(\d+)\D+/i, ' ')
monthname = $1
dayofmonth = $2
elsif date.sub(/\s*(\d\d?)\/(\d\d?)/, ' ')
@@ -44,52 +42,130 @@ module ParseDate
end
- def parsedate(date)
- ParseDate.parsedate(date)
+include ParseDate
+
+def decode64(str)
+ e = -1;
+ c = ","
+ for line in str.split("\n")
+ line.tr 'A-Za-z0-9+/', "\000-\377"
+ line.each_byte { |ch|
+ e+=1
+ if e==0
+ c = ch << 2
+ elsif e==1
+ c |= ch >>4
+ string += [c].pack('c')
+ c = ch << 4
+ elsif e == 2
+ c |= ch >> 2
+ string += [c].pack('c');
+ c = ch << 6
+ elsif e==3
+ c |= ch
+ string += [c].pack('c')
+ e = -1;
+ end
+ }
+ end
+ return string;
+end
+
+def j2e(str)
+ while str =~ /\033\$B([^\033]*)\033\(B/
+ s = $1
+ pre, post = $`, $'
+ s.gsub(/./) { |ch|
+ (ch[0]|0x80).chr
+ }
+ str = pre + s + post
end
+ str
+end
-# include ParseDate
+def decode_b(str)
+ while str =~ /=\?ISO-2022-JP\?B\?(.*)=\?=/
+ pre, post = $`, $'
+ s = decode64($1)
+ str = pre + s + post
+ end
+ j2e(str)
+end
if $ARGV[0] == '-w'
wait = TRUE
$ARGV.shift
end
+class Mail
+
+ def Mail.new(f)
+ if !f.is_kind_of(IO)
+ f = open(f, "r")
+ me = super
+ f.close
+ else
+ me = super
+ end
+ return me
+ end
+
+ def initialize(f)
+ @header = {}
+ @body = []
+ while f.gets()
+ $_.chop
+ continue if /^From / # skip From-line
+ break if /^[ \t]*$/ # end of header
+ if /^(\S+):\s*(.*)/
+ @header[attr = $1.capitalize] = $2
+ elsif attr
+ sub(/^\s*/, '')
+ @header[attr] += "\n" + $_
+ end
+ end
+
+ return if ! $_
+
+ while f.gets()
+ break if /^From /
+ @body.push($_)
+ end
+ end
+
+ def header
+ return @header
+ end
+
+ def body
+ return @body
+ end
+
+end
+
$ARGV[0] = '/usr/spool/mail/' + ENV['USER'] if $ARGV.length == 0
$outcount = 0;
def fromout(date, from, subj)
+ return if !date
y = m = d = 0
y, m, d = parsedate(date) if date
from = "sombody@somewhere" if ! from
subj = "(nil)" if ! subj
- printf "%-2d/%02d/%02d [%-28.28s] %-40.40s\n", y, m, d, from, subj
+ from = decode_b(from)
+ subj = decode_b(subj)
+ printf "%-02d/%02d/%02d [%-28.28s] %-40.40s\n", y, m, d, from, subj
$outcount += 1
end
-
-while TRUE
- fields = {}
- while gets()
- $_.chop
- continue if /^From / # skip From-line
- break if /^[ \t]*$/ # end of header
- if /^(\S+):\s*(.*)/
- fields[attr = $1] = $2
- elsif attr
- sub(/^\s*/, '')
- fields[attr] += "\n" + $_
- end
- end
- break if ! $_
-
- fromout fields['Date'], fields['From'], fields['Subject']
-
- while gets()
- break if /^From /
+for file in $ARGV
+ continue if !File.exists(file)
+ f = open(file, "r")
+ while !f.eof
+ mail = Mail.new(f)
+ fromout mail.header['Date'], mail.header['From'], mail.header['Subject']
end
-
- break if ! $_
+ f.close
end
if $outcount == 0
diff --git a/sample/list.rb b/sample/list.rb
index fa145f46277..93e3182f841 100644
--- a/sample/list.rb
+++ b/sample/list.rb
@@ -1,7 +1,7 @@
# Linked list example
class MyElem
# オブジェクト生成時に自動的に呼ばれるメソッド
- def init_object(item)
+ def initialize(item)
# @変数はインスタンス変数(宣言は要らない)
@data = item
@next = nil
@@ -54,7 +54,7 @@ class MyList
end
class Point
- def init_object(x, y)
+ def initialize(x, y)
@x = x; @y = y
self
end
diff --git a/sample/list2.rb b/sample/list2.rb
index 1c2ca08150e..914cb8996ef 100644
--- a/sample/list2.rb
+++ b/sample/list2.rb
@@ -1,6 +1,6 @@
# Linked list example -- short version
class Point
- def init_object(x, y)
+ def initialize(x, y)
@x = x; @y = y
self
end
diff --git a/sample/list3.rb b/sample/list3.rb
index 6bedc6ced98..2c1beb6fa27 100644
--- a/sample/list3.rb
+++ b/sample/list3.rb
@@ -2,7 +2,7 @@
# using _inspect
class Point
- def init_object(x, y)
+ def initialize(x, y)
@x = x; @y = y
self
end
diff --git a/sample/ruby-mode.el b/sample/ruby-mode.el
index fd44dc661be..bcbbdc35f3f 100644
--- a/sample/ruby-mode.el
+++ b/sample/ruby-mode.el
@@ -18,7 +18,7 @@
(defconst ruby-block-end-re "end")
(defconst ruby-delimiter
- (concat "[$/(){}#\"'`]\\|\\[\\|\\]\\|\\b\\("
+ (concat "[$/<(){}#\"'`]\\|\\[\\|\\]\\|\\b\\("
ruby-block-beg-re "\\|" ruby-block-end-re "\\)\\b")
)
@@ -37,10 +37,11 @@
(if ruby-mode-map
nil
(setq ruby-mode-map (make-sparse-keymap))
+ (define-key ruby-mode-map "{" 'ruby-electric-brace)
+ (define-key ruby-mode-map "}" 'ruby-electric-brace)
(define-key ruby-mode-map "\e\C-a" 'ruby-beginning-of-defun)
(define-key ruby-mode-map "\e\C-e" 'ruby-end-of-defun)
(define-key ruby-mode-map "\t" 'ruby-indent-command)
- (define-key ruby-mode-map "\t" 'ruby-indent-command)
(define-key ruby-mode-map "\C-m" 'ruby-reindent-then-newline-and-indent)
(define-key ruby-mode-map "\C-j" 'newline))
@@ -178,7 +179,9 @@ The variable ruby-indent-level controls the amount of indentation.
(t
(goto-char indent-point)
(setq in-string t))))
- ((string= "/" w)
+ ((or (string= "/" w)
+ (string= "<" w))
+ (if (string= "<" w) (setq w ">"))
(let (c)
(save-excursion
(goto-char pnt)
@@ -261,120 +264,6 @@ The variable ruby-indent-level controls the amount of indentation.
(error (format "bad string %s" w)))))))
(list in-string in-paren (car nest) depth)))
-(defun ruby-parse-region (start end)
- (let ((indent-point end)
- (indent 0)
- (in-string nil)
- (in-paren nil)
- (depth 0)
- (nest nil))
- (save-excursion
- (if start
- (goto-char start)
- (ruby-beginning-of-defun))
- (while (and (> indent-point (point))
- (re-search-forward ruby-delimiter indent-point t))
- (let ((w (buffer-substring (match-beginning 0) (match-end 0)))
- (pnt (match-beginning 0)))
- (cond
- ((or (string= "\"" w) ;skip string
- (string= "'" w)
- (string= "`" w))
- (cond
- ((string= w (char-to-string (char-after (point))))
- (forward-char 1))
- ((re-search-forward (format "[^\\]%s" w) indent-point t)
- nil)
- (t
- (goto-char indent-point)
- (setq in-string t))))
- ((or (string= "/" w)
- (string= "<" w))
- (if (string= "<" w) (setq w ">"))
- (let (c)
- (save-excursion
- (goto-char pnt)
- (skip-chars-backward " \t")
- (setq c (char-after (1- (point))))
- (if c (setq c (char-syntax c))))
- (if (or (eq c ?.)
- (and (eq c ?w)
- (save-excursion
- (forward-word -1)
- (or
- (looking-at ruby-block-beg-re)
- (looking-at ruby-block-mid-re)))))
- (cond
- ((string= w (char-to-string (char-after (point))))
- (forward-char 1))
- ((re-search-forward (format "[^\\]%s" w) indent-point t)
- nil)
- (t
- (goto-char indent-point)
- (setq in-string t))))))
- ((string= "$" w) ;skip $char
- (forward-char 1))
- ((string= "#" w) ;skip comment
- (forward-line 1))
- ((string= "(" w) ;skip to matching paren
- (let ((orig depth))
- (setq nest (cons (point) nest))
- (setq depth (1+ depth))
- (while (and (/= depth orig)
- (re-search-forward "[()]" indent-point t))
- (cond
- ((= (char-after (match-beginning 0)) ?\( )
- (setq nest (cons (point) nest))
- (setq depth (1+ depth)))
- (t
- (setq nest (cdr nest))
- (setq depth (1- depth)))))
- (if (> depth orig) (setq in-paren ?\())))
- ((string= "[" w) ;skip to matching paren
- (let ((orig depth))
- (setq nest (cons (point) nest))
- (setq depth (1+ depth))
- (while (and (/= depth orig)
- (re-search-forward "\\[\\|\\]" indent-point t))
- (cond
- ((= (char-after (match-beginning 0)) ?\[ )
- (setq nest (cons (point) nest))
- (setq depth (1+ depth)))
- (t
- (setq nest (cdr nest))
- (setq depth (1- depth)))))
- (if (> depth orig) (setq in-paren ?\[))))
- ((string= "{" w) ;skip to matching paren
- (let ((orig depth))
- (setq nest (cons (point) nest))
- (setq depth (1+ depth))
- (while (and (/= depth orig)
- (re-search-forward "[{}]" indent-point t))
- (cond
- ((= (char-after (match-beginning 0)) ?{ )
- (setq nest (cons (point) nest))
- (setq depth (1+ depth)))
- (t
- (setq nest (cdr nest))
- (setq depth (1- depth)))))
- (if (> depth orig) (setq in-paren ?{))))
- ((string-match ruby-block-end-re w)
- (setq nest (cdr nest))
- (setq depth (1- depth)))
- ((string-match ruby-block-beg-re w)
- (let (c)
- (save-excursion
- (goto-char pnt)
- (skip-chars-backward " \t")
- (setq c (char-after (1- (point)))))
- (if (or (null c) (= c ?\n) (= c ?\;))
- (progn
- (setq nest (cons (point) nest))
- (setq depth (1+ depth))))))
- (t
- (error (format "bad string %s" w)))))))
- (list in-string in-paren (car nest) depth)))
-
(defun ruby-calculate-indent (&optional parse-start)
(save-excursion
(beginning-of-line)
@@ -413,6 +302,11 @@ The variable ruby-indent-level controls the amount of indentation.
(setq indent (- indent ruby-indent-level)))
indent)))
+(defun ruby-electric-brace (arg)
+ (interactive "P")
+ (self-insert-command (prefix-numeric-value arg))
+ (ruby-indent-line t))
+
(defun ruby-beginning-of-defun (&optional arg)
"Move backward to next beginning-of-defun.
With argument, do this that many times.
@@ -433,12 +327,12 @@ An end of a defun is found by moving forward from the beginning of one."
(defun ruby-reindent-then-newline-and-indent ()
(interactive "*")
+ (save-excursion
+ (delete-region (point) (progn (skip-chars-backward " \t") (point))))
(insert ?\n)
(save-excursion
(forward-line -1)
- (indent-according-to-mode)
- (end-of-line)
- (delete-region (point) (progn (skip-chars-backward " \t") (point))))
+ (indent-according-to-mode))
(indent-according-to-mode))
(defun ruby-encomment-region (beg end)
diff --git a/sample/t2.rb b/sample/t2.rb
index a34c1718372..2e3741e8f19 100644
--- a/sample/t2.rb
+++ b/sample/t2.rb
@@ -16,7 +16,7 @@ def tt
end
end
-test = tt{i|
+test = tt{|i|
if i == 3; break end
println("ttt: ", i);
}
diff --git a/sample/tt.rb b/sample/tt.rb
index 4afa2022e6a..f4960feaea9 100644
--- a/sample/tt.rb
+++ b/sample/tt.rb
@@ -96,5 +96,5 @@ def tt
end
end
-test = tt() {i|break if i == 2}
+test = tt() {|i|break if i == 2}
println([1,2,3,4].join(":"))