Эх сурвалжийг харах

feat: config-importer support ref, enum functions.

LanzaSchneider 1 жил өмнө
parent
commit
a48a9764af

+ 71 - 9
editor/tools/config-importer.rb

@@ -6,8 +6,8 @@ config_path = options['config_path']
 ini_path = options['generate_ini_path']
 text_path = options['generate_text_path']
 code_path = options['generate_code_path']
-is_generate_field_info = options['source_text_language']
-language = options['generate_field_info']
+language = options['source_text_language']
+is_generate_field_info = options['generate_field_info']
 
 recreate_dir ini_path
 recreate_dir text_path
@@ -18,7 +18,7 @@ require 'csv'
 # 各类型定义
 TypeInfo = Struct.new(:data_type, :data_type_extra, :ref_info, :default_value)
 FieldInfo = Struct.new(:column_id, :identifier, :comment, :type_info)
-Table = Struct.new(:csv, :fields, :name2id, :id_field)
+Table = Struct.new(:csv, :fields, :name2id, :id_field, :raw_name)
 Ini = Struct.new(:io, :tables)
 inis = {}
 
@@ -31,7 +31,7 @@ Dir["#{config_path}/*"].each do |path|
   # 内含全部子 .csv 表格的导入数据
   Dir["#{path}/*.csv"].each do |file|
     table_name = File::basename(file, '.csv')
-    table = (ini.tables[convert_case(table_name)] = Table.new(csv = CSV.open(file), [], {}, nil))
+    table = (ini.tables[convert_case(table_name)] = Table.new(csv = CSV.open(file), [], {}, nil, table_name))
     identifiers = csv.readline
     comments = csv.readline
     type_infos = csv.readline
@@ -44,7 +44,7 @@ Dir["#{config_path}/*"].each do |path|
       type_infos[index].gsub(/\s+/, '').scan(/[(:|,|@|=)][a-zA-Z_]+/).each do |info|
         type_info.data_type = info[1..info.size] if info.start_with?(':')
         type_info.data_type_extra = info[1..info.size] if info.start_with?(',')
-        type_info.ref_info = info[1..info.size] if info.start_with?('@')
+        type_info.ref_info = convert_case(info[1..info.size]) if info.start_with?('@')
         type_info.default_value = info[1..info.size] if info.start_with?('=')
       end
       field = FieldInfo.new(index, identifier, comments[index], type_info)
@@ -75,12 +75,20 @@ Dir["#{config_path}/*"].each do |path|
   end
 end
 
+# 所有表格缓存
+tables = inis.values.collect{|ini| ini.tables}.inject(:merge)
+
 # 导入实际数据条目
 inis.each_pair do |ini_name, ini_data|
   register_table = {}
+  enum_table = {}
   buffer = StringIO.new
+  # 逐目录生成 ini
   ini_data.tables.each_pair do |table_name, table|
     register = (register_table[table_name] = [])
+    texts = {}
+    count = 0
+    # 逐行扫描
     while !table.csv.eof?
       line = table.csv.readline
       id = line[table.id_field.column_id].upcase
@@ -88,18 +96,72 @@ inis.each_pair do |ini_name, ini_data|
       table.fields.each do |field|
         value = line[field.column_id]
         next if value.nil? || value.empty?
+        # 引用名替换处理
+        if field.type_info.ref_info
+          ref_table = tables[field.type_info.ref_info]
+          value = value.split(',').collect do |ref_name|
+            ref_table.name2id[ref_name] || ref_name
+          end.join(',')
+        # 数据类型处理
+        else
+          case field.type_info.data_type
+          # 文本内容
+          when 'text'
+            index = 0
+            value = value.split(',').collect do |text|
+              key = "C:#{table_name.upcase}:#{field.column_id}:#{count}"
+              key = "#{key}:#{index}" if index > 0
+              texts[key] = text
+              index += 1
+              key
+            end.join(',')
+          # 枚举内容
+          when 'enum'
+            case field.type_info.data_type_extra
+            # 自动型枚举
+            when 'auto'
+              enum_key = "#{table_name}#{field.identifier}"
+              value.split(',').each do |v|
+                enums = (enum_table[enum_key] ||= {})
+                enums[v] = enums.size
+              end
+            end
+          end
+        end
         buffer.puts "#{field.identifier}=#{value}"
+        count += 1
       end
       buffer.puts
       register << id
     end
+    # 导出语言表
+    if !texts.empty?
+      csf = CSV.open("#{text_path}/#{table.raw_name}.csv", 'wb')
+      csf << ['', language]
+      texts.keys.sort.each do |k|
+        csf << [k, texts[k]]
+      end
+    end
   end
+  # 导出 ini
   File.open("#{ini_path}/#{ini_name}.ini", 'wb') do |ini|
-    ini.puts '[REGISTER]'
-    register_table.each_pair do |table_name, register|
-      ini.puts "#{table_name}=#{register.join(',')}"
+    # 导出注册表
+    if !register_table.empty?
+      ini.puts '[REGISTER]'
+      register_table.each_pair do |table_name, register|
+        ini.puts "#{table_name}=#{register.join(',')}"
+      end
+      ini.puts
+    end
+    # 导出枚举
+    if !enum_table.empty?
+      ini.puts '[ENUM]'
+      enum_table.keys.sort.each do |enum_name|
+        ini.puts "#{enum_name}=#{enum_table[enum_name].keys.join(',')}"
+      end
+      ini.puts
     end
-    ini.puts
+    # 导出所有条目
     ini.puts buffer.string
   end
 end