OSDN Git Service

Add message edit functions.
[mave/mave.git] / mave_base.rb
index 4355115..8c2c04d 100644 (file)
@@ -62,7 +62,7 @@ class String
        def decode_mh                                                                                           # decode message header
                gsub(/=\?([^?]+)\?(B|Q)\?([^?]+)\?=/i) {
                        $3.decode_ec($2).decode_cs('UTF-8', $1)                         #### now fixed utf-8
-               }
+               }.gsub(/[\x00-\x1F]/, '^x')
        end
 
        def decode_ec(code)                                                                                     # decode encodings
@@ -80,6 +80,8 @@ class String
        @@snippers = {}
        @@each_snippers = {}
        @@current_snip_charset = 'UTF-8'
+#      @@current_snip_charset = 'EUC-JP'
+#      @@current_snip_charset = 'SHIFT_JIS'
 
        def self.bind_snipper(charset)
                @@snippers[charset] = Proc.new
@@ -103,7 +105,7 @@ class String
 
        #-----------------------------------------------------------
        #
-       #       端末の UTF-8 対応の不備を補う
+       #       端末の UTF-8 対応の不備(記号の幅)を補う
        #
        #               http://ja.wikipedia.org/wiki/UTF-8
        #
@@ -112,6 +114,30 @@ class String
                        c + '_'
                }
        end
+
+       #-----------------------------------------------------------
+       #
+       #       Re: をまとめる
+       #
+       def group_re(level = 0, re = 'Re')
+               base = self.dup
+               while(base =~ /^\s*#{re}\^?\d*:/i)
+                       base.sub!(/^\s*#{re}\^?(\d*):\s*/i) {
+                               level += ($1.to_i > 1 ? $1.to_i : 1)
+                               ''
+                       }
+               end
+               (level < 1 ? '' : "#{re}: ") + base
+#              (level < 1 ? '' : "#{re}#{level < 2 ? '' : "^#{level}"}: ") + base  # Re^3 表記
+       end
+
+       #-----------------------------------------------------------
+       #
+       #       Fw: をまとめる
+       #
+       def group_fw(level = 0)
+               group_re(level, 'Fw')
+       end
 end
 
 #===============================================================================
@@ -135,7 +161,7 @@ class Intl
        end
 
        def self.get_text(msgid)
-               @@domains[@@current_domain][msgid] or msgid
+               @@domains[@@current_domain][msgid] || msgid
        end
 end
 
@@ -228,6 +254,22 @@ String.bind_each_snipper('UTF-8') {|str, n, max, proc|                     # 指定の長さに切
        end
 }
 
+String.bind_snipper('EUC-JP') {|str, n|                                                        #### 指定の長さに切り詰める
+       ws = str[0, n * 2].gsub(/[\x80-\xFF][\x80-\xFF]+/, "\xFF\xFF")[0, n]
+       wc = ws.count("\xFF")
+       str.slice(0, n + wc / 2 - wc % 2) + ' ' * (n - ws.length + wc % 2)
+}
+
+String.bind_each_snipper('EUC-JP') {|str, n, max, proc|                        #### 指定の長さに切り詰め、順に行を渡す
+       p = 0; while(p <= str.length)                                                           # '<': 改行文字のみの行は省略
+               break if((max -= 1) < 0)
+               ws = str[p, n * 2].gsub(/[\x80-\xFF][\x80-\xFF]+/, "\xFF\xFF")[0, n]
+               wc = ws.count("\xFF")
+               proc.call(str.slice(p, nn = n + wc / 2 - wc % 2) + ' ' * (n - ws.length + wc % 2))
+               p += nn
+       end
+}
+
 #### TAB 対応
 
 __END__