From 366dd2fc0abaae48c5a4cb2da9d1ecd5dc36f65a Mon Sep 17 00:00:00 2001 From: Abel Fokkinga Date: Thu, 20 Dec 2012 18:09:11 +0100 Subject: [PATCH] Version 1.0 --- .../StoreContent/persistentStore | Bin 0 -> 61440 bytes Espagram.xcodeproj/project.pbxproj | 60 +- Espagram/Espagram-Info.plist | 19 +- .../Espagram.xcdatamodel/contents | 13 +- Espagram/EspagramLessonViewController.m | 44 +- Espagram/EspagramMainTableViewController.m | 115 +-- Espagram/EspagramTestViewController.m | 4 +- .../EspagramWordsInLessonViewController.m | 30 + Espagram/Lesson.h | 4 +- Espagram/Lesson.m | 4 +- Espagram/SpanishConjugator.m | 665 ++++++++++++++---- Espagram/TestResult.h | 22 + Espagram/TestResult.m | 21 + Espagram/Verb+Create.m | 2 + Espagram/Verb.h | 11 +- Espagram/Verb.m | 3 +- Espagram/en.lproj/MainStoryboard.storyboard | 177 +++-- espagram117.png | Bin 0 -> 26246 bytes espagram57.png | Bin 0 -> 9946 bytes 19 files changed, 946 insertions(+), 248 deletions(-) create mode 100644 Default Espagram database.sqlite/StoreContent/persistentStore create mode 100644 Espagram/TestResult.h create mode 100644 Espagram/TestResult.m create mode 100644 espagram117.png create mode 100644 espagram57.png diff --git a/Default Espagram database.sqlite/StoreContent/persistentStore b/Default Espagram database.sqlite/StoreContent/persistentStore new file mode 100644 index 0000000000000000000000000000000000000000..3d8f3b34a12b110f5726edbb9701b1972bad0051 GIT binary patch literal 61440 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 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 @@