Class: Twine::Formatters::Tizen

Inherits:
Abstract
  • Object
show all
Includes:
Placeholders
Defined in:
lib/twine/formatters/tizen.rb

Constant Summary collapse

LANG_CODES =
Hash[
  'eng-GB' => 'en',
  'rus-RU' => 'ru',
  'fra-FR' => 'fr',
  'deu-DE' => 'de',
  'spa-ES' => 'es',
  'ita-IT' => 'it',
  'ces-CZ' => 'cs',
  'pol-PL' => 'pl',
  'por-PT' => 'pt',
  'ukr-UA' => 'uk'
]

Constants included from Placeholders

Placeholders::PLACEHOLDER_FLAGS_WIDTH_PRECISION_LENGTH, Placeholders::PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH, Placeholders::PLACEHOLDER_REGEX, Placeholders::PLACEHOLDER_TYPES

Constants inherited from Abstract

Abstract::LANGUAGE_CODE_WITH_OPTIONAL_REGION_CODE

Instance Attribute Summary

Attributes inherited from Abstract

#options, #twine_file

Instance Method Summary collapse

Methods included from Placeholders

#contains_python_specific_placeholder, #convert_placeholders_from_android_to_twine, #convert_placeholders_from_flash_to_twine, #convert_placeholders_from_twine_to_android, #convert_placeholders_from_twine_to_flash, #convert_twine_string_placeholder, #number_of_twine_placeholders

Methods inherited from Abstract

#escape_quotes, #format_definition, #format_file, #format_key_value, #format_section, #initialize, #output_path_for_language, #set_comment_for_key, #set_translation_for_key, #should_include_definition

Constructor Details

This class inherits a constructor from Twine::Formatters::Abstract

Instance Method Details

#can_handle_directory?(path) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/twine/formatters/tizen.rb', line 31

def can_handle_directory?(path)
  Dir.entries(path).any? { |item| /^values.*$/.match(item) }
end

#default_file_nameObject



35
36
37
# File 'lib/twine/formatters/tizen.rb', line 35

def default_file_name
  'strings.xml'
end

#determine_language_given_path(path) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/twine/formatters/tizen.rb', line 39

def determine_language_given_path(path)
  path_arr = path.split(File::SEPARATOR)
  path_arr.each do |segment|
    match = /^(.*-.*)\.xml$/.match(segment)
    if match
      lang = match[1]
      lang = LANG_CODES.fetch(lang, nil)
      return lang
    end
  end
  return
end

#extensionObject



27
28
29
# File 'lib/twine/formatters/tizen.rb', line 27

def extension
  '.xml'
end

#format_comment(definition, lang) ⇒ Object



109
110
111
# File 'lib/twine/formatters/tizen.rb', line 109

def format_comment(definition, lang)
  "\t<!-- #{definition.comment.gsub('--', '')} -->\n" if definition.comment
end

#format_header(lang) ⇒ Object



93
94
95
# File 'lib/twine/formatters/tizen.rb', line 93

def format_header(lang)
  "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Tizen Strings File -->\n<!-- Generated by Twine #{Twine::VERSION} -->\n<!-- Language: #{lang} -->"
end

#format_key(key) ⇒ Object



117
118
119
# File 'lib/twine/formatters/tizen.rb', line 117

def format_key(key)
  key.upcase
end

#format_nameObject



23
24
25
# File 'lib/twine/formatters/tizen.rb', line 23

def format_name
  'tizen'
end

#format_section_header(section) ⇒ Object



105
106
107
# File 'lib/twine/formatters/tizen.rb', line 105

def format_section_header(section)
  "\t<!-- SECTION: #{section.name} -->"
end

#format_sections(twine_file, lang) ⇒ Object



97
98
99
100
101
102
103
# File 'lib/twine/formatters/tizen.rb', line 97

def format_sections(twine_file, lang)
  result = '<string_table  Bversion="2.0.0.201311071819" Dversion="20120315">'
  
  result += super + "\n"

  result += "</string_table>\n"
end

#format_value(value) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/twine/formatters/tizen.rb', line 121

def format_value(value)
  value = escape_quotes(value)
  # Tizen enforces the following rules on the values
  #  1) apostrophes and quotes must be escaped with a backslash
  value.gsub!("'", "\\\\'")
  #  2) HTML escape the string
  value = CGI.escapeHTML(value)
  #  3) fix substitutions (e.g. %s/%@)
  value = convert_placeholders_from_twine_to_android(value)
  #  4) replace beginning and end spaces with \0020. Otherwise Tizen strips them.
  value.gsub(/\A *| *\z/) { |spaces| '\u0020' * spaces.length }
end

#key_value_patternObject



113
114
115
# File 'lib/twine/formatters/tizen.rb', line 113

def key_value_pattern
  "\t<text id=\"IDS_%{key}\">%{value}</text>"
end

#read(io, lang) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/twine/formatters/tizen.rb', line 52

def read(io, lang)
  resources_regex = /<resources(?:[^>]*)>(.*)<\/resources>/m
  key_regex = /<string name="(\w+)">/
  comment_regex = /<!-- (.*) -->/
  value_regex = /<string name="\w+">(.*)<\/string>/
  key = nil
  value = nil
  comment = nil

  content_match = resources_regex.match(io.read)
  if content_match
    for line in content_match[1].split(/\r?\n/)
      key_match = key_regex.match(line)
      if key_match
        key = key_match[1]
        value_match = value_regex.match(line)
        if value_match
          value = value_match[1]
          value = CGI.unescapeHTML(value)
          value.gsub!('\\\'', '\'')
          value.gsub!('\\"', '"')
          value = convert_placeholders_from_android_to_twine(value)
          value.gsub!(/(\\u0020)*|(\\u0020)*\z/) { |spaces| ' ' * (spaces.length / 6) }
        else
          value = ""
        end
        set_translation_for_key(key, lang, value)
        if comment and comment.length > 0 and !comment.start_with?("SECTION:")
          set_comment_for_key(key, comment)
        end
        comment = nil
      end

      comment_match = comment_regex.match(line)
      if comment_match
        comment = comment_match[1]
      end
    end
  end
end