├── .swift-version ├── Docs ├── sentence_breakdown.png └── Sentence Breakdown.sketch ├── Nihongo.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── project.pbxproj ├── Nihongo ├── Nihongo.h └── Info.plist ├── LICENSE ├── Types.swift ├── .gitignore ├── YahooMAParser.swift ├── Nihongo.swift └── README.md /.swift-version: -------------------------------------------------------------------------------- 1 | 3.0 -------------------------------------------------------------------------------- /Docs/sentence_breakdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/totocaster/Nihongo/HEAD/Docs/sentence_breakdown.png -------------------------------------------------------------------------------- /Docs/Sentence Breakdown.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/totocaster/Nihongo/HEAD/Docs/Sentence Breakdown.sketch -------------------------------------------------------------------------------- /Nihongo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Nihongo/Nihongo.h: -------------------------------------------------------------------------------- 1 | // 2 | // Nihongo.h 3 | // Nihongo 4 | // 5 | // Created by Toto Tvalavadze on 2016/12/17. 6 | // Copyright © 2016 Toto Tvalavadze. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Nihongo. 12 | FOUNDATION_EXPORT double NihongoVersionNumber; 13 | 14 | //! Project version string for Nihongo. 15 | FOUNDATION_EXPORT const unsigned char NihongoVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Nihongo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Toto Tvalavadze 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Types.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Types.swift 3 | // Nihongo 4 | // 5 | // Created by Toto Tvalavadze on 2016/12/17. 6 | // Copyright © 2016 Toto Tvalavadze. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct Word { 12 | var text: String 13 | var reading: String 14 | var `class`: WordClass 15 | var base: String 16 | } 17 | 18 | public enum WordClass: String { 19 | case adjectivalVerb = "形容詞" // keiyōshi - adjectival verbs, i-adjectives, adjectives, stative verbs 20 | case adjectivalNoun = "形容動詞" // keiyōdōshi - adjectival nouns, na-adjectives, copular nouns, quasi-adjectives, nominal adjectives, adjectival verbs 21 | case attributive = "連体詞" // rentaishi, attributives, true adjectives, prenominals, pre-noun adjectivals 22 | 23 | case interjection = "感動詞" // kandōshi 24 | case adverb = "副詞" // fukushi 25 | case conjunction = "接続詞" // setsuzokushi 26 | 27 | case prefix = "接頭辞" 28 | case suffix = "接尾辞" 29 | 30 | case noun = "名詞" // meishi 31 | case verb = "動詞" // dōshi 32 | 33 | case particle = "助詞" // joshi 34 | case auxiliaryVerb = "助動詞" // jodōshi 35 | 36 | /// Punctuation, brackets, symbols, etc. 37 | case special = "特殊" 38 | } 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | # Swift Package Manager 35 | # 36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 37 | # Packages/ 38 | .build/ 39 | 40 | # CocoaPods 41 | # 42 | # We recommend against adding the Pods directory to your .gitignore. However 43 | # you should judge for yourself, the pros and cons are mentioned at: 44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 45 | # 46 | # Pods/ 47 | 48 | # Carthage 49 | # 50 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 51 | # Carthage/Checkouts 52 | 53 | Carthage/Build 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 61 | 62 | fastlane/report.xml 63 | fastlane/Preview.html 64 | fastlane/screenshots 65 | fastlane/test_output 66 | 67 | # macOS Finder 68 | .DS_Store -------------------------------------------------------------------------------- /YahooMAParser.swift: -------------------------------------------------------------------------------- 1 | // 2 | // YahooMAParser.swift 3 | // Nihongo 4 | // 5 | // Created by Toto Tvalavadze on 2016/12/17. 6 | // Copyright © 2016 Toto Tvalavadze. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class YahooMAServiceResponseParser: NSObject, XMLParserDelegate { 12 | let parser: XMLParser 13 | 14 | private var completionCallback: ParsingCompleteCallback 15 | init(data: Data, completion: @escaping ParsingCompleteCallback) { 16 | parser = XMLParser(data: data) 17 | completionCallback = completion 18 | } 19 | 20 | typealias ParsingCompleteCallback = ([Word]) -> () 21 | func parse() { 22 | parser.delegate = self 23 | parser.parse() 24 | } 25 | 26 | private var words: [Word] = [] 27 | private var isParsingWord = false 28 | private var currentWordNode: String? 29 | private var intermediateWord:[String: String] = [:] 30 | 31 | // MARK: XMLParserDelegate 32 | 33 | func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { 34 | if elementName == "word" { 35 | isParsingWord = true 36 | } else { 37 | if isParsingWord { 38 | currentWordNode = elementName 39 | } 40 | } 41 | } 42 | 43 | func parser(_ parser: XMLParser, foundCharacters string: String) { 44 | guard isParsingWord else { return } 45 | if let currentNode = currentWordNode { 46 | intermediateWord[currentNode] = string 47 | } 48 | } 49 | 50 | func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 51 | if elementName == "word" { 52 | isParsingWord = false 53 | if let position = intermediateWord["pos"], 54 | let text = intermediateWord["surface"], 55 | let reading = intermediateWord["reading"], 56 | let base = intermediateWord["baseform"], 57 | let lexical = WordClass(rawValue: position) 58 | { 59 | let word = Word(text: text, reading: reading, class: lexical, base: base) 60 | words.append(word) 61 | } 62 | intermediateWord = [:] 63 | currentWordNode = nil 64 | } 65 | } 66 | 67 | func parserDidEndDocument(_ parser: XMLParser) { 68 | completionCallback(words) 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /Nihongo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Nihongo.swift 3 | // Nihongo 4 | // 5 | // Created by Toto Tvalavadze on 2016/12/17. 6 | // Copyright © 2016 Toto Tvalavadze. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public class Nihongo { 12 | 13 | public typealias AnalyzerRequestCallback = ([Word]) -> () 14 | 15 | init(yahooJapanAppId appId: String) { 16 | service = .yahooJapan(appId: appId) 17 | } 18 | 19 | func analyze(sentence: String, completion: @escaping AnalyzerRequestCallback) { 20 | guard case .yahooJapan(let appId) = service else { 21 | fatalError("Only Yahoo Japan's Morphological Analysis service is currently supported.") 22 | } 23 | guard let url = URL(string: "http://jlp.yahooapis.jp/MAService/V1/parse") else { return } 24 | 25 | let sessionConfig = URLSessionConfiguration.default 26 | let session = URLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil) 27 | let parameterizedUrl = queryParameters(for: url, parameters: [ 28 | "appid": appId, 29 | "results": "ma", 30 | "sentence": sentence, 31 | "response": "surface,reading,pos,baseform" 32 | ] 33 | ) 34 | 35 | var request = URLRequest(url: parameterizedUrl) 36 | request.httpMethod = "GET" 37 | 38 | let task = session.dataTask(with: request, completionHandler: { 39 | (data: Data?, response: URLResponse?, error: Error?) in 40 | if (error == nil) { 41 | let statusCode = (response as! HTTPURLResponse).statusCode 42 | if let data = data, statusCode == 200 { 43 | let parser = YahooMAServiceResponseParser(data: data, completion: completion) 44 | parser.parse() 45 | } else { 46 | // TODO: add error handling 47 | } 48 | } else { 49 | // Failure 50 | // TODO: proper error handling 51 | print("URL Session Task Failed: %@", error!.localizedDescription); 52 | } 53 | }) 54 | task.resume() 55 | session.finishTasksAndInvalidate() 56 | } 57 | 58 | // MARK: Private stuff 59 | 60 | /// Services that can provide morphological analysis for Japanese language. 61 | /// - note: This is point for expansion. Only Yahoo.co.jp MA is supported for now. 62 | private enum Service { 63 | case yahooJapan(appId: String) 64 | } 65 | 66 | private let service: Service 67 | 68 | private func queryParameters(for url: URL, parameters: [String: String]) -> URL { 69 | var parts: [String] = [] 70 | for (key, value) in parameters { 71 | let encodedKey = key.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! 72 | let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! 73 | let part = "\(encodedKey)=\(encodedValue)" 74 | parts.append(part) 75 | } 76 | let params = parts.joined(separator: "&") 77 | let fullUrl = "\(url)?\(params)" 78 | return URL(string: fullUrl)! 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nihongo 🇯🇵 2 | 3 | ![Swift Version](https://img.shields.io/badge/swift-3.0-orange.svg?style=flat) 4 | [![Platform](https://img.shields.io/cocoapods/p/Typist.svg?style=flat)](http://cocoapods.org/pods/Typist) 5 | [![Twitter](https://img.shields.io/badge/twitter-@totocaster-blue.svg)](http://twitter.com/totocaster) 6 | 7 | Nihongo is API powered Japanese language morphological analysis Swift library for iOS. It helps you quickly tokenize Japanese sentences and understand its anatomy. 8 | 9 | ![Nihongo deconstructs your Japanese sentences.](https://raw.githubusercontent.com/totocaster/Nihongo/master/Docs/sentence_breakdown.png) 10 | 11 | **Motivation:** `NSLinguisticTagger` is fantastic, but before it supports Japanese morphological analysis, this is your easiest option for now. 12 | 13 | Nihongo is powered by [Yahoo Japan's morphological analysis][yjma] API. Support of multiple—online and offline—service would be nice, but this is only option for now. 14 | 15 | --- 16 | 17 | ⚠️ **This is work in progress repo. I'll start accepting PRs as soon as I have this repo all tidy. By that time proper docs will be in place too.** Here is how my todo list looks like now: 18 | 19 | - [x] Implement framework so its usable 20 | - [ ] Add error handling 21 | - [ ] Add tests and test cases 22 | - [ ] Consider adding sample iOS/iPhone app 23 | - [ ] Proper in-line documentation 24 | - [ ] Clear documentation in README (you are looking at it now) 25 | - [ ] Add Cococapods support 26 | - [ ] Add Carthage support 27 | - [ ] watchOS + tvOS support 28 | - [ ] macOS support (perhaps?) 29 | 30 | Thanks for checking-out Nihongo! 31 | 32 | --- 33 | 34 | ## Usage 35 | 36 | Deconstructing sentences is trivial. Just instantiate `Nihongo` with valid API `app_id` and call `analize(sentence:completion:)`. You'll get array of `Word` types in completion handler as a closure parameter. 37 | 38 | ```swift 39 | let sentence = "昼ごはんを食べています。" 40 | 41 | let ma = Nihongo(yahooJapanAppId: "") 42 | 43 | ma.analyze(sentence: sentence) { 44 | words in 45 | 46 | for token in words { 47 | print("Word \(token.text) reads as \(token.reading) is \(token.class) and has base form of \(token.base)") 48 | } 49 | } 50 | ``` 51 | 52 | Code above will yield following in console: 53 | 54 | ```text 55 | Word 昼ごはん reads as ひるごはん is noun and has base form of 昼ごはん 56 | Word を reads as を is particle and has base form of を 57 | Word 食べ reads as たべ is verb and has base form of 食べる 58 | Word て reads as て is particle and has base form of て 59 | Word い reads as い is auxiliaryVerb and has base form of いる 60 | Word ます reads as ます is auxiliaryVerb and has base form of ます 61 | Word 。 reads as 。 is special and has base form of 。 62 | ``` 63 | 64 | 65 | ### Extracted Token — `Word` 66 | 67 | `Word` is inert/immutable struct that describes extracted token. 68 | 69 | * `text` — `String` that matches exact text from analyzed sentence. 70 | * `reading` — `String` in [hiragana][hrg] syllabary describing how to read `text`. 71 | * `class` — Internal `WordClass` enum describing what morphological part of sentance is the word. 72 | * `base` — `String` with base form of the word (e.g. unconjugated verb). Usefull of further dictionary look-ups. 73 | 74 | ### Morphological Classes of Words — `WordClass` 75 | 76 | `WordClass` is lexical classification of `Word`. Supported classes are: 77 | 78 | * `.adjectivalVerb` — Adjectival Verb (形容詞, _keiyōshi_) a.k.a adjectival verb, i-adjective, adjective, stative verb 79 | * `.adjectivalNoun` — Adjectival Noun (形容動詞, _keiyōdōshi_) a.k.a. adjectival noun, na-adjective, copular noun, quasi-adjective, nominal adjective, adjectival verb 80 | * `.attributive` — Prenominal (連体詞, _rentaishi_) a.k.a. attributive, true adjective, prenominal, pre-noun adjectival 81 | * `.interjection` — Interjection (感動詞, _kandōshi_) 82 | * `.adverb` — Adverb (副詞, _fukushi_) 83 | * `.conjunction` — Conjunction (接続詞, _setsuzokushi_) 84 | * `.noun` — Noun (名詞, _meishi_) 85 | * `.verb` — Verb (動詞, _dōshi_) 86 | * `.particle` — Particle (助詞, _joshi_) 87 | * `.auxiliaryVerb` — (助動詞, _jodōshi_) 88 | * `.prefix` — Prefix (接頭辞) 89 | * `.suffix` — Suffix (接尾辞) 90 | * `.special` — Punctuation, brackets, symbols, etc. 91 | 92 | [hrg]: https://en.wikipedia.org/wiki/Hiragana 93 | [yjma]: http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html 94 | -------------------------------------------------------------------------------- /Nihongo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 99DA25861E057786007F4794 /* Nihongo.h in Headers */ = {isa = PBXBuildFile; fileRef = 99DA25841E057786007F4794 /* Nihongo.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 99DA258D1E0577D6007F4794 /* Nihongo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99DA258C1E0577D6007F4794 /* Nihongo.swift */; }; 12 | 99DA258F1E0577F8007F4794 /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99DA258E1E0577F8007F4794 /* Types.swift */; }; 13 | 99DA25911E057854007F4794 /* YahooMAParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99DA25901E057854007F4794 /* YahooMAParser.swift */; }; 14 | /* End PBXBuildFile section */ 15 | 16 | /* Begin PBXFileReference section */ 17 | 99DA25811E057786007F4794 /* Nihongo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Nihongo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 18 | 99DA25841E057786007F4794 /* Nihongo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Nihongo.h; sourceTree = ""; }; 19 | 99DA25851E057786007F4794 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 20 | 99DA258C1E0577D6007F4794 /* Nihongo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Nihongo.swift; sourceTree = ""; }; 21 | 99DA258E1E0577F8007F4794 /* Types.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Types.swift; sourceTree = ""; }; 22 | 99DA25901E057854007F4794 /* YahooMAParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YahooMAParser.swift; sourceTree = ""; }; 23 | /* End PBXFileReference section */ 24 | 25 | /* Begin PBXFrameworksBuildPhase section */ 26 | 99DA257D1E057786007F4794 /* Frameworks */ = { 27 | isa = PBXFrameworksBuildPhase; 28 | buildActionMask = 2147483647; 29 | files = ( 30 | ); 31 | runOnlyForDeploymentPostprocessing = 0; 32 | }; 33 | /* End PBXFrameworksBuildPhase section */ 34 | 35 | /* Begin PBXGroup section */ 36 | 99DA25771E057786007F4794 = { 37 | isa = PBXGroup; 38 | children = ( 39 | 99DA25901E057854007F4794 /* YahooMAParser.swift */, 40 | 99DA258E1E0577F8007F4794 /* Types.swift */, 41 | 99DA258C1E0577D6007F4794 /* Nihongo.swift */, 42 | 99DA25831E057786007F4794 /* Nihongo */, 43 | 99DA25821E057786007F4794 /* Products */, 44 | ); 45 | sourceTree = ""; 46 | }; 47 | 99DA25821E057786007F4794 /* Products */ = { 48 | isa = PBXGroup; 49 | children = ( 50 | 99DA25811E057786007F4794 /* Nihongo.framework */, 51 | ); 52 | name = Products; 53 | sourceTree = ""; 54 | }; 55 | 99DA25831E057786007F4794 /* Nihongo */ = { 56 | isa = PBXGroup; 57 | children = ( 58 | 99DA25841E057786007F4794 /* Nihongo.h */, 59 | 99DA25851E057786007F4794 /* Info.plist */, 60 | ); 61 | path = Nihongo; 62 | sourceTree = ""; 63 | }; 64 | /* End PBXGroup section */ 65 | 66 | /* Begin PBXHeadersBuildPhase section */ 67 | 99DA257E1E057786007F4794 /* Headers */ = { 68 | isa = PBXHeadersBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | 99DA25861E057786007F4794 /* Nihongo.h in Headers */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | /* End PBXHeadersBuildPhase section */ 76 | 77 | /* Begin PBXNativeTarget section */ 78 | 99DA25801E057786007F4794 /* Nihongo */ = { 79 | isa = PBXNativeTarget; 80 | buildConfigurationList = 99DA25891E057786007F4794 /* Build configuration list for PBXNativeTarget "Nihongo" */; 81 | buildPhases = ( 82 | 99DA257C1E057786007F4794 /* Sources */, 83 | 99DA257D1E057786007F4794 /* Frameworks */, 84 | 99DA257E1E057786007F4794 /* Headers */, 85 | 99DA257F1E057786007F4794 /* Resources */, 86 | ); 87 | buildRules = ( 88 | ); 89 | dependencies = ( 90 | ); 91 | name = Nihongo; 92 | productName = Nihongo; 93 | productReference = 99DA25811E057786007F4794 /* Nihongo.framework */; 94 | productType = "com.apple.product-type.framework"; 95 | }; 96 | /* End PBXNativeTarget section */ 97 | 98 | /* Begin PBXProject section */ 99 | 99DA25781E057786007F4794 /* Project object */ = { 100 | isa = PBXProject; 101 | attributes = { 102 | LastUpgradeCheck = 0820; 103 | ORGANIZATIONNAME = "Toto Tvalavadze"; 104 | TargetAttributes = { 105 | 99DA25801E057786007F4794 = { 106 | CreatedOnToolsVersion = 8.2; 107 | DevelopmentTeam = HCKE9T3AHJ; 108 | LastSwiftMigration = 0820; 109 | ProvisioningStyle = Automatic; 110 | }; 111 | }; 112 | }; 113 | buildConfigurationList = 99DA257B1E057786007F4794 /* Build configuration list for PBXProject "Nihongo" */; 114 | compatibilityVersion = "Xcode 3.2"; 115 | developmentRegion = English; 116 | hasScannedForEncodings = 0; 117 | knownRegions = ( 118 | en, 119 | ); 120 | mainGroup = 99DA25771E057786007F4794; 121 | productRefGroup = 99DA25821E057786007F4794 /* Products */; 122 | projectDirPath = ""; 123 | projectRoot = ""; 124 | targets = ( 125 | 99DA25801E057786007F4794 /* Nihongo */, 126 | ); 127 | }; 128 | /* End PBXProject section */ 129 | 130 | /* Begin PBXResourcesBuildPhase section */ 131 | 99DA257F1E057786007F4794 /* Resources */ = { 132 | isa = PBXResourcesBuildPhase; 133 | buildActionMask = 2147483647; 134 | files = ( 135 | ); 136 | runOnlyForDeploymentPostprocessing = 0; 137 | }; 138 | /* End PBXResourcesBuildPhase section */ 139 | 140 | /* Begin PBXSourcesBuildPhase section */ 141 | 99DA257C1E057786007F4794 /* Sources */ = { 142 | isa = PBXSourcesBuildPhase; 143 | buildActionMask = 2147483647; 144 | files = ( 145 | 99DA25911E057854007F4794 /* YahooMAParser.swift in Sources */, 146 | 99DA258F1E0577F8007F4794 /* Types.swift in Sources */, 147 | 99DA258D1E0577D6007F4794 /* Nihongo.swift in Sources */, 148 | ); 149 | runOnlyForDeploymentPostprocessing = 0; 150 | }; 151 | /* End PBXSourcesBuildPhase section */ 152 | 153 | /* Begin XCBuildConfiguration section */ 154 | 99DA25871E057786007F4794 /* Debug */ = { 155 | isa = XCBuildConfiguration; 156 | buildSettings = { 157 | ALWAYS_SEARCH_USER_PATHS = NO; 158 | CLANG_ANALYZER_NONNULL = YES; 159 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 160 | CLANG_CXX_LIBRARY = "libc++"; 161 | CLANG_ENABLE_MODULES = YES; 162 | CLANG_ENABLE_OBJC_ARC = YES; 163 | CLANG_WARN_BOOL_CONVERSION = YES; 164 | CLANG_WARN_CONSTANT_CONVERSION = YES; 165 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 166 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 167 | CLANG_WARN_EMPTY_BODY = YES; 168 | CLANG_WARN_ENUM_CONVERSION = YES; 169 | CLANG_WARN_INFINITE_RECURSION = YES; 170 | CLANG_WARN_INT_CONVERSION = YES; 171 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 172 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 173 | CLANG_WARN_UNREACHABLE_CODE = YES; 174 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 175 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 176 | COPY_PHASE_STRIP = NO; 177 | CURRENT_PROJECT_VERSION = 1; 178 | DEBUG_INFORMATION_FORMAT = dwarf; 179 | ENABLE_STRICT_OBJC_MSGSEND = YES; 180 | ENABLE_TESTABILITY = YES; 181 | GCC_C_LANGUAGE_STANDARD = gnu99; 182 | GCC_DYNAMIC_NO_PIC = NO; 183 | GCC_NO_COMMON_BLOCKS = YES; 184 | GCC_OPTIMIZATION_LEVEL = 0; 185 | GCC_PREPROCESSOR_DEFINITIONS = ( 186 | "DEBUG=1", 187 | "$(inherited)", 188 | ); 189 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 190 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 191 | GCC_WARN_UNDECLARED_SELECTOR = YES; 192 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 193 | GCC_WARN_UNUSED_FUNCTION = YES; 194 | GCC_WARN_UNUSED_VARIABLE = YES; 195 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 196 | MTL_ENABLE_DEBUG_INFO = YES; 197 | ONLY_ACTIVE_ARCH = YES; 198 | SDKROOT = iphoneos; 199 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 200 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 201 | TARGETED_DEVICE_FAMILY = "1,2"; 202 | VERSIONING_SYSTEM = "apple-generic"; 203 | VERSION_INFO_PREFIX = ""; 204 | }; 205 | name = Debug; 206 | }; 207 | 99DA25881E057786007F4794 /* Release */ = { 208 | isa = XCBuildConfiguration; 209 | buildSettings = { 210 | ALWAYS_SEARCH_USER_PATHS = NO; 211 | CLANG_ANALYZER_NONNULL = YES; 212 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 213 | CLANG_CXX_LIBRARY = "libc++"; 214 | CLANG_ENABLE_MODULES = YES; 215 | CLANG_ENABLE_OBJC_ARC = YES; 216 | CLANG_WARN_BOOL_CONVERSION = YES; 217 | CLANG_WARN_CONSTANT_CONVERSION = YES; 218 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 219 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 220 | CLANG_WARN_EMPTY_BODY = YES; 221 | CLANG_WARN_ENUM_CONVERSION = YES; 222 | CLANG_WARN_INFINITE_RECURSION = YES; 223 | CLANG_WARN_INT_CONVERSION = YES; 224 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 225 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 226 | CLANG_WARN_UNREACHABLE_CODE = YES; 227 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 228 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 229 | COPY_PHASE_STRIP = NO; 230 | CURRENT_PROJECT_VERSION = 1; 231 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 232 | ENABLE_NS_ASSERTIONS = NO; 233 | ENABLE_STRICT_OBJC_MSGSEND = YES; 234 | GCC_C_LANGUAGE_STANDARD = gnu99; 235 | GCC_NO_COMMON_BLOCKS = YES; 236 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 237 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 238 | GCC_WARN_UNDECLARED_SELECTOR = YES; 239 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 240 | GCC_WARN_UNUSED_FUNCTION = YES; 241 | GCC_WARN_UNUSED_VARIABLE = YES; 242 | IPHONEOS_DEPLOYMENT_TARGET = 10.2; 243 | MTL_ENABLE_DEBUG_INFO = NO; 244 | SDKROOT = iphoneos; 245 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 246 | TARGETED_DEVICE_FAMILY = "1,2"; 247 | VALIDATE_PRODUCT = YES; 248 | VERSIONING_SYSTEM = "apple-generic"; 249 | VERSION_INFO_PREFIX = ""; 250 | }; 251 | name = Release; 252 | }; 253 | 99DA258A1E057786007F4794 /* Debug */ = { 254 | isa = XCBuildConfiguration; 255 | buildSettings = { 256 | CLANG_ENABLE_MODULES = YES; 257 | CODE_SIGN_IDENTITY = ""; 258 | DEFINES_MODULE = YES; 259 | DEVELOPMENT_TEAM = HCKE9T3AHJ; 260 | DYLIB_COMPATIBILITY_VERSION = 1; 261 | DYLIB_CURRENT_VERSION = 1; 262 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 263 | INFOPLIST_FILE = Nihongo/Info.plist; 264 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 265 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 266 | PRODUCT_BUNDLE_IDENTIFIER = tototvalavadze.forged.Nihongo; 267 | PRODUCT_NAME = "$(TARGET_NAME)"; 268 | SKIP_INSTALL = YES; 269 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 270 | SWIFT_VERSION = 3.0; 271 | }; 272 | name = Debug; 273 | }; 274 | 99DA258B1E057786007F4794 /* Release */ = { 275 | isa = XCBuildConfiguration; 276 | buildSettings = { 277 | CLANG_ENABLE_MODULES = YES; 278 | CODE_SIGN_IDENTITY = ""; 279 | DEFINES_MODULE = YES; 280 | DEVELOPMENT_TEAM = HCKE9T3AHJ; 281 | DYLIB_COMPATIBILITY_VERSION = 1; 282 | DYLIB_CURRENT_VERSION = 1; 283 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 284 | INFOPLIST_FILE = Nihongo/Info.plist; 285 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 286 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 287 | PRODUCT_BUNDLE_IDENTIFIER = tototvalavadze.forged.Nihongo; 288 | PRODUCT_NAME = "$(TARGET_NAME)"; 289 | SKIP_INSTALL = YES; 290 | SWIFT_VERSION = 3.0; 291 | }; 292 | name = Release; 293 | }; 294 | /* End XCBuildConfiguration section */ 295 | 296 | /* Begin XCConfigurationList section */ 297 | 99DA257B1E057786007F4794 /* Build configuration list for PBXProject "Nihongo" */ = { 298 | isa = XCConfigurationList; 299 | buildConfigurations = ( 300 | 99DA25871E057786007F4794 /* Debug */, 301 | 99DA25881E057786007F4794 /* Release */, 302 | ); 303 | defaultConfigurationIsVisible = 0; 304 | defaultConfigurationName = Release; 305 | }; 306 | 99DA25891E057786007F4794 /* Build configuration list for PBXNativeTarget "Nihongo" */ = { 307 | isa = XCConfigurationList; 308 | buildConfigurations = ( 309 | 99DA258A1E057786007F4794 /* Debug */, 310 | 99DA258B1E057786007F4794 /* Release */, 311 | ); 312 | defaultConfigurationIsVisible = 0; 313 | defaultConfigurationName = Release; 314 | }; 315 | /* End XCConfigurationList section */ 316 | }; 317 | rootObject = 99DA25781E057786007F4794 /* Project object */; 318 | } 319 | --------------------------------------------------------------------------------