[#37492] ReFe 0.6 — Minero Aoki <aamine@...>

あおきです。

27 messages 2003/04/01
[#37525] ReFe 0.7 (Re: ReFe 0.6) — Minero Aoki <aamine@...> 2003/04/06

あおきです。

[#37528] Re: ReFe 0.7 (Re: ReFe 0.6) — Koji Arai <JCA02266@...> 2003/04/07

新井です。

[#37545] Re: ReFe 0.7 (Re: ReFe 0.6) — Kazuhiro NISHIYAMA <zn@...> 2003/04/10

西山和広です。

[#37546] Re: ReFe 0.7 (Re: ReFe 0.6) — Koji Arai <JCA02266@...> 2003/04/10

新井です。

[#37551] Re: ReFe 0.7 (Re: ReFe 0.6) — Kazuhiro NISHIYAMA <zn@...> 2003/04/11

西山和広です。

[#37554] refe.el (Re: ReFe 0.7 (Re: ReFe 0.6)) — Koji Arai <JCA02266@...> 2003/04/12

新井です。

[#37619] net/pop.rbにUIDLコマンドでMessage-Idのリストを取得するメソッド — Keisuke Minami <keisuke@...>

こんにちは。三並です。

18 messages 2003/04/26

[#37622] net/imapのTHREAD Extension 対応 — wanowa.kimura@... (kimura wataru)

 木村といいます。

31 messages 2003/04/27
[#37628] Re: net/imapのTHREAD Extension 対応 — Shugo Maeda <shugo@...> 2003/04/28

前田です。

[#37632] Re: net/imap のTHREAD Extension 対応 — wanowa.kimura@... (kimura wataru) 2003/04/28

 木村といいます。

[#37635] Re: net/imap のTHREAD Extension 対応 — Shugo Maeda <shugo@...> 2003/04/30

前田です。

[#37638] Re: net/imap のTHREAD Extension 対応 — wanowa.kimura@... (kimura wataru) 2003/05/01

 木村です。

[#37641] Re: net/imap のTHREAD Extension 対応 — Shugo Maeda <shugo@...> 2003/05/02

前田です。

[#37647] Re: net/imap のTHREAD Extension 対応 — wanowa.kimura@... (kimura wataru) 2003/05/06

 木村です。

[#37648] マッチした部分を配列にしまう方法 — Hirano Satoshi <hirano@...> 2003/05/07

こんにちは。

[ruby-list:37622] net/imapのTHREAD Extension 対応

From: wanowa.kimura@... (kimura wataru)
Date: 2003-04-27 05:33:57 UTC
List: ruby-list #37622
 木村といいます。

 net/imapをTHREADコマンドに対応させるために、以下のメソッドを
追加してみました。

Net::IMAP#thread(argorithm, search_keys, charset)
Net::IMAP#uid_thread(argorithm, search_keys, charset)

argorithmには"REFERENCES"または"ORDEREDSUBJECT"が指定できます。


 THREAD Extensionの詳細については、以下のインターネットドラフトを
参照してください。
http://www.ietf.org/internet-drafts/draft-ietf-imapext-sort-12.txt


 返値の構造などいまいち確信が持てないので、みなさんのコメントが
いただければと思います。

例)
----------
p imap.uid_thread("REFERENCES", "UNSEEN", "US-ASCII")

#=> [#<Net::IMAP::ThreadMember seqno=2425, children=
       [#<Net::IMAP::ThreadMember seqno=2426, children=
          [#<Net::IMAP::ThreadMember seqno=2427, children=
             [#<Net::IMAP::ThreadMember seqno=2428, children=[]>]>,
           #<Net::IMAP::ThreadMember seqno=2429, children=
             [#<Net::IMAP::ThreadMember seqno=2430, children=[]>]>]>]>,
     #<Net::IMAP::ThreadMember seqno=2431, children=
       [#<Net::IMAP::ThreadMember seqno=2432, children=
          [#<Net::IMAP::ThreadMember seqno=2433, children=[]>]>,
        #<Net::IMAP::ThreadMember seqno=2434, children=[]>]>,
     #<Net::IMAP::ThreadMember seqno=2435, children=[]>]

bladeっぽく書くと、こういうスレッド。
2425
2426
+ 2427
| 2428
+ 2429
  2430

2431
+ 2432
| 2433
+ 2434

2435
----------

 "((3)(4 5))"などのように親のないスレッドのあるときは、seqno=nilの
ダミーのエントリを挿入します。



-- 
kimura wataru
<mailto:wanowa.kimura@nifty.ne.jp>

Attachments (1)

imap.rb.diff (3.14 KB, text/x-diff)
--- imap.rb.org	Sat Jan  4 15:54:06 2003
+++ imap.rb	Sun Apr 27 12:10:31 2003
@@ -818,6 +818,14 @@
       return sort_internal("UID SORT", sort_keys, search_keys, charset)
     end
 
+    def thread(argorithm, search_keys, charset)
+      return thread_internal("THREAD", argorithm, search_keys, charset)
+    end
+
+    def uid_thread(argorithm, search_keys, charset)
+      return thread_internal("UID THREAD", argorithm, search_keys, charset)
+    end
+
     private
 
     CRLF = "\r\n"
@@ -1034,6 +1042,17 @@
       return @responses.delete("SORT")[-1]
     end
 
+    def thread_internal(cmd, argorithm, search_keys, charset)
+      if search_keys.instance_of?(String)
+	search_keys = [RawData.new(search_keys)]
+      else
+	normalize_searching_criteria(search_keys)
+      end
+      normalize_searching_criteria(search_keys)
+      send_command(cmd, argorithm, charset, *search_keys)
+      return @responses.delete("THREAD")[-1]
+    end
+
     def normalize_searching_criteria(keys)
       keys.collect! do |i|
 	case i
@@ -1120,6 +1139,9 @@
 	    ":" + format_internal(data.last)
 	when Array
 	  return data.collect {|i| format_internal(i)}.join(",")
+	when ThreadMember
+	  return data.seqno.to_s +
+	    ":" + data.children.collect {|i| format_internal(i).join(",")}
 	else
 	  raise DataFormatError, data.inspect
 	end
@@ -1144,6 +1166,7 @@
 			  :to, :cc, :bcc, :in_reply_to, :message_id)
     Address = Struct.new(:name, :route, :mailbox, :host)
     ContentDisposition = Struct.new(:dsp_type, :param)
+    ThreadMember = Struct.new(:seqno, :children)
 
     class BodyTypeBasic < Struct.new(:media_type, :subtype,
 				     :param, :content_id,
@@ -1321,6 +1344,8 @@
 	    return list_response
 	  when /\A(?:SEARCH|SORT)\z/ni
 	    return search_response
+	  when /\A(?:THREAD)\z/ni
+	    return thread_response
 	  when /\A(?:STATUS)\z/ni
 	    return status_response
 	  when /\A(?:CAPABILITY)\z/ni
@@ -1868,6 +1893,71 @@
 	  data = []
 	end
 	return UntaggedResponse.new(name, data, @str)
+      end
+
+      def thread_response
+	token = match(T_ATOM)
+	name = token.value.upcase
+	token = lookahead
+
+	if token.symbol == T_SPACE
+	  threads = []
+
+	  while true
+	    shift_token
+	    token = lookahead
+
+	    case token.symbol
+	    when T_LPAR
+	      threads << thread_branch(token)
+	    when T_CRLF
+	      break
+	    end
+	  end
+	else
+	  # no member
+	  threads = []
+	end
+
+	return UntaggedResponse.new(name, threads, @str)
+      end
+
+      def thread_branch(token)
+	rootmember = nil
+	lastmember = nil
+
+	add_member = proc {|seqno|
+	  newmember = ThreadMember.new(seqno, [])
+	  if rootmember.nil?
+	    rootmember = newmember
+	  else
+	    lastmember.children << newmember
+	  end
+	  newmember
+	}
+
+	while true
+	  shift_token    # ignore first T_LPAR
+	  token = lookahead
+
+	  case token.symbol
+	  when T_NUMBER
+	    lastmember = add_member.call(number)
+	  when T_SPACE
+	    # do nothing
+	  when T_LPAR
+	    if rootmember.nil?
+	      # dummy member
+	      lastmember = add_member.call(nil)
+	    end
+
+	    lastmember.children << thread_branch(token)
+	  when T_RPAR
+	    break
+	  end
+	end
+
+	return rootmember
       end
 
       def status_response

In This Thread

Prev Next