swift_twine_formatter 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []