123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- //
- // KYSourceParseManager.m
- // MidiPlayer
- //
- // Created by Kyle on 2021/12/2.
- //
- #import "KYSourceParseManager.h"
- #import "TBXML.h"
- @implementation KYSourceParseManager
- - (BOOL)parseMessageSource:(NSString *)measureSourcePath nodeSource:(NSString *)nodeSourcePath {
- NSFileManager *fileManager = [NSFileManager defaultManager];
- BOOL measureFileExist = [fileManager fileExistsAtPath:measureSourcePath];
- BOOL nodeFileExist = [fileManager fileExistsAtPath:nodeSourcePath];
- if (measureFileExist == NO || nodeFileExist == NO) {
- NSLog(@"文件不存在");
- return NO;
- }
- TBXMLElement *element;
- NSError *error;
- NSData *measureData = [NSData dataWithContentsOfFile:measureSourcePath];
- TBXML *tbxml = [[TBXML alloc] initWithXMLData:measureData error:&error];
- if (error) {
- NSLog(@"%@", error.description);
- return NO;
- }
- element = [tbxml rootXMLElement];
- if (element == nil) {
- NSLog(@"Fail to parse xml file. error=%@", error);
- return NO;
- }
- NSString *name = [TBXML elementName:element];
-
- if ([name isEqualToString:@"score"]) {
- self.measureMessageArray = [self parseScoreWithSource:element];
- }
-
- NSData *nodeData = [NSData dataWithContentsOfFile:nodeSourcePath];
- TBXML *nodeTbxml = [[TBXML alloc] initWithXMLData:nodeData error:&error];
- if (error) {
- NSLog(@"%@", error.description);
- return NO;
- }
- TBXMLElement *nodeElement = [nodeTbxml rootXMLElement];
- if (nodeElement == nil) {
- NSLog(@"Fail to parse xml file. error=%@", error);
- return NO;
- }
- NSString *nodeName = [TBXML elementName:nodeElement];
- if ([nodeName isEqualToString:@"score"]) {
- self.nodeMessageArray = [self parseScoreWithSource:nodeElement];
- }
- return YES;
- }
- - (NSMutableArray *)parseScoreWithSource:(TBXMLElement *)element {
- NSMutableArray *sourceArray = [NSMutableArray array];
- NSMutableArray *positionArray = [NSMutableArray array];
- NSMutableArray *timeArray = [NSMutableArray array];
- TBXMLElement *temp_elem = element->firstChild;
- do {
- NSString *name = [TBXML elementName:temp_elem];
- if ([name isEqualToString:@"elements"]) { // 位置信息
- positionArray = [self getDetailSourceWithElement:temp_elem];
- }
- else if ([name isEqualToString:@"events"]) { // 时间信息
- timeArray = [self getDetailSourceWithElement:temp_elem];
- }
-
- temp_elem = temp_elem->nextSibling;
- if (temp_elem == nil) {
- break;
- }
- } while (YES);
-
- // 赋值
- if (positionArray.count != timeArray.count) {
- return nil;
- }
- for (NSInteger i = 0; i < positionArray.count; i++) {
- KSParseMessageModel *model = [[KSParseMessageModel alloc] init];
- NSDictionary *positionDic = [positionArray objectAtIndex:i];
- model.elementIndex = [[positionDic valueForKey:@"id"] integerValue];
- model.positionX = [[positionDic valueForKey:@"x"] doubleValue];
- model.positionY = [[positionDic valueForKey:@"y"] doubleValue];
- double width = [[positionDic valueForKey:@"sx"] doubleValue];
- if (width == 0) {
- width = 700.0f;
- }
- model.elementWidth = width;
- model.elementHeight = [[positionDic valueForKey:@"sy"] doubleValue];
- model.pageIndex = [[positionDic valueForKey:@"page"] integerValue];
- NSDictionary *timeDic = [timeArray objectAtIndex:i];
- model.elementTimePosition = [[timeDic valueForKey:@"position"] integerValue];
- [sourceArray addObject:model];
- }
- return sourceArray;
- }
- - (NSMutableArray *)getDetailSourceWithElement:(TBXMLElement *)elements {
- NSMutableArray *messageArray = [NSMutableArray array];
- TBXMLElement *sub_elem = elements->firstChild;
- NSString *name = [TBXML elementName:sub_elem];
- BOOL isElement = [name isEqualToString:@"element"];
-
- do {
-
- NSMutableDictionary *valueDic = [NSMutableDictionary dictionary];
- if (isElement) {
- NSString *elemId = [TBXML valueOfAttributeNamed:@"id" forElement:sub_elem];
- [valueDic setValue:elemId forKey:@"id"];
-
- double positionX = [[TBXML valueOfAttributeNamed:@"x" forElement:sub_elem] doubleValue];
- [valueDic setValue:@(positionX) forKey:@"x"];
- double positionY = [[TBXML valueOfAttributeNamed:@"y" forElement:sub_elem] doubleValue];
- [valueDic setValue:@(positionY) forKey:@"y"];
-
- double width = [[TBXML valueOfAttributeNamed:@"sx" forElement:sub_elem] doubleValue];
- [valueDic setValue:@(width) forKey:@"sx"];
- double height = [[TBXML valueOfAttributeNamed:@"sy" forElement:sub_elem] doubleValue];
- [valueDic setValue:@(height) forKey:@"sy"];
-
- NSInteger pageIndex = [[TBXML valueOfAttributeNamed:@"page" forElement:sub_elem] doubleValue];
- [valueDic setValue:@(pageIndex) forKey:@"page"];
- }
- else {
- NSInteger position = [[TBXML valueOfAttributeNamed:@"position" forElement:sub_elem] integerValue];
- [valueDic setValue:@(position) forKey:@"position"];
- }
- [messageArray addObject:valueDic];
-
- sub_elem = sub_elem->nextSibling;
- if (sub_elem == nil) {
- break;
- }
- } while (YES);
-
- return messageArray;
- }
- @end
|