Class: Babelish::Csv2Base

Inherits:
Object
  • Object
show all
Defined in:
lib/babelish/csv2base.rb

Direct Known Subclasses

CSV2Android, CSV2JSON, CSV2Php, CSV2Strings

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filename, langs, args = {}) ⇒ Csv2Base

Returns a new instance of Csv2Base.

Raises:

  • (ArgumentError)


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/babelish/csv2base.rb', line 12

def initialize(filename, langs, args = {})
  default_args = {
    :excluded_states => [],
    :state_column => nil,
    :keys_column => 0
  }

  args = default_args.merge!(args)
  args = Thor::CoreExt::HashWithIndifferentAccess.new(args)
  @langs = langs

  # check input types
  raise ArgumentError.new("wrong value of filename: #{filename.inspect}") unless filename.is_a?(String)
  if !@langs.is_a?(Hash) || @langs.size == 0
    raise ArgumentError.new("wrong format or/and langs parameter: #{@langs.inspect}")
  end

  @output_basename = args[:output_basename]
  @output_dir = args[:output_dir].to_s
  @csv_filename = filename
  @excluded_states = args[:excluded_states]
  @state_column = args[:state_column]
  @keys_column = args[:keys_column]
  @default_lang = args[:default_lang]
  @ignore_lang_path = args[:ignore_lang_path]
  @stripping = args[:stripping]
  @languages = []
end

Instance Attribute Details

#csv_filenameObject

Returns the value of attribute csv_filename.



7
8
9
# File 'lib/babelish/csv2base.rb', line 7

def csv_filename
  @csv_filename
end

#default_langObject

Returns the value of attribute default_lang.



8
9
10
# File 'lib/babelish/csv2base.rb', line 8

def default_lang
  @default_lang
end

#excluded_statesObject

Returns the value of attribute excluded_states.



9
10
11
# File 'lib/babelish/csv2base.rb', line 9

def excluded_states
  @excluded_states
end

#ignore_lang_pathObject

Returns the value of attribute ignore_lang_path.



5
6
7
# File 'lib/babelish/csv2base.rb', line 5

def ignore_lang_path
  @ignore_lang_path
end

#keys_columnObject

Returns the value of attribute keys_column.



9
10
11
# File 'lib/babelish/csv2base.rb', line 9

def keys_column
  @keys_column
end

#langsObject

Returns the value of attribute langs.



6
7
8
# File 'lib/babelish/csv2base.rb', line 6

def langs
  @langs
end

#languagesObject

Returns the value of attribute languages.



10
11
12
# File 'lib/babelish/csv2base.rb', line 10

def languages
  @languages
end

#output_basenameObject

Returns the value of attribute output_basename.



4
5
6
# File 'lib/babelish/csv2base.rb', line 4

def output_basename
  @output_basename
end

#output_dirObject

Returns the value of attribute output_dir.



4
5
6
# File 'lib/babelish/csv2base.rb', line 4

def output_dir
  @output_dir
end

#state_columnObject

Returns the value of attribute state_column.



9
10
11
# File 'lib/babelish/csv2base.rb', line 9

def state_column
  @state_column
end

Instance Method Details

#convert(name = @csv_filename) ⇒ Object

Convert csv file to multiple Localizable.strings files for each column



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/babelish/csv2base.rb', line 87

def convert(name = @csv_filename)
  rowIndex     = 0
  excludedCols = []
  defaultCol   = 0

  CSV.foreach(name, :quote_char => '"', :col_sep => ',', :row_sep => :auto) do |row|

    if rowIndex == 0
      #check there's at least two columns
      return unless row.count > 1
    else
      #skip empty lines (or sections)
      next if row == nil or row[@keys_column].nil?
    end

    # go through columns
    row.size.times do |i|
      next if excludedCols.include? i

      #header
      if rowIndex == 0
        # defaultCol can be the keyValue
        defaultCol = i if self.default_lang == row[i]
        # ignore all headers not listed in langs to create files
        (excludedCols << i and next) unless @langs.has_key?(row[i])

        language = Language.new(row[i])
        if @langs[row[i]].is_a?(Array)
          @langs[row[i]].each do |id|
            language.add_language_id(id.to_s)
          end
        else
          language.add_language_id(@langs[row[i]].to_s)
        end
        @languages[i] = language
      elsif !@state_column || (row[@state_column].nil? || row[@state_column] == '' || !@excluded_states.include?(row[@state_column]))
        key = row[@keys_column]
        key.strip! if @stripping
        default_value =  self.default_lang ? row[defaultCol] : nil
        value = self.process_value(row[i], default_value)

        @languages[i].add_content_pair(key, value)
      end
    end

    rowIndex += 1
  end

  write_content
end

#create_file_from_path(file_path) ⇒ Object



41
42
43
44
45
# File 'lib/babelish/csv2base.rb', line 41

def create_file_from_path(file_path)
  path = File.dirname(file_path)
  FileUtils.mkdir_p path
  return File.new(file_path, "w")
end

#default_filepathObject



69
70
71
# File 'lib/babelish/csv2base.rb', line 69

def default_filepath
  Pathname.new(@output_dir) + "#{output_basename}.#{extension}"
end

#extensionObject



64
65
66
67
# File 'lib/babelish/csv2base.rb', line 64

def extension
  #implement in subclass
  ""
end

#get_row_format(row_key, row_value) ⇒ Object



82
83
84
# File 'lib/babelish/csv2base.rb', line 82

def get_row_format(row_key, row_value)
  return "\"" + row_key + "\" = \"" + row_value + "\""
end

#hash_to_output(content = {}) ⇒ Object



165
166
167
168
169
170
171
172
173
# File 'lib/babelish/csv2base.rb', line 165

def hash_to_output(content = {})
  output = ''
  if content && content.size > 0
    content.each do |key, value|
      output += get_row_format(key, value)
    end
  end
  return output
end

#keysObject



47
48
49
50
51
52
53
# File 'lib/babelish/csv2base.rb', line 47

def keys
  @languages.each do |lang|
    next unless lang
    return lang.content.keys unless lang.content.keys.empty?
  end
  return []
end

#language_filepaths(language) ⇒ Object



59
60
61
62
# File 'lib/babelish/csv2base.rb', line 59

def language_filepaths(language)
  #implement in subclass
  []
end

#process_value(row_value, default_value) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/babelish/csv2base.rb', line 73

def process_value(row_value, default_value)
  value = row_value.nil? ? default_value : row_value
  value = "" if value.nil?
  value.gsub!(/\\*\"/, "\\\"") # escape double quotes
  value.gsub!(/\n/, "\\n") # replace new lines with \n, dont strip
  value.strip! if @stripping
  return value.to_utf8
end

#tableObject



55
56
57
# File 'lib/babelish/csv2base.rb', line 55

def table
  output_basename
end

#write_contentObject



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/babelish/csv2base.rb', line 138

def write_content
  info = "List of created files:\n"
  count = 0
  @languages.each do |language|
    next if language.nil?

    files = []
    if @ignore_lang_path
      files << create_file_from_path(default_filepath)
    else
      language_filepaths(language).each do |filename|
        files << create_file_from_path(filename)
      end
    end
    files.each do |file|
      file.write hash_to_output(language.content)
      info += "- #{File.absolute_path(file)}\n"
      count += 1

      file.close
    end
  end

  info = "Created #{count} files.\n" + info
  return info
end