Class: TECS_LANG

Inherits:
Object show all
Defined in:
lib/tecsgen/core/tecs_lang.rb

Overview

言語に関する変数を設定

メッセージファイルの読み込みも行う (読み込みに失敗した場合、デフォルトの文字コードに変更する)

Constant Summary collapse

CHARSET_ALIAS =

ハッシュのタグは case insensitive のため、大文字の文字列とする

{
  "UJIS" => :eucJP,
  "UTF-8" => :utf8,
  "EUCJP" => :eucJP,   # 以下 case insensitive にするため
  "SJIS" => :sjis,
  "UTF8" => :utf8,
  "ISO8859-1" => :"iso8859-1"
}
LANG_ALIAS =
{
  "C" => :en_US,
  "EN_US" => :en_US,   # 以下 case insensitive にするため
  "JA_JP" => :ja_JP
}
SUITABLE_CHARSET =
{
  :ja_JP => [:eucJP, :sjis, :utf8],
  :en_US => [:"iso8859-1", :utf8, nil]
}

Class Method Summary collapse

Class Method Details

.codepage_to_lang(cp) ⇒ Object

codepage から LANG の設定文字列に変換



118
119
120
121
122
123
124
# File 'lib/tecsgen/core/tecs_lang.rb', line 118

def self.codepage_to_lang(cp)
  if cp == "932"
    "ja_JP.sjis"
  else
    "en_US"
  end
end

.get_win_codepageObject

codepage を取り出す

codepage は3〜5桁の整数として仮定



109
110
111
112
113
114
115
# File 'lib/tecsgen/core/tecs_lang.rb', line 109

def self.get_win_codepage
  cmd_pipe = IO.popen("cmd /c chcp", "r")
  cmd_pipe.read =~ /([0-9]{3,5})/
  cp = $1
  cmd_pipe.close
  return cp
end

.parse_lang(lang) ⇒ Object

LANG のパース

lang::String “ja_JP.eucJP@cjknarrow”, “C” など

RETURN
:ja_JP, :eucJP, :cjknarrow


64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/tecsgen/core/tecs_lang.rb', line 64

def self.parse_lang(lang)
  lang =~ /([^\.@]*)(\.([^@]*))?(@(.*))?/

  lang_terri = $1.to_sym if !$1.nil? && $1 != ""
  # set_kcode_binary により、C.UTF-8 のみを特別扱いする必要がなくなった
  # if lang_terri == :C then    # LANG=C.* は、すべて 1 byte 文字コードとして扱う
  #  codeset = nil
  #  modifier = nil
  # else
    codeset = $3.to_sym if !$3.nil? && $3 != ""
    modifier = $5.to_sym if !$5.nil? && $5 != ""
  # end
  [lang_terri, codeset, modifier]
end

.resolve_alias_and_check(lang, charset) ⇒ Object

lang, charset の別明解決および妥当性のチェック

lang::Symbol : :en_US, :ja_JP など charset::Symbol : :eucJP, :utf8 など RETURN:

[ lang, charset, result ]::  result = false の場合 lang, charset は不適切


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/tecsgen/core/tecs_lang.rb', line 84

def self.resolve_alias_and_check(lang, charset)
  if LANG_ALIAS[lang.to_s.upcase]
    ln = LANG_ALIAS[lang.to_s.upcase]
  else
    ln = lang
  end

  if CHARSET_ALIAS[charset.to_s.upcase]
    cs = CHARSET_ALIAS[charset.to_s.upcase]
  else
    cs = charset
  end

  if SUITABLE_CHARSET[ln].nil? || SUITABLE_CHARSET[ln].index(cs).nil?
    res = false
  else
    res = true
  end

  # p ln, cs, res
  [ln, cs, res]
end

.set_encoding_varObject

言語情報から Encoding に関する変数を設定



188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/tecsgen/core/tecs_lang.rb', line 188

def self.set_encoding_var
  # 文字コードの設定
  case $CHARSET_FILE           # string: "EUC" | "SJIS" | "NONE" | "UTF8"
  when :eucJP
    $ENCODING_CDL = Encoding::EUC_JP
    $Ruby19_File_Encode = "ASCII-8BIT"
  when :sjis
    $ENCODING_CDL = Encoding::Shift_JIS
    $Ruby19_File_Encode = "Shift_JIS"
  when :utf8
    $ENCODING_CDL = Encoding::UTF_8
    $Ruby19_File_Encode = "ASCII-8BIT"
  else
    $ENCODING_CDL = Encoding::BINARY
    $Ruby19_File_Encode = "ASCII-8BIT"
  end

  case $CHARSET_CONSOLE
  when :eucJP
    $ENCODING_CONSOLE = Encoding::EUC_JP
  when :sjis
    $ENCODING_CONSOLE = Encoding::Shift_JIS
  when :utf8
    $ENCODING_CONSOLE = Encoding::UTF_8
  else
    $ENCODING_CONSOLE = Encoding::BINARY
  end

  $ENCODING_TECSGEN = Encoding::UTF_8 # const:
end

.set_lang_by_optionObject

-k オプションからファイル用の言語、文字コード変数を設定



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/tecsgen/core/tecs_lang.rb', line 158

def self.set_lang_by_option
  if $kcode.nil?
    return
  end

  code = $kcode
  found = false
  res = $CODE_TYPE_ARRAY.index(code)
  if res.nil?
    print "-k: illegal kcode type #{code}. (#{$CODE_TYPE_ARRAY.join(", ")})\n"
    exit 1
  end

  case $kcode
  when "euc"
    $CHARSET_FILE = :eucJP
    $LANG_FILE = :ja_JP
  when "sjis"
    $CHARSET_FILE = :sjis
    $LANG_FILE = :ja_JP
  when "utf8"
    $CHARSET_FILE = :utf8
    $LANG_FILE = :ja_JP
  when "none"
    $CHARSET_FILE = nil
    $LANG_FILE = "en_US"
  end
end

.set_lang_varObject

言語、文字コードに関する変数を設定

以下の順にチェックされ、一番最後に設定された値が採用される

・デフォルト
・codepage  (exerb 版で TERM 未設定または TERM=cygwin の場合のみ)
・LANG 環境変数
・TECSGEN_LANG 環境変数
・TECSGEN_FILE_LANG 環境変数 (ファイルの文字コードのみ)
・-k オプション (ファイルの文字コードのみ)


134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/tecsgen/core/tecs_lang.rb', line 134

def self.set_lang_var
  if ENV["LANG"]
    # 非 exerb 版では LANG 環境変数を見る
    # cygwin console では codepage に従って出力した方が平和なため

    $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["LANG"])
    $LANG_CONSOLE = $LANG_FILE
    $CHARSET_CONSOLE = $CHARSET_FILE
  end

  if ENV["TECSGEN_LANG"]
    $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["TECSGEN_LANG"])
    $LANG_CONSOLE = $LANG_FILE
    $CHARSET_CONSOLE = $CHARSET_FILE
  end

  if ENV["TECSGEN_FILE_LANG"]
    $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang(ENV["TECSGEN_FILE_LANG"])
  end

  self.set_lang_by_option
end