Welcome to mirror list, hosted at ThFree Co, Russian Federation.

tizen.rb « formatters « twine « lib « twine « tools - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5df03c35f494ec87bceeb73c0a85d5f52da9e353 (plain)
1
2
3
4
5
6
7
8
9
10
11
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
40
41
42
43
44
45
46
47
48
49
50
51
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
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
137
# encoding: utf-8
require 'cgi'
require 'rexml/document'

module Twine
  module Formatters
    class Tizen < Abstract
      include Twine::Placeholders

      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'
      ]

      def format_name
        'tizen'
      end

      def extension
        '.xml'
      end

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

      def default_file_name
        'strings.xml'
      end

      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

      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

      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

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

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

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

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

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

      def format_key(key)
        key.upcase
      end

      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
    end
  end
end

Twine::Formatters.formatters << Twine::Formatters::Tizen.new