KYSourceParseManager.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //
  2. // KYSourceParseManager.m
  3. // MidiPlayer
  4. //
  5. // Created by Kyle on 2021/12/2.
  6. //
  7. #import "KYSourceParseManager.h"
  8. #import "TBXML.h"
  9. @implementation KYSourceParseManager
  10. - (BOOL)parseMessageSource:(NSString *)measureSourcePath nodeSource:(NSString *)nodeSourcePath {
  11. NSFileManager *fileManager = [NSFileManager defaultManager];
  12. BOOL measureFileExist = [fileManager fileExistsAtPath:measureSourcePath];
  13. BOOL nodeFileExist = [fileManager fileExistsAtPath:nodeSourcePath];
  14. if (measureFileExist == NO || nodeFileExist == NO) {
  15. NSLog(@"文件不存在");
  16. return NO;
  17. }
  18. TBXMLElement *element;
  19. NSError *error;
  20. NSData *measureData = [NSData dataWithContentsOfFile:measureSourcePath];
  21. TBXML *tbxml = [[TBXML alloc] initWithXMLData:measureData error:&error];
  22. if (error) {
  23. NSLog(@"%@", error.description);
  24. return NO;
  25. }
  26. element = [tbxml rootXMLElement];
  27. if (element == nil) {
  28. NSLog(@"Fail to parse xml file. error=%@", error);
  29. return NO;
  30. }
  31. NSString *name = [TBXML elementName:element];
  32. if ([name isEqualToString:@"score"]) {
  33. self.measureMessageArray = [self parseScoreWithSource:element];
  34. }
  35. NSData *nodeData = [NSData dataWithContentsOfFile:nodeSourcePath];
  36. TBXML *nodeTbxml = [[TBXML alloc] initWithXMLData:nodeData error:&error];
  37. if (error) {
  38. NSLog(@"%@", error.description);
  39. return NO;
  40. }
  41. TBXMLElement *nodeElement = [nodeTbxml rootXMLElement];
  42. if (nodeElement == nil) {
  43. NSLog(@"Fail to parse xml file. error=%@", error);
  44. return NO;
  45. }
  46. NSString *nodeName = [TBXML elementName:nodeElement];
  47. if ([nodeName isEqualToString:@"score"]) {
  48. self.nodeMessageArray = [self parseScoreWithSource:nodeElement];
  49. }
  50. return YES;
  51. }
  52. - (NSMutableArray *)parseScoreWithSource:(TBXMLElement *)element {
  53. NSMutableArray *sourceArray = [NSMutableArray array];
  54. NSMutableArray *positionArray = [NSMutableArray array];
  55. NSMutableArray *timeArray = [NSMutableArray array];
  56. TBXMLElement *temp_elem = element->firstChild;
  57. do {
  58. NSString *name = [TBXML elementName:temp_elem];
  59. if ([name isEqualToString:@"elements"]) { // 位置信息
  60. positionArray = [self getDetailSourceWithElement:temp_elem];
  61. }
  62. else if ([name isEqualToString:@"events"]) { // 时间信息
  63. timeArray = [self getDetailSourceWithElement:temp_elem];
  64. }
  65. temp_elem = temp_elem->nextSibling;
  66. if (temp_elem == nil) {
  67. break;
  68. }
  69. } while (YES);
  70. // 赋值
  71. if (positionArray.count != timeArray.count) {
  72. return nil;
  73. }
  74. for (NSInteger i = 0; i < positionArray.count; i++) {
  75. KSParseMessageModel *model = [[KSParseMessageModel alloc] init];
  76. NSDictionary *positionDic = [positionArray objectAtIndex:i];
  77. model.elementIndex = [[positionDic valueForKey:@"id"] integerValue];
  78. model.positionX = [[positionDic valueForKey:@"x"] doubleValue];
  79. model.positionY = [[positionDic valueForKey:@"y"] doubleValue];
  80. double width = [[positionDic valueForKey:@"sx"] doubleValue];
  81. if (width == 0) {
  82. width = 700.0f;
  83. }
  84. model.elementWidth = width;
  85. model.elementHeight = [[positionDic valueForKey:@"sy"] doubleValue];
  86. model.pageIndex = [[positionDic valueForKey:@"page"] integerValue];
  87. NSDictionary *timeDic = [timeArray objectAtIndex:i];
  88. model.elementTimePosition = [[timeDic valueForKey:@"position"] integerValue];
  89. [sourceArray addObject:model];
  90. }
  91. return sourceArray;
  92. }
  93. - (NSMutableArray *)getDetailSourceWithElement:(TBXMLElement *)elements {
  94. NSMutableArray *messageArray = [NSMutableArray array];
  95. TBXMLElement *sub_elem = elements->firstChild;
  96. NSString *name = [TBXML elementName:sub_elem];
  97. BOOL isElement = [name isEqualToString:@"element"];
  98. do {
  99. NSMutableDictionary *valueDic = [NSMutableDictionary dictionary];
  100. if (isElement) {
  101. NSString *elemId = [TBXML valueOfAttributeNamed:@"id" forElement:sub_elem];
  102. [valueDic setValue:elemId forKey:@"id"];
  103. double positionX = [[TBXML valueOfAttributeNamed:@"x" forElement:sub_elem] doubleValue];
  104. [valueDic setValue:@(positionX) forKey:@"x"];
  105. double positionY = [[TBXML valueOfAttributeNamed:@"y" forElement:sub_elem] doubleValue];
  106. [valueDic setValue:@(positionY) forKey:@"y"];
  107. double width = [[TBXML valueOfAttributeNamed:@"sx" forElement:sub_elem] doubleValue];
  108. [valueDic setValue:@(width) forKey:@"sx"];
  109. double height = [[TBXML valueOfAttributeNamed:@"sy" forElement:sub_elem] doubleValue];
  110. [valueDic setValue:@(height) forKey:@"sy"];
  111. NSInteger pageIndex = [[TBXML valueOfAttributeNamed:@"page" forElement:sub_elem] doubleValue];
  112. [valueDic setValue:@(pageIndex) forKey:@"page"];
  113. }
  114. else {
  115. NSInteger position = [[TBXML valueOfAttributeNamed:@"position" forElement:sub_elem] integerValue];
  116. [valueDic setValue:@(position) forKey:@"position"];
  117. }
  118. [messageArray addObject:valueDic];
  119. sub_elem = sub_elem->nextSibling;
  120. if (sub_elem == nil) {
  121. break;
  122. }
  123. } while (YES);
  124. return messageArray;
  125. }
  126. @end