From 0b783c1173eb1f60bdda5cc94baf3265f94b9429 Mon Sep 17 00:00:00 2001 From: Abel Fokkinga Date: Thu, 8 Nov 2012 18:38:18 +0100 Subject: [PATCH] Initial checkin --- Default-568h@2x.png | Bin 0 -> 18594 bytes Espagram.xcodeproj/project.pbxproj | 45 +- .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 37857 bytes .../WorkspaceSettings.xcsettings | 10 + .../xcdebugger/Breakpoints.xcbkptlist | 20 + .../xcschemes/Espagram.xcscheme | 86 +++ .../xcschemes/xcschememanagement.plist | 22 + Espagram/ConjugatedTense.h | 21 + Espagram/ConjugatedTense.m | 22 + Espagram/Conjugations.h | 20 + Espagram/Conjugations.m | 19 + Espagram/Conjugator.h | 15 + Espagram/Espagram-Info.plist | 2 - .../.xccurrentversion | 5 + Espagram/EspagramMainViewController.h | 15 + Espagram/EspagramMainViewController.m | 83 +++ Espagram/EspagramTestView.h | 13 + Espagram/EspagramTestView.m | 31 + Espagram/EspagramTestViewController.h | 17 + Espagram/EspagramTestViewController.m | 50 ++ Espagram/GrammarTestViewController.h | 23 + Espagram/GrammarTestViewController.m | 63 ++ Espagram/NSMutableArray_Shuffling.h | 33 + Espagram/Persons.h | 19 + Espagram/Persons.m | 18 + Espagram/SpanishConjugator.h | 15 + Espagram/SpanishConjugator.m | 576 ++++++++++++++++++ Espagram/Tenses.h | 19 + Espagram/Tenses.m | 18 + Espagram/TestBrain.h | 22 + Espagram/TestBrain.m | 34 ++ Espagram/Verbs.h | 22 + Espagram/Verbs.m | 21 + Espagram/en.lproj/MainStoryboard.storyboard | 301 ++++++++- 35 files changed, 1675 insertions(+), 12 deletions(-) create mode 100644 Default-568h@2x.png create mode 100644 Espagram.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcschemes/Espagram.xcscheme create mode 100644 Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Espagram/ConjugatedTense.h create mode 100644 Espagram/ConjugatedTense.m create mode 100644 Espagram/Conjugations.h create mode 100644 Espagram/Conjugations.m create mode 100644 Espagram/Conjugator.h create mode 100644 Espagram/EspagramData.xcdatamodeld/.xccurrentversion create mode 100644 Espagram/EspagramMainViewController.h create mode 100644 Espagram/EspagramMainViewController.m create mode 100644 Espagram/EspagramTestView.h create mode 100644 Espagram/EspagramTestView.m create mode 100644 Espagram/EspagramTestViewController.h create mode 100644 Espagram/EspagramTestViewController.m create mode 100644 Espagram/GrammarTestViewController.h create mode 100644 Espagram/GrammarTestViewController.m create mode 100644 Espagram/NSMutableArray_Shuffling.h create mode 100644 Espagram/Persons.h create mode 100644 Espagram/Persons.m create mode 100644 Espagram/SpanishConjugator.h create mode 100644 Espagram/SpanishConjugator.m create mode 100644 Espagram/Tenses.h create mode 100644 Espagram/Tenses.m create mode 100644 Espagram/TestBrain.h create mode 100644 Espagram/TestBrain.m create mode 100644 Espagram/Verbs.h create mode 100644 Espagram/Verbs.m diff --git a/Default-568h@2x.png b/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/Espagram.xcodeproj/project.pbxproj b/Espagram.xcodeproj/project.pbxproj index 76037bb..ddb25aa 100644 --- a/Espagram.xcodeproj/project.pbxproj +++ b/Espagram.xcodeproj/project.pbxproj @@ -15,6 +15,12 @@ B506EC7315EBF67500566A27 /* EspagramAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B506EC7215EBF67500566A27 /* EspagramAppDelegate.m */; }; B506EC7615EBF67500566A27 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B506EC7415EBF67500566A27 /* MainStoryboard.storyboard */; }; B506EC7915EBF67500566A27 /* EspagramViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B506EC7815EBF67500566A27 /* EspagramViewController.m */; }; + B506EC8415EC005B00566A27 /* EspagramMainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B506EC8315EC005B00566A27 /* EspagramMainViewController.m */; }; + B506ECA515EE898700566A27 /* SpanishConjugator.m in Sources */ = {isa = PBXBuildFile; fileRef = B506ECA415EE898700566A27 /* SpanishConjugator.m */; }; + B512F63B164BEC6000DA031E /* EspagramTestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B512F63A164BEC6000DA031E /* EspagramTestViewController.m */; }; + B512F63E164BEC8E00DA031E /* EspagramTestView.m in Sources */ = {isa = PBXBuildFile; fileRef = B512F63D164BEC8E00DA031E /* EspagramTestView.m */; }; + B5EFD38C162CA69F00C6E2EB /* GrammarTestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EFD38B162CA69F00C6E2EB /* GrammarTestViewController.m */; }; + B5EFD392162CB18000C6E2EB /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B5EFD391162CB18000C6E2EB /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -31,6 +37,19 @@ B506EC7515EBF67500566A27 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = ""; }; B506EC7715EBF67500566A27 /* EspagramViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EspagramViewController.h; sourceTree = ""; }; B506EC7815EBF67500566A27 /* EspagramViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EspagramViewController.m; sourceTree = ""; }; + B506EC8215EC005B00566A27 /* EspagramMainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramMainViewController.h; sourceTree = ""; }; + B506EC8315EC005B00566A27 /* EspagramMainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramMainViewController.m; sourceTree = ""; }; + B506ECA315EE898700566A27 /* SpanishConjugator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpanishConjugator.h; sourceTree = ""; }; + B506ECA415EE898700566A27 /* SpanishConjugator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SpanishConjugator.m; sourceTree = ""; }; + B512F639164BEC6000DA031E /* EspagramTestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramTestViewController.h; sourceTree = ""; }; + B512F63A164BEC6000DA031E /* EspagramTestViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramTestViewController.m; sourceTree = ""; }; + B512F63C164BEC8E00DA031E /* EspagramTestView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramTestView.h; sourceTree = ""; }; + B512F63D164BEC8E00DA031E /* EspagramTestView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramTestView.m; sourceTree = ""; }; + B58F57661635D27E00CED51B /* Conjugator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Conjugator.h; sourceTree = ""; }; + B58F576D16387BE600CED51B /* NSMutableArray_Shuffling.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = NSMutableArray_Shuffling.h; path = Espagram/NSMutableArray_Shuffling.h; sourceTree = ""; }; + B5EFD38A162CA69F00C6E2EB /* GrammarTestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GrammarTestViewController.h; sourceTree = ""; }; + B5EFD38B162CA69F00C6E2EB /* GrammarTestViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GrammarTestViewController.m; sourceTree = ""; }; + B5EFD391162CB18000C6E2EB /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -50,6 +69,8 @@ B506EC5315EBF67500566A27 = { isa = PBXGroup; children = ( + B5EFD391162CB18000C6E2EB /* Default-568h@2x.png */, + B58F576D16387BE600CED51B /* NSMutableArray_Shuffling.h */, B506EC6815EBF67500566A27 /* Espagram */, B506EC6115EBF67500566A27 /* Frameworks */, B506EC5F15EBF67500566A27 /* Products */, @@ -78,8 +99,19 @@ isa = PBXGroup; children = ( B506EC7115EBF67500566A27 /* EspagramAppDelegate.h */, - B506EC7215EBF67500566A27 /* EspagramAppDelegate.m */, B506EC7415EBF67500566A27 /* MainStoryboard.storyboard */, + B512F63C164BEC8E00DA031E /* EspagramTestView.h */, + B512F63D164BEC8E00DA031E /* EspagramTestView.m */, + B512F639164BEC6000DA031E /* EspagramTestViewController.h */, + B512F63A164BEC6000DA031E /* EspagramTestViewController.m */, + B506EC7215EBF67500566A27 /* EspagramAppDelegate.m */, + B5EFD38A162CA69F00C6E2EB /* GrammarTestViewController.h */, + B5EFD38B162CA69F00C6E2EB /* GrammarTestViewController.m */, + B506ECA315EE898700566A27 /* SpanishConjugator.h */, + B506ECA415EE898700566A27 /* SpanishConjugator.m */, + B58F57661635D27E00CED51B /* Conjugator.h */, + B506EC8215EC005B00566A27 /* EspagramMainViewController.h */, + B506EC8315EC005B00566A27 /* EspagramMainViewController.m */, B506EC7715EBF67500566A27 /* EspagramViewController.h */, B506EC7815EBF67500566A27 /* EspagramViewController.m */, B506EC6915EBF67500566A27 /* Supporting Files */, @@ -152,6 +184,7 @@ files = ( B506EC6D15EBF67500566A27 /* InfoPlist.strings in Resources */, B506EC7615EBF67500566A27 /* MainStoryboard.storyboard in Resources */, + B5EFD392162CB18000C6E2EB /* Default-568h@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -165,6 +198,11 @@ B506EC6F15EBF67500566A27 /* main.m in Sources */, B506EC7315EBF67500566A27 /* EspagramAppDelegate.m in Sources */, B506EC7915EBF67500566A27 /* EspagramViewController.m in Sources */, + B506EC8415EC005B00566A27 /* EspagramMainViewController.m in Sources */, + B506ECA515EE898700566A27 /* SpanishConjugator.m in Sources */, + B5EFD38C162CA69F00C6E2EB /* GrammarTestViewController.m in Sources */, + B512F63B164BEC6000DA031E /* EspagramTestViewController.m in Sources */, + B512F63E164BEC8E00DA031E /* EspagramTestView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -245,7 +283,9 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Espagram/Espagram-Prefix.pch"; INFOPLIST_FILE = "Espagram/Espagram-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = 1; WRAPPER_EXTENSION = app; }; name = Debug; @@ -256,7 +296,9 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Espagram/Espagram-Prefix.pch"; INFOPLIST_FILE = "Espagram/Espagram-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = 1; WRAPPER_EXTENSION = app; }; name = Release; @@ -280,6 +322,7 @@ B506EC7E15EBF67500566A27 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Espagram.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Espagram.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8c6db90 --- /dev/null +++ b/Espagram.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/UserInterfaceState.xcuserstate b/Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5829115cd1694077a7ee6357b285138e70134395 GIT binary patch literal 37857 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 VL;u!&?Gh9J + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..3e56e74 --- /dev/null +++ b/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,20 @@ + + + + + + + diff --git a/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcschemes/Espagram.xcscheme b/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcschemes/Espagram.xcscheme new file mode 100644 index 0000000..47148e2 --- /dev/null +++ b/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcschemes/Espagram.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcschemes/xcschememanagement.plist b/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..a6916e3 --- /dev/null +++ b/Espagram.xcodeproj/xcuserdata/abel.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + Espagram.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + B506EC5D15EBF67500566A27 + + primary + + + + + diff --git a/Espagram/ConjugatedTense.h b/Espagram/ConjugatedTense.h new file mode 100644 index 0000000..67353a2 --- /dev/null +++ b/Espagram/ConjugatedTense.h @@ -0,0 +1,21 @@ +// +// ConjugatedTense.h +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import + +@class Conjugations, Tenses, Verbs; + +@interface ConjugatedTense : NSManagedObject + +@property (nonatomic, retain) NSNumber * regularConjugation; +@property (nonatomic, retain) Verbs *verb; +@property (nonatomic, retain) Tenses *tense; +@property (nonatomic, retain) Conjugations *irregularConjugation; + +@end diff --git a/Espagram/ConjugatedTense.m b/Espagram/ConjugatedTense.m new file mode 100644 index 0000000..b84ae35 --- /dev/null +++ b/Espagram/ConjugatedTense.m @@ -0,0 +1,22 @@ +// +// ConjugatedTense.m +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "ConjugatedTense.h" +#import "Conjugations.h" +#import "Tenses.h" +#import "Verbs.h" + + +@implementation ConjugatedTense + +@dynamic regularConjugation; +@dynamic verb; +@dynamic tense; +@dynamic irregularConjugation; + +@end diff --git a/Espagram/Conjugations.h b/Espagram/Conjugations.h new file mode 100644 index 0000000..9f93f33 --- /dev/null +++ b/Espagram/Conjugations.h @@ -0,0 +1,20 @@ +// +// Conjugations.h +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import + +@class Persons; + +@interface Conjugations : NSManagedObject + +@property (nonatomic, retain) NSString * root; +@property (nonatomic, retain) NSString * exit; +@property (nonatomic, retain) Persons *conjugationPerson; + +@end diff --git a/Espagram/Conjugations.m b/Espagram/Conjugations.m new file mode 100644 index 0000000..44bc4bd --- /dev/null +++ b/Espagram/Conjugations.m @@ -0,0 +1,19 @@ +// +// Conjugations.m +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "Conjugations.h" +#import "Persons.h" + + +@implementation Conjugations + +@dynamic root; +@dynamic exit; +@dynamic conjugationPerson; + +@end diff --git a/Espagram/Conjugator.h b/Espagram/Conjugator.h new file mode 100644 index 0000000..1309c5d --- /dev/null +++ b/Espagram/Conjugator.h @@ -0,0 +1,15 @@ +// +// Conjugator.h +// Espagram +// +// Created by Abel Fokkinga on 10/22/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import + +@protocol Conjugator + +- (NSString *) conjugateVerb:(NSString *) verb inPerson:(NSString *) person andTense:(NSString *) tense; + +@end diff --git a/Espagram/Espagram-Info.plist b/Espagram/Espagram-Info.plist index 4973682..6e6f80f 100644 --- a/Espagram/Espagram-Info.plist +++ b/Espagram/Espagram-Info.plist @@ -33,8 +33,6 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight diff --git a/Espagram/EspagramData.xcdatamodeld/.xccurrentversion b/Espagram/EspagramData.xcdatamodeld/.xccurrentversion new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/Espagram/EspagramData.xcdatamodeld/.xccurrentversion @@ -0,0 +1,5 @@ + + + + + diff --git a/Espagram/EspagramMainViewController.h b/Espagram/EspagramMainViewController.h new file mode 100644 index 0000000..0fecea3 --- /dev/null +++ b/Espagram/EspagramMainViewController.h @@ -0,0 +1,15 @@ +// +// EspagramMainViewController.h +// Espagram +// +// Created by Abel Fokkinga on 8/27/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import + +@interface EspagramMainViewController : UIViewController + +- (IBAction)testTense:(UIButton *)sender; + +@end diff --git a/Espagram/EspagramMainViewController.m b/Espagram/EspagramMainViewController.m new file mode 100644 index 0000000..63dad48 --- /dev/null +++ b/Espagram/EspagramMainViewController.m @@ -0,0 +1,83 @@ +// +// EspagramMainViewController.m +// Espagram +// +// Created by Abel Fokkinga on 8/27/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "EspagramMainViewController.h" +#import "GrammarTestViewController.h" +#import "SpanishConjugator.h" + +@interface EspagramMainViewController () +@property (nonatomic, strong) NSString *language, *tense, *displayTitle; +@end + +@implementation EspagramMainViewController + +@synthesize language = _language; +@synthesize tense = _tense; +@synthesize displayTitle = _displayTitle; + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (id ) getLanguage { + if ( [@"Spanish" isEqualToString:_language] ) { + return [[SpanishConjugator alloc] init]; + } else return nil; +} + + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return YES; +} + +- (void) testVerbsWithLanguage:(NSString *)language andTense:(NSString *)tense andTitle:(NSString *) title; +{ + self.language = language; + self.tense = tense; + self.displayTitle = title; + [self performSegueWithIdentifier:@"Testing" sender:self]; +} + +- (IBAction)testTense:(UIButton *)sender +{ + + if ( [sender.titleLabel.text isEqualToString:@"Presente"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"SIMPLE_PRESENT" andTitle:sender.titleLabel.text]; + } else if ( [sender.titleLabel.text isEqualToString:@"Pretérito"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"SIMPLE_PAST" andTitle:sender.titleLabel.text]; + } else if ( [sender.titleLabel.text isEqualToString:@"Imperfecto"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"IMPERFECT" andTitle:sender.titleLabel.text]; + } else if ( [sender.titleLabel.text isEqualToString:@"Futuro"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"FUTURE" andTitle:sender.titleLabel.text]; + } else if ( [sender.titleLabel.text isEqualToString:@"Perfecto"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"PRESENT_PERFECT" andTitle:sender.titleLabel.text]; + } else if ( [sender.titleLabel.text isEqualToString:@"Pluscuamperfecto"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"PAST_PERFECT" andTitle:sender.titleLabel.text]; + } else if ( [sender.titleLabel.text isEqualToString:@"Futuro Perfecto"] ) { + [self testVerbsWithLanguage: @"Spanish" andTense:@"FUTURE_PERFECT" andTitle:sender.titleLabel.text]; + } + +} + + +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + + if ( [segue.identifier isEqualToString:@"Testing"]) { + [segue.destinationViewController setTitle:self.displayTitle]; + [segue.destinationViewController setConjugator:[self getLanguage]]; + [segue.destinationViewController setTense:self.tense]; + } +} + +@end \ No newline at end of file diff --git a/Espagram/EspagramTestView.h b/Espagram/EspagramTestView.h new file mode 100644 index 0000000..bb58e16 --- /dev/null +++ b/Espagram/EspagramTestView.h @@ -0,0 +1,13 @@ +// +// EspagramTestView.h +// Espagram +// +// Created by Abel Fokkinga on 11/8/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import + +@interface EspagramTestView : UIView + +@end diff --git a/Espagram/EspagramTestView.m b/Espagram/EspagramTestView.m new file mode 100644 index 0000000..b534626 --- /dev/null +++ b/Espagram/EspagramTestView.m @@ -0,0 +1,31 @@ +// +// EspagramTestView.m +// Espagram +// +// Created by Abel Fokkinga on 11/8/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "EspagramTestView.h" + +@implementation EspagramTestView + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + // Initialization code + } + return self; +} + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect +{ + // Drawing code +} +*/ + +@end diff --git a/Espagram/EspagramTestViewController.h b/Espagram/EspagramTestViewController.h new file mode 100644 index 0000000..6ae192a --- /dev/null +++ b/Espagram/EspagramTestViewController.h @@ -0,0 +1,17 @@ +// +// EspagramTestViewController.h +// Espagram +// +// Created by Abel Fokkinga on 11/8/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import "Conjugator.h" + +@interface EspagramTestViewController : UIViewController + +@property (nonatomic, strong) id conjugator; +@property (nonatomic, strong) NSString * tense; + +@end diff --git a/Espagram/EspagramTestViewController.m b/Espagram/EspagramTestViewController.m new file mode 100644 index 0000000..32f2df1 --- /dev/null +++ b/Espagram/EspagramTestViewController.m @@ -0,0 +1,50 @@ +// +// EspagramTestViewController.m +// Espagram +// +// Created by Abel Fokkinga on 11/8/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "EspagramTestViewController.h" +#import "GrammarTestViewController.h" + +@interface EspagramTestViewController () + +@end + +@implementation EspagramTestViewController + +@synthesize conjugator = _conjugator; + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view. +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + + if ( [segue.identifier isEqualToString:@"Conjugate"]) { + [segue.destinationViewController setConjugator:self.conjugator]; + [segue.destinationViewController setTense:self.tense]; + } +} + +@end diff --git a/Espagram/GrammarTestViewController.h b/Espagram/GrammarTestViewController.h new file mode 100644 index 0000000..72421c8 --- /dev/null +++ b/Espagram/GrammarTestViewController.h @@ -0,0 +1,23 @@ +// +// GrammarTestViewController.h +// Espagram +// +// Created by Abel Fokkinga on 10/15/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import "Conjugator.h" + +@class GrammarTestViewController; + +@interface GrammarTestViewController : UIViewController + +@property (weak, nonatomic) IBOutlet UITextField *verbInput; + +@property (weak, nonatomic) IBOutlet id conjugator; +@property (weak, nonatomic) IBOutlet NSString *tense; + +@property (weak, nonatomic) IBOutlet UILabel *tenseLabel; + +@end diff --git a/Espagram/GrammarTestViewController.m b/Espagram/GrammarTestViewController.m new file mode 100644 index 0000000..86a6cbf --- /dev/null +++ b/Espagram/GrammarTestViewController.m @@ -0,0 +1,63 @@ +// +// GrammarTestViewController.m +// Espagram +// +// Created by Abel Fokkinga on 10/15/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "GrammarTestViewController.h" +#import "Conjugator.h" + + +@implementation GrammarTestViewController + +@synthesize conjugator = _conjugator; +@synthesize verbInput = _verbInput; +@synthesize tense = _tense; + + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (IBAction)verbEntered:(id *)sender { + [self resignFirstResponder]; +} + +- (void) setTense:(NSString *)tense { + NSLog(@"New tense: %@",tense); + if ( ![tense isEqualToString:_tense] ) { + NSLog(@"Setting tense: %@",tense); + _tense = tense; + self.tenseLabel.text = tense; + } + +} + +- (IBAction)conjugateButtonPressed { +// self.conjugatedVerbDisplay.text = [self.conjugator conjugateVerb:self.verbInput.text inPerson:[self getSelectedPerson] andTense:[self getSelectedTense] ]; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view. +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} +; +- (void)viewDidUnload { + [self setVerbInput:nil]; + [super viewDidUnload]; +} +@end diff --git a/Espagram/NSMutableArray_Shuffling.h b/Espagram/NSMutableArray_Shuffling.h new file mode 100644 index 0000000..1ea48ff --- /dev/null +++ b/Espagram/NSMutableArray_Shuffling.h @@ -0,0 +1,33 @@ +// NSMutableArray_Shuffling.h + +#if TARGET_OS_IPHONE +#import +#else +#include +#endif + +// This category enhances NSMutableArray by providing +// methods to randomly shuffle the elements. +@interface NSMutableArray (Shuffling) +- (void)shuffle; +@end + + +// NSMutableArray_Shuffling.m + +#import "NSMutableArray_Shuffling.h" + +@implementation NSMutableArray (Shuffling) + +- (void)shuffle +{ + NSUInteger count = [self count]; + for (NSUInteger i = 0; i < count; ++i) { + // Select a random element between i and end of array to swap with. + NSInteger nElements = count - i; + NSInteger n = (arc4random() % nElements) + i; + [self exchangeObjectAtIndex:i withObjectAtIndex:n]; + } +} + +@end \ No newline at end of file diff --git a/Espagram/Persons.h b/Espagram/Persons.h new file mode 100644 index 0000000..d2bd931 --- /dev/null +++ b/Espagram/Persons.h @@ -0,0 +1,19 @@ +// +// Persons.h +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import + + +@interface Persons : NSManagedObject + +@property (nonatomic, retain) NSString * language; +@property (nonatomic, retain) NSString * person; +@property (nonatomic, retain) NSString * translation; + +@end diff --git a/Espagram/Persons.m b/Espagram/Persons.m new file mode 100644 index 0000000..154e029 --- /dev/null +++ b/Espagram/Persons.m @@ -0,0 +1,18 @@ +// +// Persons.m +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "Persons.h" + + +@implementation Persons + +@dynamic language; +@dynamic person; +@dynamic translation; + +@end diff --git a/Espagram/SpanishConjugator.h b/Espagram/SpanishConjugator.h new file mode 100644 index 0000000..9844eeb --- /dev/null +++ b/Espagram/SpanishConjugator.h @@ -0,0 +1,15 @@ +// +// ConjugateRegularVerb.h +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import "Conjugator.h" + +@interface SpanishConjugator : NSObject + + +@end diff --git a/Espagram/SpanishConjugator.m b/Espagram/SpanishConjugator.m new file mode 100644 index 0000000..71a4dee --- /dev/null +++ b/Espagram/SpanishConjugator.m @@ -0,0 +1,576 @@ +// +// ConjugateRegularVerb.m +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "SpanishConjugator.h" + +@interface SpanishConjugator() + +@property (nonatomic, strong) NSArray *simplePresentEtoIEstemChangersArray, + *simplePresentOtoUEstemChangersArray, + *simplePresentEtoIstemChangersArray; + + +@end + +@implementation SpanishConjugator + +@synthesize simplePresentEtoIEstemChangersArray = _simplePresentEtoIEstemChangersArray; +@synthesize simplePresentOtoUEstemChangersArray = _simplePresentOtoUEstemChangersArray; +@synthesize simplePresentEtoIstemChangersArray = _simplePresentEtoIstemChangersArray; + +- (NSArray *) simplePresentEtoIEstemChangersArray{ + if (_simplePresentEtoIEstemChangersArray == nil) + _simplePresentEtoIEstemChangersArray = [[NSArray alloc] initWithObjects:@"acertar", @"encender",@"advertir",@"entender",@"cerrar",@"fregar",@"comenzar",@"hervir",@"confesar",@"mentir",@"consentir",@"negar",@"convertir",@"pensar",@"defender",@"perder",@"empezar",@"preferir",@"querer",@"merendar",nil]; + + return _simplePresentEtoIEstemChangersArray; +} + +- (NSArray *) simplePresentOtoUEstemChangersArray{ + if (_simplePresentOtoUEstemChangersArray == nil) + _simplePresentOtoUEstemChangersArray = [[NSArray alloc] initWithObjects:@"almorzar",@"morir",@"aprobar",@"mostrar",@"colgar",@"mover",@"contar",@"probar",@"costar",@"recordar",@"devolver",@"resolver",@"volver",@"rogar",@"dormir",@"sonar",@"encontrar",@"soñar",@"envolver",@"tostar",@"morder",@"volar",@"poder",nil]; + + return _simplePresentOtoUEstemChangersArray; +} + +- (NSArray *) simplePresentEtoIstemChangersArray{ + if (_simplePresentEtoIstemChangersArray == nil) + _simplePresentEtoIstemChangersArray = [[NSArray alloc] initWithObjects:@"impedir",@"colegir",@"competir",@"medir",@"conseguir",@"pedir",@"corregir",@"perseguir",@"reír",@"despedir",@"repetir", @"seguir",@"freír",@"servir",@"gemir",@"sonreír",nil]; // not including elegir here as it also has an g to j change in first person singular + + return _simplePresentEtoIstemChangersArray; +} + + +- (NSString *) getExit:(NSString *) verb { + + NSLog(@"getExit start"); + + return [verb substringFromIndex:[verb length] - 2]; + +} + +- (NSString *) getStem:(NSString *) verb { + + NSLog(@"getStem start"); + + if ( [[self getExit:verb] isEqualToString:@"ír"] ) + return [[verb substringToIndex:[verb length] -2] stringByAppendingString:@"i"]; + NSLog(@"getStem end"); + + return [verb substringToIndex:[verb length] -2]; +} + +- (NSString *) getSimplePresentStemVerb:(NSString *) verb inPerson:(NSString *) person { + NSString * verbStem = [self getStem:verb]; + + NSLog(@"getSimplePresentStemVerb start.irregular"); + + + // Bit irregular + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"] ) { + if ( [verb rangeOfString:@"coger"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"cog"] withString:@"coj"]; + if ( [verb rangeOfString:@"poner"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"pon"] withString:@"pong"]; + if ( [verb isEqualToString:@"oír"] ) + return @"oig"; + + + // conducir, conocer etc. + if ( [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"cer"] || + [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"cir"] ) + return [[verbStem substringToIndex:[verbStem length] - 1] stringByAppendingString:@"zc"]; + + if ( [verb isEqualToString:@"oír"] ) + return @"oí"; + + // appearance of g in the first person + if ( [verb isEqualToString:@"caer"] ) return @"caig"; + if ( [verb isEqualToString:@"traer"] ) return @"traig"; + if ( [verb rangeOfString:@"decir"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"dec"] withString:@"dig"]; + if ( [verb rangeOfString:@"hacer"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"hac"] withString:@"hag"]; + if ( [verb rangeOfString:@"poner"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"pon"] withString:@"pong"]; + if ( [verb isEqualToString:@"salir"] ) return @"salg"; + if ( [verb rangeOfString:@"tener"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verb rangeOfString:@"ten"] withString:@"teng"]; + if ( [verb isEqualToString:@"valer"] ) return @"valg"; + if ( [verb rangeOfString:@"venir"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"ven"] withString:@"veng"]; + + // other + if ( [verb isEqualToString:@"ver"] ) return @"ve"; + + // g -> j + if ( [verb isEqualToString:@"elegir"] ) return @"elij"; + + // g -> j + if ( [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"gir"] ) + return [[verb substringToIndex:[verb length] - 3] stringByAppendingString:@"j"]; + + // gu -> g + if ( [[verb substringFromIndex:[verb length] - 4] isEqualToString:@"guir"] ) + return [[verb substringToIndex:[verb length] - 4] stringByAppendingString:@"g"]; + + + + } + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"] || + [person isEqualToString:@"SECOND_PERSON_SINGULAR"] || + [person isEqualToString:@"THIRD_PERSON_SINGULAR"] || + [person isEqualToString:@"THIRD_PERSON_PLURAL"] + ) { + + if ( [verb rangeOfString:@"decir"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"dec"] withString:@"dic"]; + if ( [verb isEqualToString:@"oír"] ) + return @"oy"; + if ( [verb rangeOfString:@"tener"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verb rangeOfString:@"ten"] withString:@"tien"]; + + // Verbs adding an accent + if ( [verb isEqualToString:@"continuar"] ) return @"continú"; + if ( [verb isEqualToString:@"enviar"] ) return @"enví"; + if ( [verb isEqualToString:@"actuar"] ) return @"actú"; + if ( [verb isEqualToString:@"graduar"] ) return @"gradú"; + if ( [verb isEqualToString:@"confiar"] ) return @"confí"; + if ( [verb isEqualToString:@"criar"] ) return @"crí"; + if ( [verb isEqualToString:@"esquiar"] ) return @"esquí"; + if ( [verb isEqualToString:@"vaciar"] ) return @"vací"; + + + } + + if ( [person isEqualToString:@"SECOND_PERSON_PLURAL"]) { + if ( [verb isEqualToString:@"oír"] ) + return @"oí"; + } + + if ( [verb isEqualToString:@"elegir"] ) return @"elig"; + + + // Regular + NSLog(@"getSimplePresentStemVerb start.regular"); + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"] || + [person isEqualToString:@"SECOND_PERSON_SINGULAR"] || + [person isEqualToString:@"THIRD_PERSON_SINGULAR"] || + [person isEqualToString:@"THIRD_PERSON_PLURAL"] + ) { + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to ie + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e"] withString:@"ie"]; + } + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to ie + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o"] withString:@"ue"]; + } + if ( [[self simplePresentEtoIstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to ie + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e"] withString:@"i"]; + } + // u -> ue + if ( [verb isEqualToString:@"jugar"]) return @"jueg"; + + + // huir, construir + if ( [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"uir"] && + ![[verb substringFromIndex:[verb length] - 3] isEqualToString:@"guir"]) + return [[verb substringToIndex:[verb length] - 3] stringByAppendingString:@"uy"]; + } + + NSLog(@"getSimplePresentStemVerb end"); + return verbStem; + +} + + +- (NSString *) conjugateSimplePresentVerb:(NSString *) verb inPerson:(NSString *) person { + NSLog(@"conjugateRegularSimplePresentVerb Start"); + + NSString * verbStem = [self getSimplePresentStemVerb:verb inPerson:person]; + NSString * verbExit = [self getExit:verb]; + + // very irregular + if ( [verb isEqualToString:@"haber"] ) return @"hay"; + + // other types of first person changes + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"]) { + if ( [verb isEqualToString:@"caber"] ) return @"quepo"; + if ( [verb isEqualToString:@"dar"] ) return @"doy"; + if ( [verb isEqualToString:@"saber"] ) return @"sé"; + } + + // regular + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"]) { + if ( [verb isEqualToString:@"estar"] ) return @"estoy"; + if ( [verb isEqualToString:@"ser"] ) return @"soy"; + if ( [verb isEqualToString:@"ir"] ) return @"voy"; + if ( [verb isEqualToString:@"oler"] ) return @"huelo"; + + return [verbStem stringByAppendingString:@"o"]; + } + if ( [person isEqualToString:@"SECOND_PERSON_SINGULAR"]) { + if ( [verb isEqualToString:@"estar"] ) return @"estás"; + if ( [verb isEqualToString:@"ser"] ) return @"eres"; + if ( [verb isEqualToString:@"ir"] ) return @"vas"; + if ( [verb isEqualToString:@"oler"] ) return @"hueles"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"as"]; + else return [verbStem stringByAppendingString:@"es"]; + } + if ( [person isEqualToString:@"THIRD_PERSON_SINGULAR"]) { + if ( [verb isEqualToString:@"estar"] ) return @"está"; + if ( [verb isEqualToString:@"ser"] ) return @"es"; + if ( [verb isEqualToString:@"ir"] ) return @"va"; + if ( [verb isEqualToString:@"oler"] ) return @"huele"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"a"]; + else return [verbStem stringByAppendingString:@"e"]; + } + if ( [person isEqualToString:@"FIRST_PERSON_PLURAL"]) { + if ( [verb isEqualToString:@"estar"] ) return @"estamos"; + if ( [verb isEqualToString:@"ser"] ) return @"somos"; + if ( [verb isEqualToString:@"ir"] ) return @"vamos"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"amos"]; + if ( [@"er" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"emos"]; + if ( [@"ir" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"imos"]; + } + if ( [person isEqualToString:@"SECOND_PERSON_PLURAL"]) { + if ( [verb isEqualToString:@"estar"] ) return @"estáis"; + if ( [verb isEqualToString:@"ser"] ) return @"sois"; + if ( [verb isEqualToString:@"ir"] ) return @"vais"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"áis"]; + if ( [@"er" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"éis"]; + if ( [@"ir" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"ís"]; + } + if ( [person isEqualToString:@"THIRD_PERSON_PLURAL"]) { + if ( [verb isEqualToString:@"estar"] ) return @"están"; + if ( [verb isEqualToString:@"ser"] ) return @"son"; + if ( [verb isEqualToString:@"ir"] ) return @"van"; + if ( [verb isEqualToString:@"oler"] ) return @"huelen"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"an"]; + else return [verbStem stringByAppendingString:@"en"]; + } + + return verb; +} + + +- (NSString *) conjugateSimplePastVerb:(NSString *) verb inPerson:(NSString *) person { + + NSString * verbStem = [self getStem:verb]; + NSString * verbExit = [self getExit:verb]; + + if ( [verb isEqualToString:@"andar"]) verbStem = @"anduv"; + if ( [verb isEqualToString:@"conducir"]) verbStem = @"conduj"; + if ( [verb isEqualToString:@"decir"]) verbStem = @"dij"; + if ( [verb isEqualToString:@"estar"]) verbStem = @"estuv"; + if ( [verb isEqualToString:@"haber"]) verbStem = @"hub"; + if ( [verb isEqualToString:@"hacer"]) { + if ( [person isEqualToString:@"THIRD_PERSON_SINGULAR"]) verbStem = @"hiz"; + else verbStem = @"hic"; + } + if ( [verb isEqualToString:@"poder"]) verbStem = @"pud"; + if ( [verb isEqualToString:@"poner"]) verbStem = @"pus"; + if ( [verb isEqualToString:@"querer"]) verbStem = @"quis"; + if ( [verb isEqualToString:@"saber"]) verbStem = @"sup"; + if ( [verb isEqualToString:@"tener"]) verbStem = @"tuv"; + if ( [verb isEqualToString:@"traducir"]) verbStem = @"traduj"; + if ( [verb isEqualToString:@"traer"]) verbStem = @"traj"; + if ( [verb isEqualToString:@"venir"]) verbStem = @"vin"; + + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"]) { + + // Irregular + if ( [verb isEqualToString:@"dar"]) return @"di"; + if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fui"; + + if ( [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"car"] ) + return [[verb substringFromIndex:[verb length] - 3] stringByAppendingString:@"qué"]; + + if ( [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"gar"] ) + return [[verb substringFromIndex:[verb length] - 3] stringByAppendingString:@"gué"]; + + if ( [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"zar"] ) + return [[verb substringFromIndex:[verb length] - 3] stringByAppendingString:@"cé"]; + + if ( [verbStem isEqualToString:[self getStem:verb]]) { + // Regular + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"é"]; + else return [verbStem stringByAppendingString:@"í"]; + } else { + // Irregular + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"e"]; + else return [verbStem stringByAppendingString:@"i"]; + } + + } + if ( [person isEqualToString:@"SECOND_PERSON_SINGULAR"]) { + + // Irregular + if ( [verb isEqualToString:@"dar"]) return @"diste"; + if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fuiste"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aste"]; + else [verbStem stringByAppendingString:@"iste"]; + } + if ( [person isEqualToString:@"THIRD_PERSON_SINGULAR"]) { + + // Irregular + if ( [verb isEqualToString:@"dar"]) return @"dio"; + if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fue"; + + if ( [[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"e"] || + [[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"i"]) + // If the stem of an -er or -ir ends in a vowel, the -i of the 3rd person changes to y + return [verbStem stringByAppendingString:@"yó"]; + + if ( ![@"ar" isEqualToString:verbExit] ) { + // Irregular, stem changed + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"o"]; + else return [verbStem stringByAppendingString:@"io"]; + } + + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to i + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e"] withString:@"i"]; + } + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] ) { + // Verb changes stem from o to u + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o"] withString:@"u"]; + } + if ( [[self simplePresentEtoIstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to i + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e"] withString:@"i"]; + } + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"ó"]; + else if ([[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"i"]) return [verbStem stringByAppendingString:@"o"]; + else return [verbStem stringByAppendingString:@"ió"]; + } + if ( [person isEqualToString:@"FIRST_PERSON_PLURAL"]) { + // Irregular + if ( [verb isEqualToString:@"dar"]) return @"dimos"; + if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fuimos"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"amos"]; + else return [verbStem stringByAppendingString:@"imos"]; + } + if ( [person isEqualToString:@"SECOND_PERSON_PLURAL"]) { + // Irregular + if ( [verb isEqualToString:@"dar"]) return @"disteis"; + if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fuisteis"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"asteis"]; + else return [verbStem stringByAppendingString:@"isteis"]; + } + if ( [person isEqualToString:@"THIRD_PERSON_PLURAL"]) { + // Irregular + if ( [verb isEqualToString:@"dar"]) return @"dieron"; + if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fueron"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aron"]; + else if ([[verbStem substringFromIndex:[verb length] - 1] isEqualToString:@"j"]) return [verbStem stringByAppendingString:@"eron"]; + else return [verbStem stringByAppendingString:@"ieron"]; + } + + return verb; +} + + +- (NSString *) conjugateImperfectVerb:(NSString *) verb inPerson:(NSString *) person { + + NSString * verbStem = [self getStem:verb]; + NSString * verbExit = [self getExit:verb]; + + // regular + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"]) { + if ( [verb isEqualToString:@"ser"] ) return @"era"; + if ( [verb isEqualToString:@"ir"] ) return @"iba"; + if ( [verb isEqualToString:@"ver"] ) return @"veía"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aba"]; + else return [verbStem stringByAppendingString:@"ía"]; + } + if ( [person isEqualToString:@"SECOND_PERSON_SINGULAR"]) { + if ( [verb isEqualToString:@"ser"] ) return @"eras"; + if ( [verb isEqualToString:@"ir"] ) return @"ibas"; + if ( [verb isEqualToString:@"ver"] ) return @"veías"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"abas"]; + else return [verbStem stringByAppendingString:@"ías"]; + } + if ( [person isEqualToString:@"THIRD_PERSON_SINGULAR"]) { + if ( [verb isEqualToString:@"ser"] ) return @"era"; + if ( [verb isEqualToString:@"ir"] ) return @"iba"; + if ( [verb isEqualToString:@"ver"] ) return @"veía"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aba"]; + else return [verbStem stringByAppendingString:@"ía"]; + } + if ( [person isEqualToString:@"FIRST_PERSON_PLURAL"]) { + if ( [verb isEqualToString:@"ser"] ) return @"éramos"; + if ( [verb isEqualToString:@"ir"] ) return @"íbamos"; + if ( [verb isEqualToString:@"ver"] ) return @"veíamos"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"ábamos"]; + else return [verbStem stringByAppendingString:@"íamos"]; + } + if ( [person isEqualToString:@"SECOND_PERSON_PLURAL"]) { + if ( [verb isEqualToString:@"ser"] ) return @"erais"; + if ( [verb isEqualToString:@"ir"] ) return @"ibais"; + if ( [verb isEqualToString:@"ver"] ) return @"veíais"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"abais"]; + else return [verbStem stringByAppendingString:@"íais"]; + } + if ( [person isEqualToString:@"THIRD_PERSON_PLURAL"]) { + if ( [verb isEqualToString:@"ser"] ) return @"eran"; + if ( [verb isEqualToString:@"ir"] ) return @"iban"; + if ( [verb isEqualToString:@"ver"] ) return @"veían"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aban"]; + else return [verbStem stringByAppendingString:@"ían"]; + } + + return verb; + +} + +// Get stem for Future and Condicional +- (NSString *) getFutureStem:(NSString *) verb { + + // Irregular stem + if ( [verb isEqualToString:@"decir"]) return @"dir"; + if ( [verb isEqualToString:@"haber"]) return @"habr"; + if ( [verb isEqualToString:@"hacer"]) return @"har"; + if ( [verb isEqualToString:@"poder"]) return @"podr"; + if ( [verb isEqualToString:@"poner"]) return @"pondr"; + if ( [verb isEqualToString:@"querer"]) return @"querr"; + if ( [verb isEqualToString:@"saber"]) return @"sabr"; + if ( [verb isEqualToString:@"salir"]) return @"saldr"; + if ( [verb isEqualToString:@"tener"]) return @"tendr"; + if ( [verb isEqualToString:@"valer"]) return @"valdr"; + if ( [verb isEqualToString:@"venir"]) return @"vendr"; + + // Regular stem = infinitive + return verb; +} + + +- (NSString *) conjugateFutureVerb:(NSString *) verb inPerson:(NSString *) person { + + NSString * verbStem = [self getFutureStem:verb]; + + // regular + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"]) + return [verbStem stringByAppendingString:@"é"]; + + if ( [person isEqualToString:@"SECOND_PERSON_SINGULAR"]) + return [verbStem stringByAppendingString:@"ás"]; + + if ( [person isEqualToString:@"THIRD_PERSON_SINGULAR"]) + return [verbStem stringByAppendingString:@"á"]; + + if ( [person isEqualToString:@"FIRST_PERSON_PLURAL"]) + return [verbStem stringByAppendingString:@"emos"]; + + if ( [person isEqualToString:@"SECOND_PERSON_PLURAL"]) + return [verbStem stringByAppendingString:@"éis"]; + + if ( [person isEqualToString:@"THIRD_PERSON_PLURAL"]) + return [verbStem stringByAppendingString:@"án"]; + + return verb; + +} + +- (NSString *) conjugatePerfectVerb:(NSString *) verb { + NSString * verbStem = [self getStem:verb]; + NSString * verbExit = [self getExit:verb]; + + if ( [verb rangeOfString:@"abrir"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"abrir"] withString:@"abierto"]; + if ( [verb rangeOfString:@"cubrir"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"cubrir"] withString:@"cubierto"]; + if ( [verb rangeOfString:@"decir"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"decir"] withString:@"dicho"]; + if ( [verb rangeOfString:@"escribir"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"escribir"] withString:@"escrito"]; + if ( [verb rangeOfString:@"hacer"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"hacer"] withString:@"hecho"]; + if ( [verb rangeOfString:@"morir"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"morir"] withString:@"muerto"]; + if ( [verb rangeOfString:@"poner"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"poner"] withString:@"puesto"]; + if ( [verb rangeOfString:@"romper"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"romper"] withString:@"roto"]; + if ( [verb rangeOfString:@"volver"].location != NSNotFound) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"volver"] withString:@"vuelto"]; + if ( [verb isEqualToString:@"ver"]) return @"visto"; + + if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"ado"]; + else return [verbStem stringByAppendingString:@"ido"]; + + return verb; +} + +// El perfecto +- (NSString *) conjugatePresentPerfectVerb:(NSString *) verb inPerson:(NSString *) person { + + // Present of haber + Perfect tense + return [[[self conjugateSimplePresentVerb:@"haber" inPerson:person] stringByAppendingString:@" "] stringByAppendingString:[self conjugatePerfectVerb:verb]]; + +} + +// el pluscuamperfecto +- (NSString *) conjugatePastPerfectVerb:(NSString *) verb inPerson:(NSString *) person { + + // Past of haber + Perfect tense + return [[[self conjugateSimplePastVerb:@"haber" inPerson:person] stringByAppendingString:@" "] stringByAppendingString:[self conjugatePerfectVerb:verb]]; + +} + +// el futuro perfecto +- (NSString *) conjugateFuturePerfectVerb:(NSString *) verb inPerson:(NSString *) person { + + // Future of haber + Perfect tense + return [[[self conjugateFutureVerb:@"haber" inPerson:person] stringByAppendingString:@" "] stringByAppendingString:[self conjugatePerfectVerb:verb]]; + +} + +- (NSString *) conjugateVerb:(NSString *) verb inPerson:(NSString *) person andTense:(NSString *) tense { + + if ( [tense isEqualToString:@"SIMPLE_PRESENT"]) + return [self conjugateSimplePresentVerb:verb inPerson:person]; + else if ( [tense isEqualToString:@"SIMPLE_PAST"]) + return [self conjugateSimplePastVerb:verb inPerson:person]; + else if ( [tense isEqualToString:@"IMPERFECT"]) + return [self conjugateImperfectVerb:verb inPerson:person]; + else if ( [tense isEqualToString:@"FUTURE"]) + return [self conjugateFutureVerb:verb inPerson:person]; + else if ( [tense isEqualToString:@"PERFECT"]) + return [self conjugatePerfectVerb:verb]; + else if ( [tense isEqualToString:@"PRESENT_PERFECT"]) + return [self conjugatePresentPerfectVerb:verb inPerson:person]; + else if ( [tense isEqualToString:@"PAST_PERFECT"]) // Pluscuamperfecto + return [self conjugatePastPerfectVerb:verb inPerson:person]; + else if ( [tense isEqualToString:@"FUTURE_PERFECT"]) + return [self conjugateFuturePerfectVerb:verb inPerson:person]; + else + return @"Invalid tense"; + +} + + +@end diff --git a/Espagram/Tenses.h b/Espagram/Tenses.h new file mode 100644 index 0000000..1095f01 --- /dev/null +++ b/Espagram/Tenses.h @@ -0,0 +1,19 @@ +// +// Tenses.h +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import + + +@interface Tenses : NSManagedObject + +@property (nonatomic, retain) NSString * tense; +@property (nonatomic, retain) NSString * language; +@property (nonatomic, retain) NSString * translation; + +@end diff --git a/Espagram/Tenses.m b/Espagram/Tenses.m new file mode 100644 index 0000000..cb53cd0 --- /dev/null +++ b/Espagram/Tenses.m @@ -0,0 +1,18 @@ +// +// Tenses.m +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "Tenses.h" + + +@implementation Tenses + +@dynamic tense; +@dynamic language; +@dynamic translation; + +@end diff --git a/Espagram/TestBrain.h b/Espagram/TestBrain.h new file mode 100644 index 0000000..cce0b75 --- /dev/null +++ b/Espagram/TestBrain.h @@ -0,0 +1,22 @@ +// +// TestBrain.h +// Espagram +// +// Created by Abel Fokkinga on 10/20/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import "TestableConjugation.h" + +@interface TestBrain : NSObject + +@property (readonly) NSArray *testVerb; + + +- (NSArray *) testConjugation:(TestableConjugation *) conjugation; + +- (Boolean *) checkAnswer:(NSString *)answer forConjugation:(TestableConjugation *) conjugation; + + +@end diff --git a/Espagram/TestBrain.m b/Espagram/TestBrain.m new file mode 100644 index 0000000..93466f0 --- /dev/null +++ b/Espagram/TestBrain.m @@ -0,0 +1,34 @@ +// +// TestBrain.m +// Espagram +// +// Created by Abel Fokkinga on 10/20/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "TestBrain.h" + +@interface TestBrain() + +@property (nonatomic, strong) NSDictionary *testSet; + +@end + +@implementation TestBrain + +@synthesize testSet = _testSet; + + +- (NSArray *) testConjugation:(TestableConjugation *) conjugation { +return nil; +} + +- (int) checkAnswer:(NSString *)answer forConjugation:(TestableConjugation *) conjugation { + return true; +} + + + + + +@end diff --git a/Espagram/Verbs.h b/Espagram/Verbs.h new file mode 100644 index 0000000..b091c6d --- /dev/null +++ b/Espagram/Verbs.h @@ -0,0 +1,22 @@ +// +// Verbs.h +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import + +@class ConjugatedTense; + +@interface Verbs : NSManagedObject + +@property (nonatomic, retain) NSString * verb; +@property (nonatomic, retain) NSString * language; +@property (nonatomic, retain) NSString * translation; +@property (nonatomic, retain) NSString * root; +@property (nonatomic, retain) ConjugatedTense *conjugatedTenses; + +@end diff --git a/Espagram/Verbs.m b/Espagram/Verbs.m new file mode 100644 index 0000000..20399bd --- /dev/null +++ b/Espagram/Verbs.m @@ -0,0 +1,21 @@ +// +// Verbs.m +// Espagram +// +// Created by Abel Fokkinga on 8/29/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "Verbs.h" +#import "ConjugatedTense.h" + + +@implementation Verbs + +@dynamic verb; +@dynamic language; +@dynamic translation; +@dynamic root; +@dynamic conjugatedTenses; + +@end diff --git a/Espagram/en.lproj/MainStoryboard.storyboard b/Espagram/en.lproj/MainStoryboard.storyboard index 5c9da63..bedbca3 100644 --- a/Espagram/en.lproj/MainStoryboard.storyboard +++ b/Espagram/en.lproj/MainStoryboard.storyboard @@ -1,22 +1,305 @@ - + - - + - + + - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +