#
# 文字列を指定の長さに切り詰める
#
+ @@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
@@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
def enspc
# return(self) # UTF-8 以外ならコメントを生かす
self.gsub(/[\xC0-\xE2][\x80-\xBF]+/) {|c| #### for UTF-8 いーかげん
- c + '_'
+ c + ' '
}
end
}.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")