From 8c1b0e89210545b62450a8152b02719b1aa78f10 Mon Sep 17 00:00:00 2001 From: David Jennes Date: Wed, 24 May 2017 21:41:14 +0200 Subject: [PATCH 1/4] Refactor asset catalog code to use our own parsing instead of `actool`. --- Sources/Parsers/AssetsCatalogParser.swift | 214 +++++++++------------ Sources/Stencil/AssetsCatalogContext.swift | 14 +- Tests/SwiftGenKitTests/ImagesTests.swift | 4 +- 3 files changed, 101 insertions(+), 131 deletions(-) diff --git a/Sources/Parsers/AssetsCatalogParser.swift b/Sources/Parsers/AssetsCatalogParser.swift index 48a5217..1a3aa7f 100644 --- a/Sources/Parsers/AssetsCatalogParser.swift +++ b/Sources/Parsers/AssetsCatalogParser.swift @@ -7,37 +7,56 @@ import Foundation import PathKit +public enum AssetCatalogParserError: Error, CustomStringConvertible { + case invalidFile + + public var description: String { + switch self { + case .invalidFile: + return "error: File must be an asset catalog" + } + } +} + +struct Catalog { + enum Entry { + case group(name: String, items: [Entry]) + case image(name: String, value: String) + } + + let name: String + let entries: [Entry] +} + public final class AssetsCatalogParser { - typealias Catalog = [Entry] - var catalogs = [String: Catalog]() + var catalogs = [Catalog]() public init() {} - public func parseCatalog(at path: Path) { - guard let items = loadAssetCatalog(at: path) else { return } + public func parseCatalog(at path: Path) throws { + guard path.extension == AssetCatalog.extension else { + throw AssetCatalogParserError.invalidFile + } + let name = path.lastComponentWithoutExtension + let entries = process(folder: path) - // process recursively (and append if already exists) - var catalog = catalogs[name] ?? Catalog() - catalog += process(items: items) - catalogs[name] = catalog - } - - enum Entry { - case group(name: String, items: [Entry]) - case image(name: String, value: String) + catalogs += [Catalog(name: name, entries: entries)] } } // MARK: - Plist processing private enum AssetCatalog { - static let children = "children" - static let filename = "filename" - static let providesNamespace = "provides-namespace" - static let root = "com.apple.actool.catalog-contents" + static let `extension` = "xcassets" + + enum Contents { + static let path = "Contents.json" + static let properties = "properties" + static let providesNamespace = "provides-namespace" + } - enum Extension { + enum Item { static let imageSet = "imageset" /** @@ -45,10 +64,6 @@ private enum AssetCatalog { * support `image set`s. If you want to add support for new types, just add * it to this whitelist, and add the necessary code to the * `process(items:withPrefix:)` method. - * - * Note: The `actool` utility that we use for parsing hase some issues. Check - * this issue for more information: - * https://github.com/SwiftGen/SwiftGen/issues/228 */ static let supported = [imageSet] } @@ -56,117 +71,70 @@ private enum AssetCatalog { extension AssetsCatalogParser { /** - This method recursively parses a tree of nodes (similar to a directory structure) - resulting from the `actool` utility. - + This method recursively parses a directory structure, processing each folder (files are ignored). + */ + func process(folder: Path, withPrefix prefix: String = "") -> [Catalog.Entry] { + return (try? folder.children().flatMap { + process(item: $0, withPrefix: prefix) + }) ?? [] + } + + /** Each node in an asset catalog is either (there are more types, but we ignore those): - - An imageset, which is essentially a group containing a list of files (the latter is ignored). - - - children - - ...actual file items here (for example the 1x, 2x and 3x images)... - - filename - Tomato.imageset - - - - A group, containing sub items such as imagesets or groups. A group can provide a namespaced, - which means that all the sub items will have to be prefixed with their parent's name. - - - children - - ...sub items such as groups or imagesets... - - filename - Round - provides-namespace - - + - An imageset, which is essentially a group containing a list of files (the latter is ignored). - - Parameter items: The array of items to recursively process. + - A group, containing sub items such as imagesets or groups. A group can provide a namespaced, + which means that all the sub items will have to be prefixed with their parent's name. + + { + "properties" : { + "provides-namespace" : true + } + } + + - Parameter folder: The directory path to recursively process. - Parameter prefix: The prefix to prepend values with (from namespaced groups). - Returns: An array of processed Entry items (a catalog). */ - fileprivate func process(items: [[String: Any]], withPrefix prefix: String = "") -> Catalog { - var result = Catalog() - - for item in items { - guard let filename = item[AssetCatalog.filename] as? String else { continue } - let path = Path(filename) - - if path.extension == AssetCatalog.Extension.imageSet { - // this is a simple imageset - let imageName = path.lastComponentWithoutExtension - - result += [.image(name: imageName, value: "\(prefix)\(imageName)")] - } else if path.extension == nil || AssetCatalog.Extension.supported.contains(path.extension ?? "") { - // this is a group/folder - let children = item[AssetCatalog.children] as? [[String: Any]] ?? [] - - if let providesNamespace = item[AssetCatalog.providesNamespace] as? Bool, - providesNamespace { - let processed = process(items: children, withPrefix: "\(prefix)\(filename)/") - result += [.group(name: filename, items: processed)] - } else { - let processed = process(items: children, withPrefix: prefix) - result += [.group(name: filename, items: processed)] - } - } + func process(item: Path, withPrefix prefix: String) -> Catalog.Entry? { + guard item.isDirectory else { return nil } + let type = item.extension ?? "" + + switch (type, AssetCatalog.Item.supported.contains(type)) { + case (AssetCatalog.Item.imageSet, _): + let name = item.lastComponentWithoutExtension + return .image(name: name, value: "\(prefix)\(name)") + case ("", _), (_, true): + let filename = item.lastComponent + let subPrefix = isNamespaced(path: item) ? "\(prefix)\(filename)/" : prefix + + return .group( + name: filename, + items: process(folder: item, withPrefix: subPrefix) + ) + default: + return nil } - - return result } -} - -// MARK: - ACTool -extension AssetsCatalogParser { - /** - Try to parse an asset catalog using the `actool` utilty. While it supports parsing - multiple catalogs at once, we only use it to parse one at a time. - - The output of the utility is a Plist and should be similar to this: - ```xml - - - - - com.apple.actool.catalog-contents - - - children - - ... - - filename - Images.xcassets - - - - - ``` - - - Parameter path: The path to the catalog to parse. - - Returns: An array of dictionaries, representing the tree of nodes in the catalog. - */ - fileprivate func loadAssetCatalog(at path: Path) -> [[String: Any]]? { - let command = Command("xcrun", arguments: "actool", "--print-contents", path.string) - let output = command.execute() as Data - - // try to parse plist - guard let plist = try? PropertyListSerialization - .propertyList(from: output, format: nil) else { return nil } + private func isNamespaced(path: Path) -> Bool { + if let contents = self.contents(for: path), + let properties = contents[AssetCatalog.Contents.properties] as? [String: Any], + let providesNamespace = properties[AssetCatalog.Contents.providesNamespace] as? Bool { + return providesNamespace + } else { + return false + } + } - // get first parsed catalog - guard let contents = plist as? [String: Any], - let catalogs = contents[AssetCatalog.root] as? [[String: Any]], - let catalog = catalogs.first else { return nil } + private func contents(for path: Path) -> [String: Any]? { + let contents = path + Path(AssetCatalog.Contents.path) - // get list of children - guard let children = catalog[AssetCatalog.children] as? [[String: Any]] else { return nil } + guard let data = try? contents.read(), + let json = try? JSONSerialization.jsonObject(with: data, options: []) else { + return nil + } - return children + return json as? [String: Any] } } diff --git a/Sources/Stencil/AssetsCatalogContext.swift b/Sources/Stencil/AssetsCatalogContext.swift index 251e207..50ec926 100644 --- a/Sources/Stencil/AssetsCatalogContext.swift +++ b/Sources/Stencil/AssetsCatalogContext.swift @@ -19,11 +19,13 @@ import Foundation */ extension AssetsCatalogParser { public func stencilContext() -> [String: Any] { - let catalogs = self.catalogs.keys.sorted(by: <).map { name -> [String: Any] in - return [ - "name": name, - "assets": structure(entries: self.catalogs[name] ?? []) - ] + let catalogs = self.catalogs + .sorted { lhs, rhs in lhs.name < rhs.name } + .map { catalog -> [String: Any] in + return [ + "name": catalog.name, + "assets": structure(entries: catalog.entries) + ] } return [ @@ -31,7 +33,7 @@ extension AssetsCatalogParser { ] } - private func structure(entries: [Entry]) -> [[String: Any]] { + private func structure(entries: [Catalog.Entry]) -> [[String: Any]] { return entries.map { entry in switch entry { case let .group(name: name, items: items): diff --git a/Tests/SwiftGenKitTests/ImagesTests.swift b/Tests/SwiftGenKitTests/ImagesTests.swift index 1c8a3ad..d686383 100644 --- a/Tests/SwiftGenKitTests/ImagesTests.swift +++ b/Tests/SwiftGenKitTests/ImagesTests.swift @@ -22,9 +22,9 @@ class ImagesTests: XCTestCase { XCTDiffContexts(result, expected: "empty.plist", sub: .images) } - func testDefaults() { + func testDefaults() throws { let parser = AssetsCatalogParser() - parser.parseCatalog(at: Fixtures.path(for: "Images.xcassets", sub: .images)) + try parser.parseCatalog(at: Fixtures.path(for: "Images.xcassets", sub: .images)) let result = parser.stencilContext() XCTDiffContexts(result, expected: "defaults.plist", sub: .images) From 0b70928da482877a229072d031abee8b48b9fa5d Mon Sep 17 00:00:00 2001 From: David Jennes Date: Wed, 24 May 2017 23:57:46 +0200 Subject: [PATCH 2/4] Changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 022d602..fe641d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,9 @@ _None_ [David Jennes](https://github.com/djbe) [#18](https://github.com/SwiftGen/templates/issues/18) [#38](https://github.com/SwiftGen/templates/issues/38) +* Images: switch back from `actool` to an internal parser to fix numerous issues with the former. + [David Jennes](https://github.com/djbe) + [#43](https://github.com/SwiftGen/templates/issues/43) ## 1.1.0 From 7bce506babca3d51efe8bea196b451a3d86a092a Mon Sep 17 00:00:00 2001 From: Olivier Halligon Date: Sat, 27 May 2017 20:30:26 +0200 Subject: [PATCH 3/4] Nest Error type for consistency --- Sources/Parsers/AssetsCatalogParser.swift | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Sources/Parsers/AssetsCatalogParser.swift b/Sources/Parsers/AssetsCatalogParser.swift index 1a3aa7f..6421882 100644 --- a/Sources/Parsers/AssetsCatalogParser.swift +++ b/Sources/Parsers/AssetsCatalogParser.swift @@ -7,17 +7,6 @@ import Foundation import PathKit -public enum AssetCatalogParserError: Error, CustomStringConvertible { - case invalidFile - - public var description: String { - switch self { - case .invalidFile: - return "error: File must be an asset catalog" - } - } -} - struct Catalog { enum Entry { case group(name: String, items: [Entry]) @@ -29,13 +18,24 @@ struct Catalog { } public final class AssetsCatalogParser { + public enum Error: Swift.Error, CustomStringConvertible { + case invalidFile + + public var description: String { + switch self { + case .invalidFile: + return "error: File must be an asset catalog" + } + } + } + var catalogs = [Catalog]() public init() {} public func parseCatalog(at path: Path) throws { guard path.extension == AssetCatalog.extension else { - throw AssetCatalogParserError.invalidFile + throw AssetsCatalogParser.Error.invalidFile } let name = path.lastComponentWithoutExtension From 6f3f75d22ebaeaa77636185a32c74a7a97ba7214 Mon Sep 17 00:00:00 2001 From: David Jennes Date: Sun, 28 May 2017 22:34:23 +0200 Subject: [PATCH 4/4] remove Command utility --- Pods/Pods.xcodeproj/project.pbxproj | 206 +++++++++++++--------------- Sources/Utils/Command.swift | 31 ----- 2 files changed, 97 insertions(+), 140 deletions(-) delete mode 100644 Sources/Utils/Command.swift diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 99ff642..365cbcf 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,38 +7,37 @@ objects = { /* Begin PBXBuildFile section */ - 02F3D54F45F81D395A5AFE28BFBE6DCF /* FontsFileParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D099D9232A07F0FE8E90ADF80821C6B /* FontsFileParser.swift */; }; + 0050375AB7F60C9649D7A7FB6DAC87B2 /* StoryboardParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F487CEFBFF54E0814053520C349EF136 /* StoryboardParser.swift */; }; 040B29D0120B5B450B98FC67FEC958B8 /* PathKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 13BF4533820B3B0741583A3A55BA85AF /* PathKit-dummy.m */; }; - 05E1364888F7B35184ACE26DB33315EA /* SwiftGenKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E95D3A9D0AA426730ABADF589227018 /* SwiftGenKit-dummy.m */; }; 08700CBB713B443AFA394EFD6B74E402 /* libxmlHTMLNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904F3A5095D730575C33E197353C6F58 /* libxmlHTMLNode.swift */; }; 089D6407EB1EEFC90043E9E54AD49B20 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12E26F483620051CC6B364261575CC2D /* Cocoa.framework */; }; + 17545C4C329F4BD4075307E18C4F585C /* FontsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 879050F1B4BAE3771AD0634BF0A0A1A3 /* FontsContext.swift */; }; 1BC3D304D6D2CD36AD7E4DF20E3ACDBC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12E26F483620051CC6B364261575CC2D /* Cocoa.framework */; }; 1D17B81B49104901F10B38B9ECF34C42 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12E26F483620051CC6B364261575CC2D /* Cocoa.framework */; }; - 2E420A11BC82EED0F105373E3F48E638 /* AssetsCatalogContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32A299B32C23CA3C4EE49B96459105C /* AssetsCatalogContext.swift */; }; + 274F7BE73598213E16D2140435746A62 /* SwiftGenKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EF7286BF701C13E3FF0BBEDABA8E877 /* SwiftGenKit-dummy.m */; }; 322F32F75AC8A04064F70A089800AF88 /* Kanna-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 46C5907A4C191DD9C89F1AE4D532F486 /* Kanna-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 34A366ED2F7DC95662A556065D42B063 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB59F286C4F1484201F3EC78613235AB /* Foundation.framework */; }; 38972ED30B169FA29CF8FA8ED6595113 /* Pods-Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 52E08CA96B2F20724148FF5361AD7206 /* Pods-Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3DB400D8B8AADDF43E1439E3441E814B /* Kanna-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EDAE599BDCF8EC6D91278D8710E6F50 /* Kanna-dummy.m */; }; - 427029239093572110C1E8CBC9561C99 /* ColorsFileParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF964CF5CB6052CB65EB873ADC4C5908 /* ColorsFileParser.swift */; }; 436871564BF1C99AA86206B69CDB40DD /* Kanna.h in Headers */ = {isa = PBXBuildFile; fileRef = A3A765B55D7EDB185EBDD8308F4748F8 /* Kanna.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5245ABB6A66FF1DEC56583EF468DD7AA /* PathKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F46B1ADA84E63D6C627D5CC666F1D81 /* PathKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 57543EEBC577AF06BDA21F617EC7C42C /* Command.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A47779BD13411D93D59545E2E320338 /* Command.swift */; }; + 553BDDBA54AB036EDC08B006714A74CE /* ColorsFileParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E456881F4DE7B8C970EBD8FED3AFCCC /* ColorsFileParser.swift */; }; 57A438519B3447F7AB93BA2C8F94385F /* PathKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0B807FADF4390B198EC10F499109E44 /* PathKit.framework */; }; - 59A4A39BD8F3B0CD53859C1F54C730BF /* SwiftGenKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EC112BC570440F79F5D325EE264243AD /* SwiftGenKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 59A4A39BD8F3B0CD53859C1F54C730BF /* SwiftGenKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27E6800E3748EE399B3188CAFFDD5777 /* SwiftGenKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5E5AA53F0C7E012EF2FC3F83A5283F84 /* ColorsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F11B319DFDD72067880D613BE9256E2 /* ColorsContext.swift */; }; 6272EE69D3F5DE1DF030E2B979A19909 /* PathKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDE20BD3ED3EF0C7D70E479DF2CD8379 /* PathKit.swift */; }; 634F01C0D06986FD15F647234ADA7CBC /* Kanna.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8490732A4DE01E9A7536C46239A11C /* Kanna.swift */; }; 6938650E192EA6DF8E85801B0D80AAFC /* Kanna.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBF42840F8EA48299DBEB842CDFC3038 /* Kanna.framework */; }; + 749BF1FE1DD83F91DBC37C2FFA0EAC47 /* AssetsCatalogContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B3ECE0693E7CAF04EDED84B95417B6 /* AssetsCatalogContext.swift */; }; 781A4D12CC4A83EA4705C6029254B012 /* libxmlHTMLDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E583382F4D2A13518BE85DEFB8059E4 /* libxmlHTMLDocument.swift */; }; - 8062B5202962F7086F7E343CBDF4CE9A /* StoryboardParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3AE389C53E9B01E985C9E18B23C4655 /* StoryboardParser.swift */; }; - 85EC84BCCF588C5D54E7DAB19622C5D2 /* ColorsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54477499963F9BB5465900CFB5D3EABD /* ColorsContext.swift */; }; - 98FAA05A854E6A72D7F694528760527A /* StringsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60889E57CE4B4802D50272BE5861F810 /* StringsContext.swift */; }; + 84CFA2D733CBB001085C655863310546 /* StoryboardsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30398D2848DB1C230E2BA5F59CBA341B /* StoryboardsContext.swift */; }; AF863C36D259D89189A0BDF54912C76E /* CSS.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA6BEEC2E04B8D117478877846E818D1 /* CSS.swift */; }; AFB59F954E43F84B81AD50D1EB920EAA /* Pods-Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C0ABA9994C05CE2F400945671B7038BA /* Pods-Tests-dummy.m */; }; B285B02C96169EAD6BCBC43F3135152F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12E26F483620051CC6B364261575CC2D /* Cocoa.framework */; }; - D431B19A97354454902B40D76C85F58B /* StoryboardsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61B5D27F549BC27FA003F01438250995 /* StoryboardsContext.swift */; }; - DED63CC02D81AEF8DD64D66355162264 /* FontsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DD2362583ECBF6E1F27B30077A63AB4 /* FontsContext.swift */; }; - E09EE7AEE526BFD8186B92E8C06E81DF /* StringsFileParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F5C044723C7653D18C10BF6AAEF8D4 /* StringsFileParser.swift */; }; - F155D5D651C9EDFD848A5CBD9CB60AAE /* AssetsCatalogParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10977DE0E866EF9C79EEC597CBA9E4C3 /* AssetsCatalogParser.swift */; }; + C75EF47C5C5EC9B1EFC701CB1B2AEE7D /* StringsFileParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7510B28AC6A79D665B10F20889170C /* StringsFileParser.swift */; }; + D5093AAF2CF89654EE63E15DDF287D75 /* FontsFileParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7DFB93EACD4267FA6F6DBD20295AF20 /* FontsFileParser.swift */; }; + D9229C9851AC18B9C5A59006DB54FF86 /* AssetsCatalogParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCB9FC29B7216E907E93C1D34AFB4390 /* AssetsCatalogParser.swift */; }; + F13FBB43FBD0A6425E9140D8685E765B /* StringsContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E124764FC113FFAC530EFA041D47247 /* StringsContext.swift */; }; FD87F8764674EFAAF3AABCA2552E5127 /* libxmlParserOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4878E4E70ABA8F7A5EEE614BC9D89D9 /* libxmlParserOption.swift */; }; /* End PBXBuildFile section */ @@ -83,19 +82,23 @@ /* Begin PBXFileReference section */ 06E5680F77898FA7B456DBF80297AB23 /* Pods-Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Tests-frameworks.sh"; sourceTree = ""; }; 0EF5E376080F955A0423A17DE2AA58C4 /* Kanna-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Kanna-prefix.pch"; sourceTree = ""; }; - 10977DE0E866EF9C79EEC597CBA9E4C3 /* AssetsCatalogParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AssetsCatalogParser.swift; sourceTree = ""; }; + 0F11B319DFDD72067880D613BE9256E2 /* ColorsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ColorsContext.swift; sourceTree = ""; }; 1143DC189DEAEC4A1278249254968FB1 /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Tests.debug.xcconfig"; sourceTree = ""; }; 12E26F483620051CC6B364261575CC2D /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; 13BF4533820B3B0741583A3A55BA85AF /* PathKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PathKit-dummy.m"; sourceTree = ""; }; 16AB7A3F2C26421CA5BCEB93F872E11D /* Kanna.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kanna.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A7510B28AC6A79D665B10F20889170C /* StringsFileParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StringsFileParser.swift; sourceTree = ""; }; + 1E124764FC113FFAC530EFA041D47247 /* StringsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StringsContext.swift; sourceTree = ""; }; 1E583382F4D2A13518BE85DEFB8059E4 /* libxmlHTMLDocument.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = libxmlHTMLDocument.swift; path = Sources/Kanna/libxmlHTMLDocument.swift; sourceTree = ""; }; + 27E6800E3748EE399B3188CAFFDD5777 /* SwiftGenKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftGenKit-umbrella.h"; sourceTree = ""; }; 2B8490732A4DE01E9A7536C46239A11C /* Kanna.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Kanna.swift; path = Sources/Kanna/Kanna.swift; sourceTree = ""; }; 2C8AAD97E22D7F6B08B73B0AE02BFA6D /* Pods-Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Tests-resources.sh"; sourceTree = ""; }; 2E6EDE0590FA1A030C93F83C2EEFC65C /* Pods-Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Tests.release.xcconfig"; sourceTree = ""; }; - 35F5C044723C7653D18C10BF6AAEF8D4 /* StringsFileParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StringsFileParser.swift; sourceTree = ""; }; + 30398D2848DB1C230E2BA5F59CBA341B /* StoryboardsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StoryboardsContext.swift; sourceTree = ""; }; 37AF3ADDD1C03E0E2AFD7EC31CB57717 /* Pods_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 38B3ECE0693E7CAF04EDED84B95417B6 /* AssetsCatalogContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AssetsCatalogContext.swift; sourceTree = ""; }; + 3E456881F4DE7B8C970EBD8FED3AFCCC /* ColorsFileParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ColorsFileParser.swift; sourceTree = ""; }; 3EDAE599BDCF8EC6D91278D8710E6F50 /* Kanna-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Kanna-dummy.m"; sourceTree = ""; }; - 4073060E93266F46D895562DC8E1B5BB /* SwiftGenKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftGenKit-prefix.pch"; sourceTree = ""; }; 4309AA7478DD6B254C478AE5335748BA /* Pods-Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Tests-acknowledgements.plist"; sourceTree = ""; }; 4511639F82E48C3F477EE775B3CD5110 /* PathKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PathKit-prefix.pch"; sourceTree = ""; }; 4581186F468D3864798974330AA9D0FB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -103,37 +106,32 @@ 4F35C03EE539651D8168B79F18A1DF5B /* Pods-Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-Tests.modulemap"; sourceTree = ""; }; 52E08CA96B2F20724148FF5361AD7206 /* Pods-Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Tests-umbrella.h"; sourceTree = ""; }; 53391F0841144A38898CB9462A0A2F99 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54477499963F9BB5465900CFB5D3EABD /* ColorsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ColorsContext.swift; sourceTree = ""; }; 581CEA6A54CD2608B064ABB8CBA2862C /* Kanna.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Kanna.modulemap; sourceTree = ""; }; - 5E95D3A9D0AA426730ABADF589227018 /* SwiftGenKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftGenKit-dummy.m"; sourceTree = ""; }; - 60889E57CE4B4802D50272BE5861F810 /* StringsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StringsContext.swift; sourceTree = ""; }; - 61B5D27F549BC27FA003F01438250995 /* StoryboardsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StoryboardsContext.swift; sourceTree = ""; }; - 6581541EB16C55BF3C9668C7AB304D9C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 6D099D9232A07F0FE8E90ADF80821C6B /* FontsFileParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FontsFileParser.swift; sourceTree = ""; }; - 6DD2362583ECBF6E1F27B30077A63AB4 /* FontsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FontsContext.swift; sourceTree = ""; }; 6E3DE9DADD254D64C598089530A5932B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 728A1CFC9A78FF6548305B00ECB1968C /* PathKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PathKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7A47779BD13411D93D59545E2E320338 /* Command.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Command.swift; sourceTree = ""; }; - 7D849BEE3993512EB3DC1DB84A51D5FB /* SwiftGenKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftGenKit.xcconfig; sourceTree = ""; }; + 7561FD3CA1A09547487AEA7DC332C99A /* SwiftGenKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SwiftGenKit.modulemap; sourceTree = ""; }; 7F46B1ADA84E63D6C627D5CC666F1D81 /* PathKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PathKit-umbrella.h"; sourceTree = ""; }; 874F9EA38D4ED98A2A7AF8EA2E195346 /* PathKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PathKit.xcconfig; sourceTree = ""; }; + 879050F1B4BAE3771AD0634BF0A0A1A3 /* FontsContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FontsContext.swift; sourceTree = ""; }; + 8EF7286BF701C13E3FF0BBEDABA8E877 /* SwiftGenKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftGenKit-dummy.m"; sourceTree = ""; }; 904F3A5095D730575C33E197353C6F58 /* libxmlHTMLNode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = libxmlHTMLNode.swift; path = Sources/Kanna/libxmlHTMLNode.swift; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9AE2BDBA2E7EE52BF7A5978E6995EFC8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A3A765B55D7EDB185EBDD8308F4748F8 /* Kanna.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Kanna.h; path = Sources/Kanna/Kanna.h; sourceTree = ""; }; - AF964CF5CB6052CB65EB873ADC4C5908 /* ColorsFileParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = ColorsFileParser.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; BBF42840F8EA48299DBEB842CDFC3038 /* Kanna.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kanna.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BFE531A4BA3F8D5F7B6C9BD6D217DA29 /* Pods-Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Tests-acknowledgements.markdown"; sourceTree = ""; }; C0ABA9994C05CE2F400945671B7038BA /* Pods-Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Tests-dummy.m"; sourceTree = ""; }; - C32A299B32C23CA3C4EE49B96459105C /* AssetsCatalogContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AssetsCatalogContext.swift; sourceTree = ""; }; C4878E4E70ABA8F7A5EEE614BC9D89D9 /* libxmlParserOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = libxmlParserOption.swift; path = Sources/Kanna/libxmlParserOption.swift; sourceTree = ""; }; D0B807FADF4390B198EC10F499109E44 /* PathKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PathKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D3AE389C53E9B01E985C9E18B23C4655 /* StoryboardParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StoryboardParser.swift; sourceTree = ""; }; DA2E38CD1918F46A417466A6099E2647 /* PathKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = PathKit.modulemap; sourceTree = ""; }; DAB6A27B5C807AB719C800A98C3BB82D /* Kanna.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kanna.xcconfig; sourceTree = ""; }; + DCB9FC29B7216E907E93C1D34AFB4390 /* AssetsCatalogParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AssetsCatalogParser.swift; sourceTree = ""; }; + DDF6E0251497CA284394DB6DC80A2EE8 /* SwiftGenKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftGenKit-prefix.pch"; sourceTree = ""; }; DE158F1F530A3D45D9B7B833917E01A0 /* SwiftGenKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftGenKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E54EE79893AE60BDD4725EE82D2CD3CD /* SwiftGenKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SwiftGenKit.modulemap; sourceTree = ""; }; + E7DFB93EACD4267FA6F6DBD20295AF20 /* FontsFileParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FontsFileParser.swift; sourceTree = ""; }; EB59F286C4F1484201F3EC78613235AB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - EC112BC570440F79F5D325EE264243AD /* SwiftGenKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftGenKit-umbrella.h"; sourceTree = ""; }; + F487CEFBFF54E0814053520C349EF136 /* StoryboardParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StoryboardParser.swift; sourceTree = ""; }; + F8F37908FC7A8D11F1D8160440D7D4D7 /* SwiftGenKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftGenKit.xcconfig; sourceTree = ""; }; FA6BEEC2E04B8D117478877846E818D1 /* CSS.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CSS.swift; path = Sources/Kanna/CSS.swift; sourceTree = ""; }; FDE20BD3ED3EF0C7D70E479DF2CD8379 /* PathKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PathKit.swift; path = Sources/PathKit.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -196,16 +194,30 @@ name = Products; sourceTree = ""; }; - 3CA136037933FE078CE6099E3BDC7784 /* Parsers */ = { + 351532DC06B9FFE833F12356AEA82474 /* Support Files */ = { isa = PBXGroup; children = ( - 10977DE0E866EF9C79EEC597CBA9E4C3 /* AssetsCatalogParser.swift */, - AF964CF5CB6052CB65EB873ADC4C5908 /* ColorsFileParser.swift */, - 6D099D9232A07F0FE8E90ADF80821C6B /* FontsFileParser.swift */, - D3AE389C53E9B01E985C9E18B23C4655 /* StoryboardParser.swift */, - 35F5C044723C7653D18C10BF6AAEF8D4 /* StringsFileParser.swift */, + 9AE2BDBA2E7EE52BF7A5978E6995EFC8 /* Info.plist */, + 7561FD3CA1A09547487AEA7DC332C99A /* SwiftGenKit.modulemap */, + F8F37908FC7A8D11F1D8160440D7D4D7 /* SwiftGenKit.xcconfig */, + 8EF7286BF701C13E3FF0BBEDABA8E877 /* SwiftGenKit-dummy.m */, + DDF6E0251497CA284394DB6DC80A2EE8 /* SwiftGenKit-prefix.pch */, + 27E6800E3748EE399B3188CAFFDD5777 /* SwiftGenKit-umbrella.h */, ); - path = Parsers; + name = "Support Files"; + path = "Pods/Target Support Files/SwiftGenKit"; + sourceTree = ""; + }; + 4322E48E2C580554E843EDB8CCE3A0B1 /* Stencil */ = { + isa = PBXGroup; + children = ( + 38B3ECE0693E7CAF04EDED84B95417B6 /* AssetsCatalogContext.swift */, + 0F11B319DFDD72067880D613BE9256E2 /* ColorsContext.swift */, + 879050F1B4BAE3771AD0634BF0A0A1A3 /* FontsContext.swift */, + 30398D2848DB1C230E2BA5F59CBA341B /* StoryboardsContext.swift */, + 1E124764FC113FFAC530EFA041D47247 /* StringsContext.swift */, + ); + path = Stencil; sourceTree = ""; }; 437729AB2123D215EFFA7D5F6C34D7FB /* Support Files */ = { @@ -240,30 +252,6 @@ path = "Target Support Files/Pods-Tests"; sourceTree = ""; }; - 4979DD1D7D3B4A12CB870FBE64355D7C /* Support Files */ = { - isa = PBXGroup; - children = ( - 6581541EB16C55BF3C9668C7AB304D9C /* Info.plist */, - E54EE79893AE60BDD4725EE82D2CD3CD /* SwiftGenKit.modulemap */, - 7D849BEE3993512EB3DC1DB84A51D5FB /* SwiftGenKit.xcconfig */, - 5E95D3A9D0AA426730ABADF589227018 /* SwiftGenKit-dummy.m */, - 4073060E93266F46D895562DC8E1B5BB /* SwiftGenKit-prefix.pch */, - EC112BC570440F79F5D325EE264243AD /* SwiftGenKit-umbrella.h */, - ); - name = "Support Files"; - path = "Pods/Target Support Files/SwiftGenKit"; - sourceTree = ""; - }; - 530165B875880C9C84E9720B3EA17303 /* SwiftGenKit */ = { - isa = PBXGroup; - children = ( - D889DA17503B2822F8F3451DA2AD5F69 /* Sources */, - 4979DD1D7D3B4A12CB870FBE64355D7C /* Support Files */, - ); - name = SwiftGenKit; - path = ..; - sourceTree = ""; - }; 55AEEC96D15DA21DA3C4F36F6C17B246 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -289,6 +277,27 @@ tabWidth = 2; usesTabs = 0; }; + 85B3394CAC71B659DC0D5BFAB812FEDE /* Parsers */ = { + isa = PBXGroup; + children = ( + DCB9FC29B7216E907E93C1D34AFB4390 /* AssetsCatalogParser.swift */, + 3E456881F4DE7B8C970EBD8FED3AFCCC /* ColorsFileParser.swift */, + E7DFB93EACD4267FA6F6DBD20295AF20 /* FontsFileParser.swift */, + F487CEFBFF54E0814053520C349EF136 /* StoryboardParser.swift */, + 1A7510B28AC6A79D665B10F20889170C /* StringsFileParser.swift */, + ); + path = Parsers; + sourceTree = ""; + }; + 93BB8B7B5DEBEF5EAB2FBDA663010DFE /* Sources */ = { + isa = PBXGroup; + children = ( + 85B3394CAC71B659DC0D5BFAB812FEDE /* Parsers */, + 4322E48E2C580554E843EDB8CCE3A0B1 /* Stencil */, + ); + path = Sources; + sourceTree = ""; + }; 99E9F5BF6CEBA553AC21C98ECE428839 /* OS X */ = { isa = PBXGroup; children = ( @@ -316,36 +325,14 @@ name = Pods; sourceTree = ""; }; - D889DA17503B2822F8F3451DA2AD5F69 /* Sources */ = { - isa = PBXGroup; - children = ( - 3CA136037933FE078CE6099E3BDC7784 /* Parsers */, - E007FD1113D89B52054CBEF4E7D84853 /* Stencil */, - F358D0378A0787E39C037B62585E469F /* Utils */, - ); - path = Sources; - sourceTree = ""; - }; DCB3B37466882D14AE1F9B20055DF4C3 /* Development Pods */ = { isa = PBXGroup; children = ( - 530165B875880C9C84E9720B3EA17303 /* SwiftGenKit */, + F2ADAEA6BA88F033203C5682F185B055 /* SwiftGenKit */, ); name = "Development Pods"; sourceTree = ""; }; - E007FD1113D89B52054CBEF4E7D84853 /* Stencil */ = { - isa = PBXGroup; - children = ( - C32A299B32C23CA3C4EE49B96459105C /* AssetsCatalogContext.swift */, - 54477499963F9BB5465900CFB5D3EABD /* ColorsContext.swift */, - 6DD2362583ECBF6E1F27B30077A63AB4 /* FontsContext.swift */, - 61B5D27F549BC27FA003F01438250995 /* StoryboardsContext.swift */, - 60889E57CE4B4802D50272BE5861F810 /* StringsContext.swift */, - ); - path = Stencil; - sourceTree = ""; - }; E8ACEBE2E4919C8B42726D08149A6189 /* Kanna */ = { isa = PBXGroup; children = ( @@ -360,12 +347,14 @@ path = Kanna; sourceTree = ""; }; - F358D0378A0787E39C037B62585E469F /* Utils */ = { + F2ADAEA6BA88F033203C5682F185B055 /* SwiftGenKit */ = { isa = PBXGroup; children = ( - 7A47779BD13411D93D59545E2E320338 /* Command.swift */, + 93BB8B7B5DEBEF5EAB2FBDA663010DFE /* Sources */, + 351532DC06B9FFE833F12356AEA82474 /* Support Files */, ); - path = Utils; + name = SwiftGenKit; + path = ..; sourceTree = ""; }; F6AEC75F5D0E974A365B5F9F6BA9027C /* Support Files */ = { @@ -442,7 +431,7 @@ isa = PBXNativeTarget; buildConfigurationList = 0FD3CE6D60BA282565C062B591CF7DE2 /* Build configuration list for PBXNativeTarget "SwiftGenKit" */; buildPhases = ( - 85C5758330A065C5B6CC0C312B846FD3 /* Sources */, + 18C017AB4C1BC4E5705F612D09D4AA55 /* Sources */, 4AFD2881E60424071AED42700AA90407 /* Frameworks */, 83579879D3C7B6AD0C9195A62DC5ECCA /* Headers */, ); @@ -524,6 +513,24 @@ /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ + 18C017AB4C1BC4E5705F612D09D4AA55 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 749BF1FE1DD83F91DBC37C2FFA0EAC47 /* AssetsCatalogContext.swift in Sources */, + D9229C9851AC18B9C5A59006DB54FF86 /* AssetsCatalogParser.swift in Sources */, + 5E5AA53F0C7E012EF2FC3F83A5283F84 /* ColorsContext.swift in Sources */, + 553BDDBA54AB036EDC08B006714A74CE /* ColorsFileParser.swift in Sources */, + 17545C4C329F4BD4075307E18C4F585C /* FontsContext.swift in Sources */, + D5093AAF2CF89654EE63E15DDF287D75 /* FontsFileParser.swift in Sources */, + 0050375AB7F60C9649D7A7FB6DAC87B2 /* StoryboardParser.swift in Sources */, + 84CFA2D733CBB001085C655863310546 /* StoryboardsContext.swift in Sources */, + F13FBB43FBD0A6425E9140D8685E765B /* StringsContext.swift in Sources */, + C75EF47C5C5EC9B1EFC701CB1B2AEE7D /* StringsFileParser.swift in Sources */, + 274F7BE73598213E16D2140435746A62 /* SwiftGenKit-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 252B13ABC5AE0EA65897098097C1703E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -546,25 +553,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 85C5758330A065C5B6CC0C312B846FD3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2E420A11BC82EED0F105373E3F48E638 /* AssetsCatalogContext.swift in Sources */, - F155D5D651C9EDFD848A5CBD9CB60AAE /* AssetsCatalogParser.swift in Sources */, - 85EC84BCCF588C5D54E7DAB19622C5D2 /* ColorsContext.swift in Sources */, - 427029239093572110C1E8CBC9561C99 /* ColorsFileParser.swift in Sources */, - 57543EEBC577AF06BDA21F617EC7C42C /* Command.swift in Sources */, - DED63CC02D81AEF8DD64D66355162264 /* FontsContext.swift in Sources */, - 02F3D54F45F81D395A5AFE28BFBE6DCF /* FontsFileParser.swift in Sources */, - 8062B5202962F7086F7E343CBDF4CE9A /* StoryboardParser.swift in Sources */, - D431B19A97354454902B40D76C85F58B /* StoryboardsContext.swift in Sources */, - 98FAA05A854E6A72D7F694528760527A /* StringsContext.swift in Sources */, - E09EE7AEE526BFD8186B92E8C06E81DF /* StringsFileParser.swift in Sources */, - 05E1364888F7B35184ACE26DB33315EA /* SwiftGenKit-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; BDF90DA6F1CAA9348531FEA5D85D7768 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -778,7 +766,7 @@ }; 4467CB8ADF99710B35078C12804F6CFD /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7D849BEE3993512EB3DC1DB84A51D5FB /* SwiftGenKit.xcconfig */; + baseConfigurationReference = F8F37908FC7A8D11F1D8160440D7D4D7 /* SwiftGenKit.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -813,7 +801,7 @@ }; 5017B5F4933201A16821845119034CE1 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7D849BEE3993512EB3DC1DB84A51D5FB /* SwiftGenKit.xcconfig */; + baseConfigurationReference = F8F37908FC7A8D11F1D8160440D7D4D7 /* SwiftGenKit.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; diff --git a/Sources/Utils/Command.swift b/Sources/Utils/Command.swift deleted file mode 100644 index e8f54a7..0000000 --- a/Sources/Utils/Command.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// SwiftGenKit -// Copyright (c) 2017 SwiftGen -// MIT License -// - -import Foundation - -struct Command { - private static let Environment = "/usr/bin/env" - private var arguments: [String] - - init(_ executable: String, arguments: String...) { - self.arguments = [executable] - self.arguments += arguments - } - - func execute() -> Data { - let task = Process() - - task.launchPath = Command.Environment - task.arguments = arguments - - let pipe = Pipe() - task.standardOutput = pipe - task.launch() - - let data = pipe.fileHandleForReading.readDataToEndOfFile() - return data - } -}