class Applocale::ParseCSV

Public Class Methods

new(setting) click to toggle source
# File lib/applocale/Core/ParseCSV/parse_csv.rb, line 25
def initialize(setting)
  @platform = setting.platform
  @csv_directory = setting.export_to
  @langlist = setting.lang_path_list
  @sheetobj_list = setting.sheet_obj_list
  @sheetcontent_list = Array.new
  @allkey_dict = {}
  @all_error = Array.new
  @is_skip_empty_key = setting.is_skip_empty_key
  @convertFile = setting.convert_file
  # puts "Start to Parse CSV: \"#{csv_directory}\" ...".green
  parse
end

Public Instance Methods

find_header(sheet, rows) click to toggle source
# File lib/applocale/Core/ParseCSV/parse_csv.rb, line 80
def find_header(sheet, rows)
  sheet_name = sheet.sheetname
  sheet_info_obj = sheet.obj
  if sheet_info_obj.is_a? Applocale::Config::SheetInfoByHeader

    sheet_language_list = sheet_info_obj.lang_headers
    sheet_key_header = sheet_info_obj.key_header

    header_row_index = nil

    rows.each_with_index {|row,index |
      row.each do |rowValue|
        if rowValue.to_s.strip == sheet_key_header.to_s
          header_row_index = index
          break
        end
        break if !header_row_index.nil?
      end
    }

    header_row_info = rows[header_row_index] unless header_row_index.nil?
    if header_row_info.nil?
      raise "ParseCSVError: Header not found in sheet: #{sheet_name}"
    end
    header_column_index = header_row_info.index { |cell| cell.to_s.strip == sheet_key_header }
    if header_row_index.nil? || header_column_index.nil?
      raise "ParseCSVError: Header not found in sheet #{sheet_name}"
    end
    key_header_info = ParseModelModule::KeyStrWithColNo.new(sheet_key_header, header_column_index)

    language_header_list = sheet_language_list.map do |key, value|
      cell_index = header_row_info.index { |cell| cell.to_s.strip == value }
      cell_index.nil? ? nil : ParseModelModule::LangWithColNo.new(value, key, cell_index)
    end.compact
    unless language_header_list.length == sheet_language_list.length
      raise "ParseCSVError: Wrong language keys in sheet #{sheet_name}"
    end

    {
      header_row_index: header_row_index,
      key_header_info: key_header_info,
      language_header_list: language_header_list
    }
  else
    cell_index = Applocale::ParseXLSXModule::Helper.collabel_to_colno(sheet_info_obj.key_col) - 1
    key_header_info = ParseModelModule::KeyStrWithColNo.new("", cell_index)
    language_header_list = sheet_info_obj.lang_cols.map do |key, value|
      cell_index = Applocale::ParseXLSXModule::Helper.collabel_to_colno(value) - 1
      ParseModelModule::LangWithColNo.new("", key, cell_index)
    end.compact

    {
        header_row_index: -1,
        key_header_info: key_header_info,
        language_header_list: language_header_list
    }
  end
end
handle_duplicate_key_if_any!(row_content) click to toggle source
# File lib/applocale/Core/ParseCSV/parse_csv.rb, line 169
def handle_duplicate_key_if_any!(row_content)
  previous_row_content = @allkey_dict[row_content.key_str.downcase]
  if previous_row_content.nil?
    @allkey_dict[row_content.key_str.downcase] = row_content
  else
    raise "ParseCSVError:: Duplicate keys:\n sheet #{row_content.sheetname}, row: #{row_content.rowno}, key_str: #{row_content.key_str}\nduplicateWithSheet: #{previous_row_content.sheetname}, row: #{previous_row_content.rowno}, key_str: #{previous_row_content.key_str}"
  end
end
parse() click to toggle source
# File lib/applocale/Core/ParseCSV/parse_csv.rb, line 39
def parse
  @sheetcontent_list = @sheetobj_list.map do |sheet_obj|
    sheet_name = sheet_obj.sheetname
    sheet_content = ParseModelModule::SheetContent.new(sheet_name)

    csv_path = File.expand_path("#{sheet_name}.csv", @csv_directory)
    unless File.exist? csv_path
      ErrorUtil.warning("File does not exist: #{csv_path}")
      next
    end
    rows = CSV.read(csv_path)

    header = find_header(sheet_obj, rows)
    sheet_content.header_rowno = header[:header_row_index]
    sheet_content.keyStr_with_colno = header[:key_header_info]
    sheet_content.lang_with_colno_list = header[:language_header_list]

    rows.each_with_index do |row, index|
      next if sheet_content.header_rowno == index
      row_content = parse_row(sheet_name, index, row, sheet_content.keyStr_with_colno, sheet_content.lang_with_colno_list)
      next if row_content.nil?
      toskip = false
      if @convertFile.has_is_skip_by_key
        is_skip_by_key = @convertFile.load_is_skip_by_key(sheet_name, row_content.key_str)
        if is_skip_by_key.to_s.downcase == "true"
          toskip = true
        end
      end
      if !toskip
        handle_duplicate_key_if_any!(row_content)
        sheet_content.rowinfo_list.push(row_content)
      end
    end
    sheet_content
  end
end
parse_row(sheet_name, index, row, key_header_info, language_header_list) click to toggle source
# File lib/applocale/Core/ParseCSV/parse_csv.rb, line 139
def parse_row(sheet_name, index, row, key_header_info, language_header_list)
  key_str = row[key_header_info.colno]
  unless ValidKey.is_validkey(@platform, key_str)
    if (key_str.nil? || key_str.length == 0)
      if !@is_skip_empty_key
        raise "ParseCSVError: Key can not be empty, in sheet #{sheet_name}, row: #{index}, key_str: #{key_str}"
      else
        return
      end
    else
      raise "ParseCSVError: Invaild Key in sheet #{sheet_name}, row: #{index}, key_str: #{key_str}"
    end
  end
  rowinfo = ParseModelModule::RowInfo.new(sheet_name, index, key_str)

  arr = Array.new
  language_header_list.each do |language_header|
    value = row[language_header.colno] || ''
    after_value = ContentUtil.from_excel(value)
    if @convertFile.has_parse_from_excel_or_csv
      value =  @convertFile.load_parse_from_excel_or_csv(sheet_name, key_str, value, after_value)
    else
      value = after_value
    end
    arr.push([language_header.lang, value])
  end
  rowinfo.content_dict = Hash[arr]
  rowinfo
end
result() click to toggle source
# File lib/applocale/Core/ParseCSV/parse_csv.rb, line 76
def result
  @sheetcontent_list
end