swift_twine_formatter 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e2272da7485deb67f7e7023bffbac8f87127c5555c21e692a5fe9e972b41eca6
4
- data.tar.gz: bdc16f04960875eb0e4134b7bc315d0d14909de31506ca0efdd56cbfbd1651e3
3
+ metadata.gz: 5af7fc7a12fbf3bd74e7528d479d82f944c6e1739d9680fee8f20a41f9aefd59
4
+ data.tar.gz: ff42a10cd9f7b34d6b061a2ea24872b2a6d8d174aba80ab44f4cbfb1dbc544e3
5
5
  SHA512:
6
- metadata.gz: 1b1e4aeb431366dcea212bda82197b3e194e6dde51678ab71a4a22a50325a212f8caa37375f0a19e6d58262d608a995e788a392026bd94cc0acd4bc3bc359bdc
7
- data.tar.gz: 64f085976f745a6bde6eaaf9bb926c6417ddbb14bf0d4174106866fe1cdfe05f3fc7555932f40b9f7a2e62a5ddf6fd2e2023584d68043bdb39a60379a0020753
6
+ metadata.gz: a229f26a7c1f6f90c7d3ec18d051feaf646b0361b24b5cccfc7cc2818f6b76793103d77e570586ddec232aa5e26d58fcbaa751094e6067a3eed93d1eb09e01e7
7
+ data.tar.gz: 255b479da399d1d0219adcfd40d7e6f07729628e32c1183df0850e4f371f5b95d9e4254b891269856d5e1fcb3eea207664381f0c700776d5a08b55014ef6509e
data/lib/formatter.rb CHANGED
@@ -6,6 +6,11 @@
6
6
  module Twine
7
7
  module Formatters
8
8
  class SwiftFormatter < Abstract
9
+
10
+ PLACEHOLDER_FLAGS_WIDTH_PRECISION_LENGTH = '([-+0#])?(\d+|\*)?(\.(\d+|\*))?(hh?|ll?|L|z|j|t|q)?'
11
+ PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH = '(\d+\$)?' + PLACEHOLDER_FLAGS_WIDTH_PRECISION_LENGTH
12
+ PLACEHOLDER_TYPES = '[diufFeEgGxXoscpaA@]'
13
+
9
14
  def format_name
10
15
  'swift'
11
16
  end
@@ -89,6 +94,104 @@ module Twine
89
94
  end
90
95
 
91
96
  def format_value(value)
