diff --git a/Default-568h@2x.png b/Default-568h@2x.png new file mode 100644 index 0000000..0891b7a Binary files /dev/null and b/Default-568h@2x.png differ 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 0000000..5829115 Binary files /dev/null and b/Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/WorkspaceSettings.xcsettings b/Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..659c876 --- /dev/null +++ b/Espagram.xcodeproj/project.xcworkspace/xcuserdata/abel.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + 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 @@ - + - - + - + + - - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +