diff --git a/Default Espagram database.sqlite/StoreContent/persistentStore b/Default Espagram database.sqlite/StoreContent/persistentStore new file mode 100644 index 0000000..3d8f3b3 Binary files /dev/null and b/Default Espagram database.sqlite/StoreContent/persistentStore differ diff --git a/Espagram.xcodeproj/project.pbxproj b/Espagram.xcodeproj/project.pbxproj index 70002f2..05873ef 100644 --- a/Espagram.xcodeproj/project.pbxproj +++ b/Espagram.xcodeproj/project.pbxproj @@ -25,9 +25,10 @@ B51F8E4416519D440033B614 /* iPhoneIcon_Small.png in Resources */ = {isa = PBXBuildFile; fileRef = B51F8E4316519D440033B614 /* iPhoneIcon_Small.png */; }; B51F8E4616519D490033B614 /* iPhoneIcon_Big.png in Resources */ = {isa = PBXBuildFile; fileRef = B51F8E4516519D490033B614 /* iPhoneIcon_Big.png */; }; B51F8E4816519FE00033B614 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B51F8E4716519FE00033B614 /* CoreData.framework */; }; + B545DFFC167A5F2800DFBF11 /* Default Espagram database.sqlite in Resources */ = {isa = PBXBuildFile; fileRef = B545DFFB167A5F2800DFBF11 /* Default Espagram database.sqlite */; }; + B545DFFF167BA00300DFBF11 /* espagram57.png in Resources */ = {isa = PBXBuildFile; fileRef = B545DFFE167BA00300DFBF11 /* espagram57.png */; }; + B545E001167BA01700DFBF11 /* espagram117.png in Resources */ = {isa = PBXBuildFile; fileRef = B545E000167BA01700DFBF11 /* espagram117.png */; }; B54CFB611652D2A700C0823D /* Lesson+Create.m in Sources */ = {isa = PBXBuildFile; fileRef = B51F8E3C16519D090033B614 /* Lesson+Create.m */; }; - B54CFB6A1652D43900C0823D /* Verb.m in Sources */ = {isa = PBXBuildFile; fileRef = B54CFB691652D43900C0823D /* Verb.m */; }; - B54CFB6D1652D43900C0823D /* Lesson.m in Sources */ = {isa = PBXBuildFile; fileRef = B54CFB6C1652D43900C0823D /* Lesson.m */; }; B54CFB761652E03600C0823D /* EspagramNewLessonViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B54CFB751652E03600C0823D /* EspagramNewLessonViewController.m */; }; B56DE15C165412DF00D85DD3 /* EspagramWordsInLessonViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B56DE15B165412DF00D85DD3 /* EspagramWordsInLessonViewController.m */; }; B56DE160165426B800D85DD3 /* EspagramAddWordToLessonViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B56DE15F165426B800D85DD3 /* EspagramAddWordToLessonViewController.m */; }; @@ -36,10 +37,24 @@ B56DE1691655774E00D85DD3 /* Lesson+Test.m in Sources */ = {isa = PBXBuildFile; fileRef = B56DE1681655774D00D85DD3 /* Lesson+Test.m */; }; B5A8BB191651A64300C1CC00 /* CoreDataTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A8BB181651A3E700C1CC00 /* CoreDataTableViewController.m */; }; B5B3F92D165972EF00E26A40 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B5B3F92F165972EF00E26A40 /* Localizable.strings */; }; + B5B3F93516602C7C00E26A40 /* Verb.m in Sources */ = {isa = PBXBuildFile; fileRef = B5B3F93416602C7B00E26A40 /* Verb.m */; }; + B5B3F93816602C7D00E26A40 /* TestResult.m in Sources */ = {isa = PBXBuildFile; fileRef = B5B3F93716602C7C00E26A40 /* TestResult.m */; }; + B5B3F93B16602C7E00E26A40 /* Lesson.m in Sources */ = {isa = PBXBuildFile; fileRef = B5B3F93A16602C7E00E26A40 /* Lesson.m */; }; B5EC6CED1656F1960030C27F /* Verb+Create.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EC6CEC1656F1960030C27F /* Verb+Create.m */; }; B5EFD392162CB18000C6E2EB /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B5EFD391162CB18000C6E2EB /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ +/* Begin PBXBuildRule section */ + B545DFFD167A87BE00DFBF11 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.proxy.script; + fileType = pattern.proxy; + isEditable = 1; + outputFiles = ( + ); + }; +/* End PBXBuildRule section */ + /* Begin PBXFileReference section */ B506EC5E15EBF67500566A27 /* Espagram.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Espagram.app; sourceTree = BUILT_PRODUCTS_DIR; }; B506EC6215EBF67500566A27 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; @@ -71,10 +86,9 @@ B51F8E4316519D440033B614 /* iPhoneIcon_Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iPhoneIcon_Small.png; sourceTree = ""; }; B51F8E4516519D490033B614 /* iPhoneIcon_Big.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iPhoneIcon_Big.png; sourceTree = ""; }; B51F8E4716519FE00033B614 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; - B54CFB681652D43900C0823D /* Verb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Verb.h; sourceTree = ""; }; - B54CFB691652D43900C0823D /* Verb.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Verb.m; sourceTree = ""; }; - B54CFB6B1652D43900C0823D /* Lesson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lesson.h; sourceTree = ""; }; - B54CFB6C1652D43900C0823D /* Lesson.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Lesson.m; sourceTree = ""; }; + B545DFFB167A5F2800DFBF11 /* Default Espagram database.sqlite */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "Default Espagram database.sqlite"; sourceTree = ""; }; + B545DFFE167BA00300DFBF11 /* espagram57.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = espagram57.png; sourceTree = ""; }; + B545E000167BA01700DFBF11 /* espagram117.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = espagram117.png; sourceTree = ""; }; B54CFB741652E03600C0823D /* EspagramNewLessonViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramNewLessonViewController.h; sourceTree = ""; }; B54CFB751652E03600C0823D /* EspagramNewLessonViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EspagramNewLessonViewController.m; sourceTree = ""; }; B56DE15A165412DF00D85DD3 /* EspagramWordsInLessonViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EspagramWordsInLessonViewController.h; sourceTree = ""; }; @@ -96,6 +110,12 @@ B5B3F930165972F600E26A40 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; B5B3F931165AC79200E26A40 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; B5B3F932165AD45400E26A40 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; }; + B5B3F93316602C7B00E26A40 /* Verb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Verb.h; sourceTree = ""; }; + B5B3F93416602C7B00E26A40 /* Verb.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Verb.m; sourceTree = ""; }; + B5B3F93616602C7C00E26A40 /* TestResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestResult.h; sourceTree = ""; }; + B5B3F93716602C7C00E26A40 /* TestResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestResult.m; sourceTree = ""; }; + B5B3F93916602C7E00E26A40 /* Lesson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lesson.h; sourceTree = ""; }; + B5B3F93A16602C7E00E26A40 /* Lesson.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Lesson.m; sourceTree = ""; }; B5EC6CEB1656F1960030C27F /* Verb+Create.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Verb+Create.h"; sourceTree = ""; }; B5EC6CEC1656F1960030C27F /* Verb+Create.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Verb+Create.m"; sourceTree = ""; }; B5EFD391162CB18000C6E2EB /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; @@ -119,6 +139,9 @@ B506EC5315EBF67500566A27 = { isa = PBXGroup; children = ( + B545E000167BA01700DFBF11 /* espagram117.png */, + B545DFFE167BA00300DFBF11 /* espagram57.png */, + B545DFFB167A5F2800DFBF11 /* Default Espagram database.sqlite */, B51F8E4716519FE00033B614 /* CoreData.framework */, B51F8E4516519D490033B614 /* iPhoneIcon_Big.png */, B51F8E4316519D440033B614 /* iPhoneIcon_Small.png */, @@ -182,11 +205,13 @@ B506EC6915EBF67500566A27 /* Supporting Files */, B51F8E1F164FF8930033B614 /* Tense.h */, B51F8E20164FF8930033B614 /* Tense.m */, + B5B3F93316602C7B00E26A40 /* Verb.h */, + B5B3F93916602C7E00E26A40 /* Lesson.h */, + B5B3F93A16602C7E00E26A40 /* Lesson.m */, + B5B3F93616602C7C00E26A40 /* TestResult.h */, + B5B3F93716602C7C00E26A40 /* TestResult.m */, + B5B3F93416602C7B00E26A40 /* Verb.m */, B51F8E22165199F80033B614 /* Espagram.xcdatamodeld */, - B54CFB681652D43900C0823D /* Verb.h */, - B54CFB691652D43900C0823D /* Verb.m */, - B54CFB6B1652D43900C0823D /* Lesson.h */, - B54CFB6C1652D43900C0823D /* Lesson.m */, B56DE1611654382500D85DD3 /* Lesson+Conjugator.h */, B56DE1621654382500D85DD3 /* Lesson+Conjugator.m */, B56DE1671655774D00D85DD3 /* Lesson+Test.h */, @@ -221,6 +246,7 @@ B506EC5C15EBF67500566A27 /* Resources */, ); buildRules = ( + B545DFFD167A87BE00DFBF11 /* PBXBuildRule */, ); dependencies = ( ); @@ -270,6 +296,9 @@ B51F8E4416519D440033B614 /* iPhoneIcon_Small.png in Resources */, B51F8E4616519D490033B614 /* iPhoneIcon_Big.png in Resources */, B5B3F92D165972EF00E26A40 /* Localizable.strings in Resources */, + B545DFFC167A5F2800DFBF11 /* Default Espagram database.sqlite in Resources */, + B545DFFF167BA00300DFBF11 /* espagram57.png in Resources */, + B545E001167BA01700DFBF11 /* espagram117.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -292,8 +321,6 @@ B51F8E3916519C850033B614 /* EspagramLessonViewController.m in Sources */, B5A8BB191651A64300C1CC00 /* CoreDataTableViewController.m in Sources */, B54CFB611652D2A700C0823D /* Lesson+Create.m in Sources */, - B54CFB6A1652D43900C0823D /* Verb.m in Sources */, - B54CFB6D1652D43900C0823D /* Lesson.m in Sources */, B54CFB761652E03600C0823D /* EspagramNewLessonViewController.m in Sources */, B56DE15C165412DF00D85DD3 /* EspagramWordsInLessonViewController.m in Sources */, B56DE160165426B800D85DD3 /* EspagramAddWordToLessonViewController.m in Sources */, @@ -301,6 +328,9 @@ B56DE1661655769300D85DD3 /* TestableVerb.m in Sources */, B56DE1691655774E00D85DD3 /* Lesson+Test.m in Sources */, B5EC6CED1656F1960030C27F /* Verb+Create.m in Sources */, + B5B3F93516602C7C00E26A40 /* Verb.m in Sources */, + B5B3F93816602C7D00E26A40 /* TestResult.m in Sources */, + B5B3F93B16602C7E00E26A40 /* Lesson.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -389,11 +419,15 @@ B506EC7D15EBF67500566A27 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Abel Fokkinga (P764G4C7BB)"; 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)"; + PROVISIONING_PROFILE = ""; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "D1DA148D-74FB-4B18-82EB-1E4B06A36830"; TARGETED_DEVICE_FAMILY = 1; WRAPPER_EXTENSION = app; }; @@ -402,11 +436,13 @@ B506EC7E15EBF67500566A27 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Distribution: Abel Fokkinga"; 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)"; + PROVISIONING_PROFILE = "B9D6A7A6-94DA-4D3D-AD3E-2204789BC56E"; TARGETED_DEVICE_FAMILY = 1; WRAPPER_EXTENSION = app; }; diff --git a/Espagram/Espagram-Info.plist b/Espagram/Espagram-Info.plist index df6d18c..35546c5 100644 --- a/Espagram/Espagram-Info.plist +++ b/Espagram/Espagram-Info.plist @@ -16,8 +16,8 @@ CFBundleIconFiles - iPhoneIcon_Small.png - iPhoneIcon_Big.png + espagram57.png + espagram117.png @@ -28,6 +28,9 @@ CFBundleLocalizations en + Dutch + Spanish + Portugese CFBundleName ${PRODUCT_NAME} @@ -38,7 +41,7 @@ CFBundleSignature ???? CFBundleVersion - 1.0 + 1.0.1 LSApplicationCategoryType LSRequiresIPhoneOS @@ -51,6 +54,16 @@ armv7 + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/Espagram/Espagram.xcdatamodeld/Espagram.xcdatamodel/contents b/Espagram/Espagram.xcdatamodeld/Espagram.xcdatamodel/contents index 5a27510..a7d9050 100644 --- a/Espagram/Espagram.xcdatamodeld/Espagram.xcdatamodel/contents +++ b/Espagram/Espagram.xcdatamodeld/Espagram.xcdatamodel/contents @@ -8,13 +8,22 @@ + + + + + + + + - - + + + \ No newline at end of file diff --git a/Espagram/EspagramLessonViewController.m b/Espagram/EspagramLessonViewController.m index f80dfd0..d9c765c 100644 --- a/Espagram/EspagramLessonViewController.m +++ b/Espagram/EspagramLessonViewController.m @@ -65,10 +65,11 @@ request.sortDescriptors = [[NSArray alloc] initWithObjects:[[NSSortDescriptor alloc] initWithKey:@"title" ascending:TRUE], nil]; self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.lessonsDatabase.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; + } - (void) createDocument -{ +{ [self.lessonsDatabase saveToURL:self.lessonsDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL succes){ NSLog(@"Created lessons database"); }]; @@ -79,6 +80,7 @@ - (void) useDocument { if (![[NSFileManager defaultManager] fileExistsAtPath:[self.lessonsDatabase.fileURL path]]) { + NSLog(@"No database exists"); [self createDocument]; [self fetchedResultsController]; } else if (self.lessonsDatabase.documentState == UIDocumentStateClosed){ @@ -89,7 +91,6 @@ } else if (self.lessonsDatabase.documentState == UIDocumentStateNormal) { [self setupFetchedResultsController]; } - } @@ -108,6 +109,28 @@ self.title = NSLocalizedString(@"Lessons title",@"Lessons title"); if (!self.lessonsDatabase) { // We'll create a default database if none is set + + NSFileManager * fileManager = [NSFileManager defaultManager]; + NSURL *storeURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDirectory] lastObject] URLByAppendingPathComponent: @"Default Espagram database"]; + + NSLog(@"DB url: %@", storeURL.path); + + if (![fileManager fileExistsAtPath:storeURL.path]) { + NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Default Espagram database" ofType:@"sqlite"]; + + //NSString *defaultStorePath = [[[NSBundle mainBundle] resourcePath] + // stringByAppendingPathComponent:@"Default Espagram database"]; + + + if ( [fileManager fileExistsAtPath:defaultStorePath]) { + NSLog(@"Default DB present in app"); + + NSError *error; + [fileManager copyItemAtPath:defaultStorePath toPath:storeURL.path error:&error]; + NSLog(@"%@",error.debugDescription ); + } + } + NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDirectory] lastObject]; url = [url URLByAppendingPathComponent:@"Default Espagram database"]; @@ -131,7 +154,6 @@ }]; } - - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Lesson cell"; @@ -140,7 +162,21 @@ Lesson *lesson = [self.fetchedResultsController objectAtIndexPath:indexPath]; NSLog(@"Showing lesson: %@", lesson.title); cell.textLabel.text = lesson.title; - cell.detailTextLabel.text = lesson.subTitle; + + NSString * lessonDescription = lesson.subTitle; + if (lessonDescription.length == 0 && [lesson.verbs count] > 0 ) { + for ( Verb * v in lesson.verbs) { + if (lessonDescription.length == 0) { + lessonDescription = v.verb; + } else { + lessonDescription = [[lessonDescription stringByAppendingString:@", "] stringByAppendingString:v.verb]; + if ( lessonDescription.length > 50) + break; + } + } + } + + cell.detailTextLabel.text = lessonDescription; return cell; } diff --git a/Espagram/EspagramMainTableViewController.m b/Espagram/EspagramMainTableViewController.m index e0d3e55..f375c7a 100644 --- a/Espagram/EspagramMainTableViewController.m +++ b/Espagram/EspagramMainTableViewController.m @@ -14,6 +14,7 @@ @interface EspagramMainTableViewController () @property (nonatomic, strong) NSString *language, *displayTitle; @property (nonatomic, strong) Tense * tense; +@property (nonatomic, strong) UIManagedDocument * lessonsDatabase; @end @implementation EspagramMainTableViewController @@ -22,6 +23,7 @@ @synthesize tense = _tense; @synthesize displayTitle = _displayTitle; @synthesize aboutButton = _aboutButton; +@synthesize lessonsDatabase = _lessonsDatabase; - (id)initWithStyle:(UITableViewStyle)style { @@ -32,13 +34,6 @@ return self; } -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - [self.aboutButton setTitle:NSLocalizedString(@"About button", @"About button text")]; -} - # pragma mark - Espagram setters and getters @@ -69,54 +64,92 @@ if ( [segue.identifier isEqualToString:@"Show Lessons"]) { [segue.destinationViewController setConjugator:[self getLanguage]]; [segue.destinationViewController setTense:self.tense]; - + [segue.destinationViewController setLessonsDatabase:self.lessonsDatabase]; } } -#pragma mark - Table view data source - - -/* -// Override to support conditional editing of the table view. -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath +- (void) createDocument { - // Return NO if you do not want the specified item to be editable. - return YES; + [self.lessonsDatabase saveToURL:self.lessonsDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL succes){ + NSLog(@"Created lessons database"); + }]; + } -*/ -/* -// Override to support editing the table view. -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath +- (void) useDocument { - if (editingStyle == UITableViewCellEditingStyleDelete) { - // Delete the row from the data source - [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; - } - else if (editingStyle == UITableViewCellEditingStyleInsert) { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view - } + if (![[NSFileManager defaultManager] fileExistsAtPath:[self.lessonsDatabase.fileURL path]]) { + NSLog(@"No database exists"); + [self createDocument]; + } else if (self.lessonsDatabase.documentState == UIDocumentStateClosed){ + [self.lessonsDatabase openWithCompletionHandler:^(BOOL succes){ + NSLog(@"Opened lessons database"); + + }]; + } } -*/ -/* -// Override to support rearranging the table view. -- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath -{ + +- (void) setLessonsDatabase:(UIManagedDocument *)lessonsDatabase{ + if ( _lessonsDatabase != lessonsDatabase ) { + _lessonsDatabase = lessonsDatabase; + [self useDocument]; + } + } -*/ -/* -// Override to support conditional rearranging of the table view. -- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath -{ - // Return NO if you do not want the item to be re-orderable. - return YES; +- (void)viewWillAppear:(BOOL)animated{ + + [super viewWillAppear:animated]; + + [self.aboutButton setTitle:NSLocalizedString(@"About button", @"About button text")]; + + if (!self.lessonsDatabase) { // We'll create a default database if none is set + + NSFileManager * fileManager = [NSFileManager defaultManager]; + NSURL *storeURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDirectory] lastObject] URLByAppendingPathComponent: @"Default Espagram database"]; + + NSLog(@"DB url: %@", storeURL.path); + + if (![fileManager fileExistsAtPath:storeURL.path]) { + NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Default Espagram database" ofType:@"sqlite"]; + + //NSString *defaultStorePath = [[[NSBundle mainBundle] resourcePath] + // stringByAppendingPathComponent:@"Default Espagram database"]; + + + if ( [fileManager fileExistsAtPath:defaultStorePath]) { + NSLog(@"Default DB present in app"); + + NSError *error; + [fileManager copyItemAtPath:defaultStorePath toPath:storeURL.path error:&error]; + NSLog(@"%@",error.debugDescription ); + } + } + + NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDirectory] lastObject]; + url = [url URLByAppendingPathComponent:@"Default Espagram database"]; + + UIManagedDocument *doc = [[UIManagedDocument alloc] initWithFileURL:url]; + NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, + [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; + doc.persistentStoreOptions = options; + self.lessonsDatabase = doc; + } + } -*/ -#pragma mark - Table view delegate +- (void)viewDidUnload { + + [super viewDidUnload]; + + [self.lessonsDatabase closeWithCompletionHandler:^(BOOL success) { + NSLog(@"Database closed"); + }]; +} + - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { diff --git a/Espagram/EspagramTestViewController.m b/Espagram/EspagramTestViewController.m index 0c2b62b..f6b4d27 100644 --- a/Espagram/EspagramTestViewController.m +++ b/Espagram/EspagramTestViewController.m @@ -177,9 +177,9 @@ } -- (void)viewDidAppear:(BOOL)animated +- (void)viewWillAppear:(BOOL)animated { - [super viewDidAppear:animated]; + [super viewWillAppear:animated]; self.nextButton.titleLabel.text = NSLocalizedString(@"Next", @"Next button in the testing screen to continue to the next verb"); diff --git a/Espagram/EspagramWordsInLessonViewController.m b/Espagram/EspagramWordsInLessonViewController.m index 791a489..492e5e3 100644 --- a/Espagram/EspagramWordsInLessonViewController.m +++ b/Espagram/EspagramWordsInLessonViewController.m @@ -50,6 +50,18 @@ managedObjectContext:self.lesson.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; + + // Use for copying verbs from other tense + // if ( [self.lesson.verbs count] == 0){ + // Lesson * copyLesson = [self getLessonWithName:self.lesson.title andTense:@"PRESENT_PERFECT" withConjugator:self.lesson.conjugator inContext:[self.lesson managedObjectContext]]; + + // if ( copyLesson && [copyLesson.verbs count] > 0){ + // for (Verb * v in copyLesson.verbs) { + // [Verb addVerb:v.verb andMeaning:v.meaning toLesson:self.lesson]; + // } + // [[self.lesson managedObjectContext] save:nil]; + // } + // } } @@ -60,7 +72,25 @@ [self setupFetchedResultsController]; } +- (Lesson *) getLessonWithName:(NSString *)title andTense:(NSString *)tense withConjugator:(NSString *)conjugator inContext:(NSManagedObjectContext *)context +{ + Lesson * les = nil; + NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Lesson"]; + + + // Where clause + request.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:[NSPredicate predicateWithFormat:@"title = %@", title],[NSPredicate predicateWithFormat:@"tense = %@", tense], [NSPredicate predicateWithFormat:@"conjugator = %@", conjugator],nil]]; + + NSError *error = nil; + NSArray *lessons = [context executeFetchRequest:request error:&error]; + + if ( lessons && lessons.count > 0 ){ + return [lessons lastObject]; + } + + return les; +} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath diff --git a/Espagram/Lesson.h b/Espagram/Lesson.h index 21bc105..be9f452 100644 --- a/Espagram/Lesson.h +++ b/Espagram/Lesson.h @@ -2,7 +2,7 @@ // Lesson.h // Espagram // -// Created by Abel Fokkinga on 11/13/12. +// Created by Abel Fokkinga on 11/23/12. // Copyright (c) 2012 Abel Fokkinga. All rights reserved. // @@ -13,11 +13,11 @@ @interface Lesson : NSManagedObject +@property (nonatomic, retain) NSString * conjugator; @property (nonatomic, retain) NSDate * dateAdded; @property (nonatomic, retain) NSString * subTitle; @property (nonatomic, retain) NSString * tense; @property (nonatomic, retain) NSString * title; -@property (nonatomic, retain) NSString * conjugator; @property (nonatomic, retain) NSSet *verbs; @end diff --git a/Espagram/Lesson.m b/Espagram/Lesson.m index 1257698..0b08daf 100644 --- a/Espagram/Lesson.m +++ b/Espagram/Lesson.m @@ -2,7 +2,7 @@ // Lesson.m // Espagram // -// Created by Abel Fokkinga on 11/13/12. +// Created by Abel Fokkinga on 11/23/12. // Copyright (c) 2012 Abel Fokkinga. All rights reserved. // @@ -12,11 +12,11 @@ @implementation Lesson +@dynamic conjugator; @dynamic dateAdded; @dynamic subTitle; @dynamic tense; @dynamic title; -@dynamic conjugator; @dynamic verbs; @end diff --git a/Espagram/SpanishConjugator.m b/Espagram/SpanishConjugator.m index 5ef171b..066889d 100644 --- a/Espagram/SpanishConjugator.m +++ b/Espagram/SpanishConjugator.m @@ -13,7 +13,9 @@ @property (nonatomic, strong) NSArray *simplePresentEtoIEstemChangersArray, *simplePresentOtoUEstemChangersArray, - *simplePresentEtoIstemChangersArray; + *simplePresentEtoIstemChangersArray, + *simplePresentIARtoAccentedIArray, + *simplePresentUARtoAccentedUArray; @property (nonatomic,strong) NSDictionary *persons; @property (nonatomic,strong) NSDictionary *reflexivePersons; @@ -27,6 +29,8 @@ @synthesize simplePresentEtoIEstemChangersArray = _simplePresentEtoIEstemChangersArray; @synthesize simplePresentOtoUEstemChangersArray = _simplePresentOtoUEstemChangersArray; @synthesize simplePresentEtoIstemChangersArray = _simplePresentEtoIstemChangersArray; +@synthesize simplePresentIARtoAccentedIArray = _simplePresentIARtoAccentedIArray; +@synthesize simplePresentUARtoAccentedUArray = _simplePresentUARtoAccentedUArray; @synthesize persons = _persons; @synthesize reflexivePersons = _reflexivePersons; @@ -61,34 +65,104 @@ - (NSArray *) simplePresentEtoIEstemChangersArray{ if (_simplePresentEtoIEstemChangersArray == nil) _simplePresentEtoIEstemChangersArray = [[NSArray alloc] initWithObjects: + @"abstener", @"acertar", + @"adherir", + @"adquirir", @"advertir", - @"adtrevesar", + @"apretar", + @"arrepentir", + @"ascender", + @"asentir", + @"atender", + @"atravesar", @"calentar", @"cerrar", + @"circunvenir", @"comenzar", + @"conferir", @"confesar", @"consentir", + @"consentir", + @"convenir", @"convertir", @"defender", + @"descender", + @"desmembrar", + @"desmentir", @"despertar", + @"desplegar", + @"detener", + @"diferir", + @"digerir", + @"discernir", + @"disentir", @"divertir", @"empezar", @"encender", + @"encerrar", + @"encomendar", + @"enmendar", + @"ensangrentar", @"entender", - @"gobernar", + @"enterrar", + @"entretener", + @"entrevenir", + @"extender", @"fregar", + @"gobernar", + @"heder", + @"helar", @"herir", @"hervir", + @"inferir", + @"ingerir", + @"intervenir", + @"invernar", + @"invertir", + @"malherir", + @"manifestar", + @"mantener", + @"mentar", @"mentir", @"merendar", @"negar", + @"nevar", + @"obtener", + @"ofender", @"pensar", @"perder", + @"pervertir", @"preferir", + @"presentir", + @"prevenir", @"querer", + @"regar", + @"remendar", + @"renegar", + @"replegar", + @"requerir", + @"restregar", + @"retener", + @"reventar", + @"segar", + @"sembrar", + @"sentar", @"sentir", + @"serrar", + @"sosegar", + @"sostener", + @"soterrar", + @"sugerir", + @"subarrendar", + @"tender", + @"temblar", + @"tener", + @"tentar", + @"transferir", @"tropezar", + @"venir", + @"verter", nil]; return _simplePresentEtoIEstemChangersArray; @@ -97,33 +171,77 @@ - (NSArray *) simplePresentOtoUEstemChangersArray{ if (_simplePresentOtoUEstemChangersArray == nil) _simplePresentOtoUEstemChangersArray = [[NSArray alloc] initWithObjects: + @"absolvar", @"acordar", @"acostar", @"almorzar", + @"alongar", + @"amoblar", @"apostar", @"aprobar", + @"asolar", + @"avergonzar", + @"cocer", + @"colar", @"colgar", + @"concordar", + @"conmover", + @"consolar", @"contar", @"costar", + @"degollar", + @"demoler", + @"demostrar", + @"desaprobar", + @"descolgar", + @"descontar", + @"desosar", + @"destorcer", @"devolver", + @"disolver", + @"doler", @"dormir", @"encontrar", + @"engrosar", @"envolver", + @"forzar", + @"holgar", + @"hollar", @"llover", + @"moler", @"morder", @"morir", @"mostrar", @"mover", @"oler", + @"poblar", @"poder", @"probar", + @"promover", @"recordar", + @"reforzar", + @"remorder", + @"remover", + @"repoblar", @"resolver", + @"resollar", + @"resonar", + @"retorcer", + @"revolcar", + @"revolver", + @"rodar", @"rogar", + @"solar", + @"soldar", + @"soler", + @"soltar", @"sonar", @"soñar", + @"torcer", @"tostar", + @"tronar", @"volar", + @"volcar", @"volver", @"oler" ,nil]; @@ -134,31 +252,130 @@ - (NSArray *) simplePresentEtoIstemChangersArray{ if (_simplePresentEtoIstemChangersArray == nil) _simplePresentEtoIstemChangersArray = [[NSArray alloc] initWithObjects: + @"ceñir", + @"comedir", @"colegir", @"competir", + @"concebir", @"conseguir", + @"contradecir", @"corregir", + @"decir", @"derretir", @"despedir", + @"desteñir", + @"desvestir", @"elegir", + @"embestir", + @"engreir", + @"estreñir", + @"expedir", @"freír", @"gemir", @"impedir", + @"investir", + @"maldecir", @"medir", @"pedir", @"perseguir", - @"repetir", + @"proseguir", + @"predecir", + @"reelegir", + @"reexpedir", + @"regir", @"reír", + @"rendir", + @"reñir", + @"repetir", + @"revestir", @"seguir", @"servir", @"sonreír", - @"repetir", + @"subseguir", + @"teñir", + @"trasgredir", @"vestir" - ,nil]; // not including elegir here as it also has an g to j change in first person singular + ,nil]; return _simplePresentEtoIstemChangersArray; } +- (NSArray *) simplePresentIARtoAccentedIArray{ + if (_simplePresentIARtoAccentedIArray == nil) + _simplePresentIARtoAccentedIArray = [[NSArray alloc] initWithObjects: + @"agraviar", + @"agriar", + @"aliar", + @"amnistiar", + @"amplifiar", + @"arriar", + @"cariar", + @"confiar", + @"contrariar", + @"criar", + @"chirriar", + @"desafiar", + @"descarriar", + @"desconfiar", + @"desviar", + @"enfriar", + @"enviar", + @"espiar", + @"esquiar", + @"expatriar", + @"fiar", + @"fotografiar", + @"guiar", + @"historiar", + @"inventariar", + @"liar", + @"obviar", + @"paliar", + @"piar", + @"porfiar", + @"repatriar", + @"resfriar", + @"rociar", + @"telegrafiar", + @"vaciar", + @"variar", + @"zurriar", + nil]; + + return _simplePresentIARtoAccentedIArray; +} + +- (NSArray *) simplePresentUARtoAccentedUArray{ + if (_simplePresentUARtoAccentedUArray == nil) + _simplePresentUARtoAccentedUArray = [[NSArray alloc] initWithObjects: + @"acentuar", // to emphasize, accentuate + @"actuar", // to act + @"atenuar", // to attenuate + @"conceptuar", // to deem + @"continuar", // to continue + @"desvirtuar", // to spoil + @"efectuar", // to carry out, effect + @"evaluar", // to assess, evaluate + @"exeptuar", // to except + @"extenuar", // to emaciate + @"fluctuar", // to fluctuate + @"graduar", // to grade + @"habituar", // to habituate + @"individuar", // to individualize + @"infatuar", // to infatuate + @"insinuar", // to hint, insinuate + @"menstruar", // to menstruate + @"perpetuar", // to perpetuate + @"preceptuar", // to establish, lay down + @"puntuar", // to punctuate, to assess + @"redituar", // to yield (a profit) + @"situar", // to situate + @"tatuar", // to tattoo + @"valuar", // to value + nil]; + + return _simplePresentUARtoAccentedUArray; +} - (NSString *) getExit:(NSString *) verb { @@ -222,7 +439,7 @@ // conducir, conocer etc. if ( verb.length > 3 && ([[verb substringFromIndex:[verb length] - 3] isEqualToString:@"cer"] || [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"cir"]) ) - return [[verbStem substringToIndex:[verbStem length] - 1] stringByAppendingString:@"zc"]; + verbStem = [[verbStem substringToIndex:[verbStem length] - 1] stringByAppendingString:@"zc"]; // other if ( [verb isEqualToString:@"ver"] ) return @"ve"; @@ -232,11 +449,11 @@ // g -> j if ( verb.length > 3 && [[verb substringFromIndex:[verb length] - 3] isEqualToString:@"gir"] ) - return [[verb substringToIndex:[verb length] - 3] stringByAppendingString:@"j"]; + verbStem = [[verb substringToIndex:[verb length] - 3] stringByAppendingString:@"j"]; // gu -> g if ( verb.length > 4 && [[verb substringFromIndex:[verb length] - 4] isEqualToString:@"guir"] ) - return [[verb substringToIndex:[verb length] - 4] stringByAppendingString:@"g"]; + verbStem = [[verb substringToIndex:[verb length] - 4] stringByAppendingString:@"g"]; @@ -255,15 +472,17 @@ 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í"; + // uar to í + if ( [[self simplePresentUARtoAccentedUArray] containsObject:verb] ){ + verbStem = [[verb substringToIndex:verb.length - 3] stringByAppendingString:@"ú"]; + } + + + // iar to í + if ( [[self simplePresentIARtoAccentedIArray] containsObject:verb] ){ + verbStem = [[verb substringToIndex:verb.length - 3] stringByAppendingString:@"í"]; + } } @@ -276,7 +495,6 @@ // Regular - NSLog(@"getSimplePresentStemVerb start.regular"); if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"] || [person isEqualToString:@"SECOND_PERSON_SINGULAR"] || [person isEqualToString:@"THIRD_PERSON_SINGULAR"] || @@ -288,7 +506,10 @@ } if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] ) { // Verb changes stem from o to ue - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"ue"]; + if ( [verbStem rangeOfString:@"gon"].location != NSNotFound ) + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"gon" options:NSBackwardsSearch] withString:@"güen"]; + else + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"ue"]; } if ( [[self simplePresentEtoIstemChangersArray] containsObject:verb] ) { // Verb changes stem from e to i @@ -307,14 +528,12 @@ 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]; @@ -373,6 +592,7 @@ if ( [verb isEqualToString:@"ser"] ) return @"sois"; if ( [verb isEqualToString:@"ir"] ) return @"vais"; if ( [verb isEqualToString:@"haber"] ) return @"habéis"; + if ( [verb isEqualToString:@"dar"] ) return @"dais"; if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"áis"]; if ( [@"er" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"éis"]; @@ -403,6 +623,9 @@ NSString * simplePresentYoStem = [simplePresentYo substringToIndex:simplePresentYo.length -1]; + NSLog(@"person %@", person); + + if ( [person isEqualToString:@"FIRST_PERSON_SINGULAR"] || [person isEqualToString:@"THIRD_PERSON_SINGULAR"] ) { @@ -428,20 +651,29 @@ return [[simplePresentYoStem substringToIndex:simplePresentYoStem.length - 1] stringByAppendingString:@"a"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"car"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"que"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"que"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"gue"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"gue"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"zar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"ce"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"z" options:NSBackwardsSearch] withString:@"ce"]; if ( verb.length > 4 && - [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"ga"]; + [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"g"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"ga"]; + } else { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"ga"]; + } + } if ( verb.length > 3 && - [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"ja"]; - + [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"j"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"j" options:NSBackwardsSearch] withString:@"ja"]; + } else { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"ja"]; + } + } if ( [verbStem isEqualToString:simplePresentYoStem]) { if ( [verbExit isEqualToString:@"ar"] ) @@ -452,7 +684,7 @@ // 3. If the stem of the yo form shows a stem change when compared to the stem of the infinitive, // and it's an -ar or -er verb,the stem will undergo the same changes as the present indicative - if ( ![verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ar"] || [verbExit isEqualToString:@"er"] ) { if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] || [[self simplePresentOtoUEstemChangersArray] containsObject:verb] || @@ -470,7 +702,7 @@ // 4. if the stem of the yo form when compared to infinitie shows it's an -ir stem changing verb, all // forms of the present subjunctive will have stem changes - if ( [verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ir"] || [verbExit isEqualToString:@"ír"] ) { if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] || [[self simplePresentOtoUEstemChangersArray] containsObject:verb] || @@ -512,22 +744,30 @@ return [[simplePresentYoStem substringToIndex:simplePresentYoStem.length - 1] stringByAppendingString:@"as"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"car"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"ques"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"ques"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"gues"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"gues"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"zar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"ces"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"z" options:NSBackwardsSearch] withString:@"ces"]; if ( verb.length > 4 && - [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"gas"]; + [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"g"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"gas"]; + } else { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"gas"]; + } + } if ( verb.length > 3 && - [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"jas"]; - - - if ( [verbStem isEqualToString:simplePresentYoStem]) { + [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"j"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"j" options:NSBackwardsSearch] withString:@"jas"]; + } else { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"jas"]; + } + } + if ( [verbStem isEqualToString:simplePresentYoStem] ) { if ( [verbExit isEqualToString:@"ar"] ) return [verbStem stringByAppendingString:@"es"]; else @@ -536,7 +776,7 @@ // 3. If the stem of the yo form shows a stem change when compared to the stem of the infinitive, // and it's an -ar or -er verb,the stem will undergo the same changes as the present indicative - if ( ![verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ar"] || [verbExit isEqualToString:@"er"] ) { if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] || [[self simplePresentOtoUEstemChangersArray] containsObject:verb] || @@ -554,7 +794,7 @@ // 4. if the stem of the yo form when compared to infinitie shows it's an -ir stem changing verb, all // forms of the present subjunctive will have stem changes and special changes in nosotros and vosotros - if ( [verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ir"] || [verbExit isEqualToString:@"ír"] ) { if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] || [[self simplePresentOtoUEstemChangersArray] containsObject:verb] || @@ -573,6 +813,17 @@ } else if ( [person isEqualToString:@"FIRST_PERSON_PLURAL"]) { + // Remove any accented characters, if any from stem + if ( [verbStem rangeOfString:@"í"].location != NSNotFound ) { + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"í"] withString:@"i"]; + } + if ( [verbStem rangeOfString:@"é"].location != NSNotFound ) { + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"é"] withString:@"e"]; + } + if ( [simplePresentYoStem rangeOfString:@"ú"].location != NSNotFound ) { + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"ú"] withString:@"u"]; + } + // 1. If the first person singular does not end in an -o, the verb is irregular in the present subjunctive if ( [verb isEqualToString:@"ser"]) return @"seamos"; @@ -597,53 +848,95 @@ return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"quemos"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"guemos"]; + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"guemos"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"zar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"cemos"]; + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"z" options:NSBackwardsSearch] withString:@"cemos"]; if ( verb.length > 4 && - [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"gamos"]; + [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"g"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"gamos"]; + } else { + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"gamos"]; + } + } if ( verb.length > 3 && - [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"jamos"]; + [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"j"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"j" options:NSBackwardsSearch] withString:@"jamos"]; + } else { + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"jamos"]; + } + } - - - if ( [verbStem isEqualToString:simplePresentYoStem]) { + if ( [verbStem isEqualToString:simplePresentYoStem] || + [self.simplePresentUARtoAccentedUArray containsObject:verb] || + [self.simplePresentIARtoAccentedIArray containsObject:verb] ) { if ( [verbExit isEqualToString:@"ar"] ) return [verbStem stringByAppendingString:@"emos"]; else return [verbStem stringByAppendingString:@"amos"]; } - + + + // 3. If the stem of the yo form shows a stem change when compared to the stem of the infinitive, // and it's an -ar or -er verb,the stem will undergo the same changes as the present indicative - if ( ![verbExit isEqualToString:@"ir"] ) { - - if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] || - [[self simplePresentOtoUEstemChangersArray] containsObject:verb] || - [[self simplePresentEtoIstemChangersArray] containsObject:verb] || - [verb isEqualToString:@"jugar"] ) { - + if ( [verbExit isEqualToString:@"ar"] || [verbExit isEqualToString:@"er"] ) { + if ( [verb isEqualToString:@"jugar"] ) return @"jueguemos"; - if ( [verbExit isEqualToString:@"ar"] ) - return [verbStem stringByAppendingString:@"emos"]; - else - return [verbStem stringByAppendingString:@"amos"]; - } + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"ie"] isEqualToString:simplePresentYoStem] ) { + + if ( [verbExit isEqualToString:@"ar"] ) + return [verbStem stringByAppendingString:@"emos"]; + else + return [verbStem stringByAppendingString:@"amos"]; + } + + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"ue"] isEqualToString:simplePresentYoStem] ) { + + if ( [verbExit isEqualToString:@"ar"] ) + return [verbStem stringByAppendingString:@"emos"]; + else + return [verbStem stringByAppendingString:@"amos"]; + } + + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"] isEqualToString:simplePresentYoStem] ) { + + if ( [verbExit isEqualToString:@"ar"] ) + return [verbStem stringByAppendingString:@"emos"]; + else + return [verbStem stringByAppendingString:@"amos"]; + } + } + // 4. if the stem of the yo form when compared to infinitie shows it's an -ir stem changing verb, all // forms of the present subjunctive will have stem changes and special changes in nosotros and vosotros - if ( [verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ir"] || [verbExit isEqualToString:@"ír"] ) { + + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"ie"] isEqualToString:simplePresentYoStem] ) { - if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] ) return [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"] stringByAppendingString:@"amos"]; + } - if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] ) - return [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"u"] stringByAppendingString:@"amos"]; + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"ue"] isEqualToString:simplePresentYoStem] ) { + + return [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"u"] stringByAppendingString:@"amos"]; + } + + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"] isEqualToString:simplePresentYoStem] ) { + + return [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"] stringByAppendingString:@"amos"]; + } } // 5. Changing stem in yo form and not a stem changing verb,: use this stem for all forms of @@ -654,6 +947,16 @@ return [simplePresentYoStem stringByAppendingString:@"amos"]; } else if ( [person isEqualToString:@"SECOND_PERSON_PLURAL"]) { + // Remove any accented characters, if any from stem + if ( [verbStem rangeOfString:@"í"].location != NSNotFound ) { + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"í"] withString:@"i"]; + } + if ( [verbStem rangeOfString:@"é"].location != NSNotFound ) { + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"é"] withString:@"e"]; + } + if ( [simplePresentYoStem rangeOfString:@"ú"].location != NSNotFound ) { + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"ú"] withString:@"u"]; + } // 1. If the first person singular does not end in an -o, the verb is irregular in the present subjunctive if ( [verb isEqualToString:@"ser"]) @@ -679,20 +982,31 @@ return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"quéis"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"guéis"]; + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"guéis"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"zar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"céis"]; + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"z" options:NSBackwardsSearch] withString:@"céis"]; if ( verb.length > 4 && - [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"gáis"]; + [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"g"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"gáis"]; + } else { + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"gáis"]; + } + } if ( verb.length > 3 && - [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"jáis"]; + [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"j"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"j" options:NSBackwardsSearch] withString:@"jáis"]; + } else { + return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"jáis"]; + } + } - - if ( [verbStem isEqualToString:simplePresentYoStem]) { + if ( [verbStem isEqualToString:simplePresentYoStem] || + [self.simplePresentUARtoAccentedUArray containsObject:verb] || + [self.simplePresentIARtoAccentedIArray containsObject:verb] ) { if ( [verbExit isEqualToString:@"ar"] ) return [verbStem stringByAppendingString:@"éis"]; else @@ -701,31 +1015,62 @@ // 3. If the stem of the yo form shows a stem change when compared to the stem of the infinitive, // and it's an -ar or -er verb,the stem will undergo the same changes as the present indicative - if ( ![verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ar"] || [verbExit isEqualToString:@"er"] ) { - if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] || - [[self simplePresentOtoUEstemChangersArray] containsObject:verb] || - // NOT [[self simplePresentEtoIstemChangersArray] containsObject:verb] || - [verb isEqualToString:@"jugar"] ) { - - if ( [verb isEqualToString:@"jugar"] ) return @"jueguéis"; + if ( [verb isEqualToString:@"jugar"] ) return @"jueguemos"; + + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"ie"] isEqualToString:simplePresentYoStem] ) { if ( [verbExit isEqualToString:@"ar"] ) return [verbStem stringByAppendingString:@"éis"]; else return [verbStem stringByAppendingString:@"áis"]; } + + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"ue"] isEqualToString:simplePresentYoStem] ) { + + if ( [verbExit isEqualToString:@"ar"] ) + return [verbStem stringByAppendingString:@"éis"]; + else + return [verbStem stringByAppendingString:@"áis"]; + } + + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"] isEqualToString:simplePresentYoStem] ) { + + if ( [verbExit isEqualToString:@"ar"] ) + return [verbStem stringByAppendingString:@"éis"]; + else + return [verbStem stringByAppendingString:@"áis"]; + } + } + // 4. if the stem of the yo form when compared to infinitie shows it's an -ir stem changing verb, all // forms of the present subjunctive will have stem changes and special changes in nosotros and vosotros - if ( [verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ir"] || [verbExit isEqualToString:@"ír"] ) { - if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] ) + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"ie"] isEqualToString:simplePresentYoStem] ) { + return [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"] stringByAppendingString:@"áis"]; + } - if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] ) + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"ue"] isEqualToString:simplePresentYoStem] ) { + return [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"u"] stringByAppendingString:@"áis"]; + } + + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && + [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"] isEqualToString:simplePresentYoStem] ) { + + return [[verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"] stringByAppendingString:@"áis"]; + } + } // 5. Changing stem in yo form and not a stem changing verb,: use this stem for all forms of @@ -758,22 +1103,30 @@ return [[simplePresentYoStem substringToIndex:simplePresentYoStem.length - 1] stringByAppendingString:@"an"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"car"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"quen"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"quen"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"guen"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"guen"]; if ( verb.length > 3 && [[verb substringFromIndex:verb.length - 3] isEqualToString:@"zar"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"c" options:NSBackwardsSearch] withString:@"cen"]; + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"z" options:NSBackwardsSearch] withString:@"cen"]; if ( verb.length > 4 && - [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"gan"]; + [[verb substringFromIndex:verb.length - 4] isEqualToString:@"guir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"g"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"gan"]; + } else { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"gu" options:NSBackwardsSearch] withString:@"gan"]; + } + } if ( verb.length > 3 && - [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) - return [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"jan"]; - - - + [[verb substringFromIndex:verb.length - 3] isEqualToString:@"gir"] ) { + if ([[simplePresentYoStem substringFromIndex:simplePresentYoStem.length -1] isEqualToString:@"j"] ) { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"j" options:NSBackwardsSearch] withString:@"jan"]; + } else { + return [simplePresentYoStem stringByReplacingCharactersInRange:[simplePresentYoStem rangeOfString:@"g" options:NSBackwardsSearch] withString:@"jan"]; + } + } + if ( [verbStem isEqualToString:simplePresentYoStem]) { if ( [verbExit isEqualToString:@"ar"] ) return [verbStem stringByAppendingString:@"en"]; @@ -783,7 +1136,7 @@ // 3. If the stem of the yo form shows a stem change when compared to the stem of the infinitive, // and it's an -ar or -er verb,the stem will undergo the same changes as the present indicative - if ( ![verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ar"] || [verbExit isEqualToString:@"er"] ) { if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] || [[self simplePresentOtoUEstemChangersArray] containsObject:verb] || @@ -801,7 +1154,7 @@ // 4. if the stem of the yo form when compared to infinitie shows it's an -ir stem changing verb, all // forms of the present subjunctive will have stem changes - if ( [verbExit isEqualToString:@"ir"] ) { + if ( [verbExit isEqualToString:@"ir"] || [verbExit isEqualToString:@"ír"] ) { if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] || [[self simplePresentOtoUEstemChangersArray] containsObject:verb] || @@ -881,8 +1234,15 @@ if ( [verbStem isEqualToString:[self getStem:verb]]) { // Regular - if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aste"]; - else return [verbStem stringByAppendingString:@"iste"]; + if ( [@"ar" isEqualToString:verbExit] ) { + return [verbStem stringByAppendingString:@"aste"]; + } else if ( [[verbStem substringFromIndex:verbStem.length-1] isEqualToString:@"e"] ) { + return [verbStem stringByAppendingString:@"íste"]; + } else if ( [[verbStem substringFromIndex:verbStem.length-1] isEqualToString:@"o"] ) { + return [verbStem stringByAppendingString:@"íste"]; + } else { + return [verbStem stringByAppendingString:@"iste"]; + } } else { // Irregular return [verbStem stringByAppendingString:@"iste"]; @@ -894,34 +1254,48 @@ if ( [verb isEqualToString:@"dar"]) return @"dio"; if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fue"; - if ( verb.length > 1 && - ([[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"e"] || - [[verbStem substringFromIndex:[verbStem 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 ( ![verbStem isEqualToString:[self getStem:verb]]) { // Irregular, stem changed - return [verbStem stringByAppendingString:@"o"]; + if ( verbStem.length > 1 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"i"]) return [verbStem stringByAppendingString:@"ó"]; + else + return [verbStem stringByAppendingString:@"o"]; } - if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] ) { - // Verb changes stem from e to i - verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"]; + if ( verb.length > 3 && + ![[verb substringFromIndex:verb.length-3] isEqualToString:@"car"] && + ![[verb substringFromIndex:verb.length-3] isEqualToString:@"gar"] && + ![[verb substringFromIndex:verb.length-3] isEqualToString:@"zar"] + ) { + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] && [verbStem rangeOfString:@"e"].location != NSNotFound) { + // Verb changes stem from e to i + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"]; + } + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] && [verbStem rangeOfString:@"o"].location != NSNotFound) { + // Verb changes stem from o to u + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"u"]; + } + if ( [[self simplePresentEtoIstemChangersArray] containsObject:verb] && [verbStem rangeOfString:@"e"].location != NSNotFound) { + // Verb changes stem from e to i + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"]; + } } - if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] ) { - // Verb changes stem from o to u - verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"u"]; - } - if ( [[self simplePresentEtoIstemChangersArray] containsObject:verb] ) { - // Verb changes stem from e to i - verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"]; + + + if ( verb.length > 0 && + [verbStem isEqualToString:[self getStem:verb]] && // No stem change + ([[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"e"] || + [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"u"] || + [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"o"]) + ) { + // 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ó"]; } + // Regular if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"ó"]; - else if ( verbStem.length > 1 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"i"]) return [verbStem stringByAppendingString:@"yo"]; + else if ( verbStem.length > 1 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"i"]) return [verbStem stringByAppendingString:@"ó"]; else if ( verbStem.length > 1 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"e"]) return [verbStem stringByAppendingString:@"yo"]; else return [verbStem stringByAppendingString:@"ió"]; } @@ -932,8 +1306,15 @@ if ( [verbStem isEqualToString:[self getStem:verb]]) { // Regular - if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"amos"]; - else return [verbStem stringByAppendingString:@"imos"]; + if ( [@"ar" isEqualToString:verbExit] ) { + return [verbStem stringByAppendingString:@"amos"]; + } else if ( [[verbStem substringFromIndex:verbStem.length-1] isEqualToString:@"e"] ) { + return [verbStem stringByAppendingString:@"ímos"]; + } else if ( [[verbStem substringFromIndex:verbStem.length-1] isEqualToString:@"o"] ) { + return [verbStem stringByAppendingString:@"ímos"]; + } else { + return [verbStem stringByAppendingString:@"imos"]; + } } else { // Irregular return [verbStem stringByAppendingString:@"imos"]; @@ -946,8 +1327,16 @@ if ( [verbStem isEqualToString:[self getStem:verb]]) { // Regular - if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"asteis"]; - else return [verbStem stringByAppendingString:@"isteis"]; + if ( [@"ar" isEqualToString:verbExit] ) { + return [verbStem stringByAppendingString:@"asteis"]; + } else if ( [[verbStem substringFromIndex:verbStem.length-1] isEqualToString:@"e"] ) { + return [verbStem stringByAppendingString:@"ísteis"]; + } else if ( [[verbStem substringFromIndex:verbStem.length-1] isEqualToString:@"o"] ) { + return [verbStem stringByAppendingString:@"ísteis"]; + + } else { + return [verbStem stringByAppendingString:@"isteis"]; + } } else { // Irregular return [verbStem stringByAppendingString:@"isteis"]; @@ -958,15 +1347,39 @@ if ( [verb isEqualToString:@"dar"]) return @"dieron"; if ( [verb isEqualToString:@"ir"] || [verb isEqualToString:@"ser"] ) return @"fueron"; + if ( [verbStem isEqualToString:[self getStem:verb]] && + verb.length > 3 && + ![[verb substringFromIndex:verb.length-3] isEqualToString:@"car"] && + ![[verb substringFromIndex:verb.length-3] isEqualToString:@"gar"] && + ![[verb substringFromIndex:verb.length-3] isEqualToString:@"zar"] + ) { + if ( [[self simplePresentEtoIEstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to i + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"]; + } + if ( [[self simplePresentOtoUEstemChangersArray] containsObject:verb] ) { + // Verb changes stem from o to u + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"o" options:NSBackwardsSearch] withString:@"u"]; + } + if ( [[self simplePresentEtoIstemChangersArray] containsObject:verb] ) { + // Verb changes stem from e to i + verbStem = [verbStem stringByReplacingCharactersInRange:[verbStem rangeOfString:@"e" options:NSBackwardsSearch] withString:@"i"]; + } + } + + if ( [verbStem isEqualToString:[self getStem:verb]]) { // Regular if ( [@"ar" isEqualToString:verbExit] ) return [verbStem stringByAppendingString:@"aron"]; - else if ( verbStem.length > 1 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"j"]) return [verbStem stringByAppendingString:@"eron"]; - else if ( verbStem.length > 1 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"i"]) return [verbStem stringByAppendingString:@"yeron"]; - else if ( verbStem.length > 1 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"e"]) return [verbStem stringByAppendingString:@"yeron"]; + else if ( verbStem.length > 0 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"j"]) return [verbStem stringByAppendingString:@"eron"]; + else if ( verbStem.length > 0 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"i"]) return [verbStem stringByAppendingString:@"yeron"]; + else if ( verbStem.length > 0 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"e"]) return [verbStem stringByAppendingString:@"yeron"]; + else if ( verbStem.length > 0 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"u"]) return [verbStem stringByAppendingString:@"yeron"]; + else if ( verbStem.length > 0 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"o"]) return [verbStem stringByAppendingString:@"yeron"]; else return [verbStem stringByAppendingString:@"ieron"]; } else { if ( verbStem.length > 1 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"j"]) return [verbStem stringByAppendingString:@"eron"]; + else if ( verbStem.length > 0 && [[verbStem substringFromIndex:[verbStem length] - 1] isEqualToString:@"i"]) return [verbStem stringByAppendingString:@"eron"]; else return [verbStem stringByAppendingString:@"ieron"]; } } diff --git a/Espagram/TestResult.h b/Espagram/TestResult.h new file mode 100644 index 0000000..db50a7f --- /dev/null +++ b/Espagram/TestResult.h @@ -0,0 +1,22 @@ +// +// TestResult.h +// Espagram +// +// Created by Abel Fokkinga on 11/23/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import +#import + +@class Verb; + +@interface TestResult : NSManagedObject + +@property (nonatomic, retain) NSString * conjugatedPerson; +@property (nonatomic, retain) NSNumber * failedCounter; +@property (nonatomic, retain) NSNumber * passedCounter; +@property (nonatomic, retain) NSString * testType; +@property (nonatomic, retain) Verb *verb; + +@end diff --git a/Espagram/TestResult.m b/Espagram/TestResult.m new file mode 100644 index 0000000..82052ef --- /dev/null +++ b/Espagram/TestResult.m @@ -0,0 +1,21 @@ +// +// TestResult.m +// Espagram +// +// Created by Abel Fokkinga on 11/23/12. +// Copyright (c) 2012 Abel Fokkinga. All rights reserved. +// + +#import "TestResult.h" +#import "Verb.h" + + +@implementation TestResult + +@dynamic conjugatedPerson; +@dynamic failedCounter; +@dynamic passedCounter; +@dynamic testType; +@dynamic verb; + +@end diff --git a/Espagram/Verb+Create.m b/Espagram/Verb+Create.m index ac8aeb8..806914a 100644 --- a/Espagram/Verb+Create.m +++ b/Espagram/Verb+Create.m @@ -15,6 +15,8 @@ { Verb * verb = [NSEntityDescription insertNewObjectForEntityForName:@"Verb" inManagedObjectContext:[lesson managedObjectContext]]; + newVerb = [newVerb lowercaseString]; + // Check first if the lessons already contains this verb for ( Verb * v in lesson.verbs) { if ( [newVerb isEqualToString:v.verb]) { diff --git a/Espagram/Verb.h b/Espagram/Verb.h index 70c207d..23edd6a 100644 --- a/Espagram/Verb.h +++ b/Espagram/Verb.h @@ -2,7 +2,7 @@ // Verb.h // Espagram // -// Created by Abel Fokkinga on 11/13/12. +// Created by Abel Fokkinga on 11/23/12. // Copyright (c) 2012 Abel Fokkinga. All rights reserved. // @@ -16,5 +16,14 @@ @property (nonatomic, retain) NSString * meaning; @property (nonatomic, retain) NSString * verb; @property (nonatomic, retain) Lesson *lesson; +@property (nonatomic, retain) NSSet *testResults; +@end + +@interface Verb (CoreDataGeneratedAccessors) + +- (void)addTestResultsObject:(NSManagedObject *)value; +- (void)removeTestResultsObject:(NSManagedObject *)value; +- (void)addTestResults:(NSSet *)values; +- (void)removeTestResults:(NSSet *)values; @end diff --git a/Espagram/Verb.m b/Espagram/Verb.m index e5e3cae..cac25f1 100644 --- a/Espagram/Verb.m +++ b/Espagram/Verb.m @@ -2,7 +2,7 @@ // Verb.m // Espagram // -// Created by Abel Fokkinga on 11/13/12. +// Created by Abel Fokkinga on 11/23/12. // Copyright (c) 2012 Abel Fokkinga. All rights reserved. // @@ -15,5 +15,6 @@ @dynamic meaning; @dynamic verb; @dynamic lesson; +@dynamic testResults; @end diff --git a/Espagram/en.lproj/MainStoryboard.storyboard b/Espagram/en.lproj/MainStoryboard.storyboard index ca4ec0a..d599eca 100644 --- a/Espagram/en.lproj/MainStoryboard.storyboard +++ b/Espagram/en.lproj/MainStoryboard.storyboard @@ -171,7 +171,7 @@ + + + @@ -458,14 +457,14 @@ - + @@ -475,7 +474,7 @@ - + @@ -485,15 +484,15 @@