97
+ escape_quotes(value)
98
+ end
99
+ end
100
+
101
+ class SwiftEscapingFormatter < Abstract
102
+
103
+ PLACEHOLDER_FLAGS_WIDTH_PRECISION_LENGTH = '([-+0#])?(\d+|\*)?(\.(\d+|\*))?(hh?|ll?|L|z|j|t|q)?'
104
+ PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH = '(\d+\$)?' + PLACEHOLDER_FLAGS_WIDTH_PRECISION_LENGTH
105
+ PLACEHOLDER_TYPES = '[diufFeEgGxXoscpaA@]'
106
+
107
+ def format_name
108
+ 'swift-escaping'
109
+ end
110
+
111
+ def extension
112
+ '.strings'
113
+ end
114
+
115
+ def can_handle_directory?(path)
116
+ Dir.entries(path).any? { |item| /^.+\.lproj$/.match(item) }
117
+ end
118
+
119
+ def default_file_name
120
+ 'Localizable.strings'
121
+ end
122
+
123
+ def determine_language_given_path(path)
124
+ path_arr = path.split(File::SEPARATOR)
125
+ path_arr.each do |segment|
126
+ match = /^(.+)\.lproj$/.match(segment)
127
+ if match
128
+ if match[1] == "Base"
129
+ return @options[:developer_language]
130
+ else
131
+ return match[1]
132
+ end
133
+ end
134
+ end
135
+
136
+ return super
137
+ end
138
+
139
+ def output_path_for_language(lang)
140
+ "#{lang}.lproj"
141
+ end
142
+
143
+ def read(io, lang)
144
+ last_comment = nil
145
+ while line = io.gets
146
+ # matches a `key = "value"` line, where key may be quoted or unquoted. The former may also contain escaped characters
147
+ match = /^\s*((?:"(?:[^"\\]|\\.)+")|(?:[^"\s=]+))\s*=\s*"((?:[^"\\]|\\.)*)"/.match(line)
148
+ if match
149
+ key = match[1]
150
+ key = key[1..-2] if key[0] == '"' and key[-1] == '"'
151
+ key.gsub!('\\"', '"')
152
+ value = match[2]
153
+ value.gsub!('\\"', '"')
154
+ set_translation_for_key(key, lang, value)
155
+ if last_comment
156
+ set_comment_for_key(key, last_comment)
157
+ end
158
+ end
159
+
160
+ match = /\/\* (.*) \*\//.match(line)
161
+ if match
162
+ last_comment = match[1]
163
+ else
164
+ last_comment = nil
165
+ end
166
+ end
167
+ end
168
+
169
+ def format_header(lang)
170
+ "//\n// Apple Strings File\n// Generated by Twine #{Twine::VERSION}\n//\n// Language: #{lang}\n//"
171
+ end
172
+
173
+ def format_section_header(section)
174
+ "// MARK: - #{section.name}\n"
175
+ end
176
+
177
+ def key_value_pattern
178
+ "\"%{key}\" = \"%{value}\";"
179
+ end
180
+
181
+ def format_comment(definition, lang)
182
+ "/* #{definition.comment.gsub('*/', '* /')} */\n" if definition.comment
183
+ end
184
+
185
+ def format_key(key)
186
+ escape_quotes(key)
187
+ end
188
+
189
+ def format_value(value)
190
+ # added escaping for % (% -> %%) to support SwiftGen
191
+ placeholder_syntax = PLACEHOLDER_PARAMETER_FLAGS_WIDTH_PRECISION_LENGTH + PLACEHOLDER_TYPES
192
+ single_percent_regex = /([^%])(%)(?!(%|#{placeholder_syntax}))/
193
+ value.gsub! single_percent_regex, '\1%%'
194
+
92
195
  escape_quotes(value)
93
196
  end
94
197
  end
@@ -4,3 +4,4 @@ require 'twine'
4
4
  require_relative 'formatter'
5
5
 
6
6
  Twine::Formatters.formatters << Twine::Formatters::SwiftFormatter.new
7
+ Twine::Formatters.formatters << Twine::Formatters::SwiftEscapingFormatter.new
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swift_twine_formatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergei Romashenko
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-01 00:00:00.000000000 Z
11
+ date: 2023-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: twine
@@ -24,7 +24,8 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.1.3
27
- description: Plugin to generate .strings files with classic comments and marks format.
27
+ description: Plugin to generate .strings files with swift (SwiftGen compatible) comments
28
+ and marks format, and escaping percent symbol.
28
29
  email:
29
30
  - romashenko.sergey@gmail.com
30
31
  executables: []
@@ -33,11 +34,11 @@ extra_rdoc_files: []
33
34
  files:
34
35
  - lib/formatter.rb
35
36
  - lib/swift_twine_formatter.rb
36
- homepage:
37
+ homepage: https://github.com/sergeirr/swift_twine_formatter
37
38
  licenses:
38
39
  - MIT
39
40
  metadata: {}
40
- post_install_message:
41
+ post_install_message:
41
42
  rdoc_options: []
42
43
  require_paths:
43
44
  - lib
@@ -52,8 +53,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
53
  - !ruby/object:Gem::Version
53
54
  version: '0'
54
55
  requirements: []
55
- rubygems_version: 3.4.17
56
- signing_key:
56
+ rubygems_version: 3.4.13
57
+ signing_key:
57
58
  specification_version: 4
58
- summary: Plugin to generate .strings files with classic comments and marks format
59
+ summary: Plugin to generate .strings files with swift (SwiftGen compatible) comments
60
+ and marks format, and escaping percent symbol
59
61
  test_files: []