├── .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 | 
4 | [](http://cocoapods.org/pods/Typist)
5 | [](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 | 
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 |
--------------------------------------------------------------------------------