class PhraseApp::Android::FileFormatter

Public Instance Methods

apply(file_name, locale) click to toggle source
# File lib/phraseapp_android/file_formatter.rb, line 5
def apply(file_name, locale)
  doc = read_locale_file file_name, locale
  formatted = apply_to_xml_doc doc
  File.write locale_file_name(file_name, locale), formatted
end
apply_to_all_files() click to toggle source
# File lib/phraseapp_android/file_formatter.rb, line 49
def apply_to_all_files
  count = 0
  ([nil] + locales).each do |locale|
    apply 'strings', locale
    apply 'arrays', locale
    count += 2
  end
  puts "#{count} files were reformatted.".green
end
apply_to_xml_doc(doc) click to toggle source
# File lib/phraseapp_android/file_formatter.rb, line 11
def apply_to_xml_doc(doc)
  data = {}
  ignore_keys = []

  match_elements doc, 'integer-array', data, ignore_keys
  match_elements doc, 'string-array', data, ignore_keys
  match_elements doc, 'string', data, ignore_keys

  last_name = nil
  builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
    xml.resources('xmlns:tools' => 'http://schemas.android.com/tools') do
      data.keys.sort.each do |k|
        name = k.split('_').first.to_s

        if last_name != name
          xml.comment " #{name} * "
          last_name = name
        end

        attrs = {name: k}
        attrs['tools:ignore'] = 'MissingTranslation' if ignore_keys.include? k

        xml.send data[k][:name], attrs do
          if data[k][:name].end_with?('array')
            data[k][:value].each do |t|
              xml.item t
            end
          else
            xml.text data[k][:value]
          end
        end
      end
    end
  end

  builder.to_xml indent: 4
end

Private Instance Methods

match_elements(doc, node_name, data, ignore_keys) click to toggle source
# File lib/phraseapp_android/file_formatter.rb, line 61
def match_elements(doc, node_name, data, ignore_keys)
  doc.at('//resources').search(node_name).each do |string|
    data[string.attr('name')] = {name: string.name, value: node_name.end_with?('array') ? string.search('item').map(&:text) : string.text}
    ignore_keys << string.attr('name') if string.attr('tools:ignore')
  end
end