Skip to content

Commit 21866d8

Browse files
committed
Return array of structs from LocalizableStrings
The returned struct includes any comment associated with the strings file entry. Returning an array allows for future features such as detecting duplicates within a single file.
1 parent 666bb86 commit 21866d8

File tree

2 files changed

+53
-38
lines changed

2 files changed

+53
-38
lines changed

R.swift/Generators/StringsGenerator.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ struct StringsGenerator: Generator {
6767
baseKeys = nil
6868
}
6969
else {
70-
baseKeys = Set(bases.flatMap { $0.dictionary.keys })
70+
baseKeys = Set(bases.flatMap { $0.keys })
7171
}
7272

7373
// Warnings about duplicates and empties
7474
for ls in strings {
7575
let filenameLocale = ls.locale.withFilename(filename)
76-
let groupedKeys = ls.dictionary.keys.groupBySwiftNames { $0 }
76+
let groupedKeys = ls.keys.groupBySwiftNames { $0 }
7777

7878
for (sanitizedName, duplicates) in groupedKeys.duplicates {
7979
warn("Skipping \(duplicates.count) strings in \(filenameLocale) because symbol '\(sanitizedName)' would be generated for all of these keys: \(duplicates.map { "'\($0)'" }.joinWithSeparator(", "))")
@@ -88,13 +88,17 @@ struct StringsGenerator: Generator {
8888
}
8989

9090
// Save uniques
91+
var byKey: [String: LocalizableStrings.Entry] = [:]
92+
for entry in ls.entries {
93+
byKey[entry.key] = entry
94+
}
9195
for key in groupedKeys.uniques {
92-
if let (params, commentValue) = ls.dictionary[key] {
96+
if let entry = byKey[key] {
9397
if let _ = allParams[key] {
94-
allParams[key]?.append((ls.locale, commentValue, params))
98+
allParams[key]?.append((ls.locale, entry.val, entry.params))
9599
}
96100
else {
97-
allParams[key] = [(ls.locale, commentValue, params)]
101+
allParams[key] = [(ls.locale, entry.val, entry.params)]
98102
}
99103
}
100104
}
@@ -105,7 +109,7 @@ struct StringsGenerator: Generator {
105109
let filenameLocale = locale.withFilename(filename)
106110
let sourceKeys = baseKeys ?? Set(allParams.keys)
107111

108-
let missing = sourceKeys.subtract(lss.flatMap { $0.dictionary.keys })
112+
let missing = sourceKeys.subtract(lss.flatMap { $0.keys })
109113

110114
if missing.isEmpty {
111115
continue

R.swift/ResourceTypes/LocalizableStrings.swift

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ struct LocalizableStrings : WhiteListedExtensionsResourceType {
1313

1414
let filename: String
1515
let locale: Locale
16-
let dictionary: [String : (params: [StringParam], commentValue: String)]
16+
let entries: [Entry]
1717

18-
init(filename: String, locale: Locale, dictionary: [String : (params: [StringParam], commentValue: String)]) {
18+
init(filename: String, locale: Locale, entries: [Entry]) {
1919
self.filename = filename
2020
self.locale = locale
21-
self.dictionary = dictionary
21+
self.entries = entries
2222
}
2323

2424
init(url: NSURL) throws {
@@ -37,45 +37,56 @@ struct LocalizableStrings : WhiteListedExtensionsResourceType {
3737
}
3838

3939
// Parse dicts from NSDictionary
40-
let dictionary: [String : (params: [StringParam], commentValue: String)]
40+
let entries: [Entry]
4141
switch url.pathExtension {
4242
case "strings"?:
43-
dictionary = try parseStrings(String(contentsOfURL: url), source: locale.withFilename("\(filename).strings"))
43+
entries = try parseStrings(String(contentsOfURL: url), source: locale.withFilename("\(filename).strings"))
4444
case "stringsdict"?:
45-
dictionary = try parseStringsdict(nsDictionary, source: locale.withFilename("\(filename).stringsdict"))
45+
entries = try parseStringsdict(nsDictionary, source: locale.withFilename("\(filename).stringsdict"))
4646
default:
4747
throw ResourceParsingError.UnsupportedExtension(givenExtension: url.pathExtension, supportedExtensions: LocalizableStrings.supportedExtensions)
4848
}
4949

5050
self.filename = filename
5151
self.locale = locale
52-
self.dictionary = dictionary
52+
self.entries = entries
53+
}
54+
55+
var keys: [String] {
56+
return entries.map { $0.key }
57+
}
58+
59+
struct Entry {
60+
let key: String
61+
let val: String
62+
let params: [StringParam]
63+
let comment: String?
5364
}
5465
}
5566

56-
private func parseStrings(stringsFile: String, source: String) throws -> [String : (params: [StringParam], commentValue: String)] {
57-
var dictionary: [String : (params: [StringParam], commentValue: String)] = [:]
58-
59-
for entry in StringsEntry.parse(stringsFile) {
60-
var params: [StringParam] = []
61-
62-
for part in FormatPart.formatParts(formatString: entry.val) {
63-
switch part {
64-
case .Reference:
65-
throw ResourceParsingError.ParsingFailed("Non-specifier reference in \(source): \(entry.key) = \(entry.val)")
66-
67-
case .Spec(let formatSpecifier):
68-
params.append(StringParam(name: nil, spec: formatSpecifier))
69-
}
67+
private func parseStrings(stringsFile: String, source: String) throws -> [LocalizableStrings.Entry] {
68+
var entries: [LocalizableStrings.Entry] = []
69+
70+
for parsed in StringsFileEntry.parse(stringsFile) {
71+
var params: [StringParam] = []
72+
73+
for part in FormatPart.formatParts(formatString: parsed.val) {
74+
switch part {
75+
case .Reference:
76+
throw ResourceParsingError.ParsingFailed("Non-specifier reference in \(source): \(parsed.key) = \(parsed.val)")
77+
78+
case .Spec(let formatSpecifier):
79+
params.append(StringParam(name: nil, spec: formatSpecifier))
7080
}
71-
72-
dictionary[entry.key] = (params, entry.val)
81+
}
82+
83+
entries.append(LocalizableStrings.Entry(key: parsed.key, val: parsed.val, params: params, comment: parsed.comment))
7384
}
74-
75-
return dictionary
85+
86+
return entries
7687
}
7788

78-
private struct StringsEntry {
89+
private struct StringsFileEntry {
7990
let comment: String?
8091
let key: String
8192
let val: String
@@ -113,15 +124,15 @@ private struct StringsEntry {
113124
val = extract(match.rangeAtIndex(4), unescape: true)!
114125
}
115126

116-
static func parse(stringsFileContents: String) -> [StringsEntry] {
127+
static func parse(stringsFileContents: String) -> [StringsFileEntry] {
117128
return regex.matchesInString(stringsFileContents, options: [], range: NSRange(0..<stringsFileContents.utf16.count))
118-
.map { StringsEntry(source: stringsFileContents, match: $0) }
129+
.map { StringsFileEntry(source: stringsFileContents, match: $0) }
119130
}
120131
}
121132

122-
private func parseStringsdict(nsDictionary: NSDictionary, source: String) throws -> [String : (params: [StringParam], commentValue: String)] {
133+
private func parseStringsdict(nsDictionary: NSDictionary, source: String) throws -> [LocalizableStrings.Entry] {
123134

124-
var dictionary: [String : (params: [StringParam], commentValue: String)] = [:]
135+
var entries: [LocalizableStrings.Entry] = []
125136

126137
for (key, obj) in nsDictionary {
127138
if let
@@ -134,7 +145,7 @@ private func parseStringsdict(nsDictionary: NSDictionary, source: String) throws
134145

135146
do {
136147
let params = try parseStringsdictParams(localizedFormat, dict: dict)
137-
dictionary[key] = (params, localizedFormat)
148+
entries.append(LocalizableStrings.Entry(key: key, val: localizedFormat, params: params, comment: nil))
138149
}
139150
catch ResourceParsingError.ParsingFailed(let message) {
140151
warn("\(message) in '\(key)' \(source)")
@@ -145,7 +156,7 @@ private func parseStringsdict(nsDictionary: NSDictionary, source: String) throws
145156
}
146157
}
147158

148-
return dictionary
159+
return entries
149160
}
150161

151162
private func parseStringsdictParams(format: String, dict: [String: AnyObject]) throws -> [StringParam] {

0 commit comments

Comments
 (0)