OSDN Git Service

Add mail move, copy and delete functions.
[mave/mave.git] / mave_base.rb
index f3148ae..b61ea3c 100644 (file)
@@ -82,12 +82,22 @@ class String
        #
        #       文字列を指定の長さに切り詰める
        #
+       @@wsizer = {}
+       @@centerer = {}
        @@snippers = {}
        @@each_snippers = {}
        @@current_snip_charset = 'UTF-8'
 #      @@current_snip_charset = 'EUC-JP'
 #      @@current_snip_charset = 'SHIFT_JIS'
 
+       def self.bind_wsizer(charset)
+               @@wsizer[charset] = Proc.new
+       end
+
+       def self.bind_centerer(charset)
+               @@centerer[charset] = Proc.new
+       end
+
        def self.bind_snipper(charset)
                @@snippers[charset] = Proc.new
        end
@@ -100,6 +110,14 @@ class String
                @@current_snip_charset = charset
        end
 
+       def wsize
+               @@wsizer[@@current_snip_charset].call(self)
+       end
+
+       def center(n, padding = ' ')
+               @@centerer[@@current_snip_charset].call(self, n, padding)
+       end
+
        def snip(n)
                @@snippers[@@current_snip_charset].call(self, n)
        end
@@ -117,7 +135,7 @@ class String
        def enspc
 #              return(self)                                                                                    # UTF-8 以外ならコメントを生かす
                self.gsub(/[\xC0-\xE2][\x80-\xBF]+/) {|c|                               #### for UTF-8 いーかげん
-                       c + '_'
+                       c + ' '
                }
        end
 
@@ -240,16 +258,22 @@ String.bind_decoder('UTF-7') {|str, out_code|                                     # utf-7 decoder
        }.gsub(/\+-/, '+').kconv(String.charset(out_code), Kconv::UTF8)
 }
 
-#### String.wsize                                                                                              # 表示幅を得る
-
-#### String.center                                                                                             # センタリングする
-
 # 11bit: 0xC0-0xDF 0x80-0xBF
 # 16bit: 0xE0-0xEF 0x80-0xBF 0x80-0xBF
 # 21bit: 0xF0-0xF7 0x80-0xBF 0x80-0xBF 0x80-0xBF
 # 26bit: 0xF8-0xFB 0x80-0xBF 0x80-0xBF 0x80-0xBF 0x80-0xBF
 # 31bit: 0xFC-0xFD 0x80-0xBF 0x80-0xBF 0x80-0xBF 0x80-0xBF 0x80-0xBF
 
+String.bind_wsizer('UTF-8') {|str|                                                             # 表示幅を得る
+       str.gsub(/[\xC0-\xFD][\x80-\xBF]+/, "\xFF\xFF").length
+}
+
+String.bind_centerer('UTF-8') {|str, n, padding|                               # センタリングする
+       w = n - str.wsize
+       w = 0 if(w < 0)
+       (padding * (w >> 1) + str + padding * w).snip(n)
+}
+
 String.bind_snipper('UTF-8') {|str, n|                                                 # 指定の長さに切り詰める
        ws = str[0, n * 2].gsub(/[\xC0-\xFD][\x80-\xBF]+/, "\xFF\xFF")[0, n]
        wc = ws.count("\xFF")