1module IRB 2 class << (MagicFile = Object.new) 3 # see parser_magic_comment in parse.y 4 ENCODING_SPEC_RE = %r"coding\s*[=:]\s*([[:alnum:]\-_]+)" 5 6 def open(path) 7 io = File.open(path, 'rb') 8 line = io.gets 9 line = io.gets if line[0,2] == "#!" 10 encoding = detect_encoding(line) 11 internal_encoding = encoding 12 encoding ||= default_src_encoding 13 io.rewind 14 io.set_encoding(encoding, internal_encoding) 15 16 if block_given? 17 begin 18 return (yield io) 19 ensure 20 io.close 21 end 22 else 23 return io 24 end 25 end 26 27 private 28 def detect_encoding(line) 29 return unless line[0] == ?# 30 line = line[1..-1] 31 line = $1 if line[/-\*-\s*(.*?)\s*-*-$/] 32 return nil unless ENCODING_SPEC_RE =~ line 33 encoding = $1 34 return encoding.sub(/-(?:mac|dos|unix)/i, '') 35 end 36 end 37end 38