-
Notifications
You must be signed in to change notification settings - Fork 351
Expand file tree
/
Copy pathESJsonFormatManager.m
More file actions
338 lines (306 loc) · 13.1 KB
/
ESJsonFormatManager.m
File metadata and controls
338 lines (306 loc) · 13.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
//
// ESJsonFormatManager.m
// ESJsonFormat
//
// Created by 尹桥印 on 15/6/28.
// Copyright (c) 2015年 EnjoySR. All rights reserved.
//
#import "ESJsonFormatManager.h"
#import "ESClassInfo.h"
#import "ESFormatInfo.h"
#import "ESClassInfo.h"
#import "ESPair.h"
#import "ESJsonFormat.h"
#import "ESJsonFormatSetting.h"
#import "ESPbxprojInfo.h"
#import "ESClassInfo.h"
@interface ESJsonFormatManager()
@end
@implementation ESJsonFormatManager
+ (NSString *)parsePropertyContentWithClassInfo:(ESClassInfo *)classInfo{
NSMutableString *resultStr = [NSMutableString string];
NSDictionary *dic = classInfo.classDic;
[dic enumerateKeysAndObjectsUsingBlock:^(id key, NSObject *obj, BOOL *stop) {
if ([ESJsonFormat instance].isSwift) {
[resultStr appendFormat:@"\n%@\n",[self formatSwiftWithKey:key value:obj classInfo:classInfo]];
}else{
[resultStr appendFormat:@"\n%@\n",[self formatObjcWithKey:key value:obj classInfo:classInfo]];
}
}];
return resultStr;
}
/**
* 格式化OC属性字符串
*
* @param key JSON里面key字段
* @param value JSON里面key对应的NSDiction或者NSArray
* @param classInfo 类信息
*
* @return
*/
+ (NSString *)formatObjcWithKey:(NSString *)key value:(NSObject *)value classInfo:(ESClassInfo *)classInfo{
NSString *propertyFormat = [[ESJsonFormatSetting defaultSetting] propertyPosition] ? @"@property (%@, nonatomic) %@ *%@;" : @"@property (nonatomic, %@) %@ *%@;";
NSString *qualifierStr = @"copy";
NSString *typeStr = @"NSString";
//判断大小写
if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) {
key = [key uppercaseString];
}
if ([value isKindOfClass:[NSString class]]) {
return [NSString stringWithFormat:propertyFormat,qualifierStr,typeStr,key];
}else if([value isKindOfClass:[@(YES) class]]){
//the 'NSCFBoolean' is private subclass of 'NSNumber'
qualifierStr = @"assign";
typeStr = @"BOOL";
return [NSString stringWithFormat:propertyFormat,qualifierStr,typeStr,key];
}else if([value isKindOfClass:[NSNumber class]]){
qualifierStr = @"assign";
NSString *valueStr = [NSString stringWithFormat:@"%@",value];
if ([valueStr rangeOfString:@"."].location!=NSNotFound){
typeStr = @"CGFloat";
}else{
NSNumber *valueNumber = (NSNumber *)value;
if ([valueNumber longValue]<2147483648) {
typeStr = @"NSInteger";
}else{
typeStr = @"long long";
}
}
return [NSString stringWithFormat:propertyFormat,qualifierStr,typeStr,key];
}else if([value isKindOfClass:[NSArray class]]){
NSArray *array = (NSArray *)value;
//May be 'NSString',will crash
NSString *genericTypeStr = @"";
NSObject *firstObj = [array firstObject];
if ([firstObj isKindOfClass:[NSDictionary class]]) {
ESClassInfo *childInfo = classInfo.propertyArrayDic[key];
genericTypeStr = [NSString stringWithFormat:@"<%@ *>",childInfo.className];
}else if ([firstObj isKindOfClass:[NSString class]]){
genericTypeStr = @"<NSString *>";
}else if ([firstObj isKindOfClass:[NSNumber class]]){
genericTypeStr = @"<NSNumber *>";
}
qualifierStr = @"strong";
typeStr = @"NSArray";
if ([ESJsonFormatSetting defaultSetting].useGeneric && [ESUtils isXcode7AndLater]) {
return [NSString stringWithFormat:propertyFormat,qualifierStr,typeStr,genericTypeStr,key];
}
return [NSString stringWithFormat:propertyFormat,qualifierStr,typeStr,key];
}else if ([value isKindOfClass:[NSDictionary class]]){
qualifierStr = @"strong";
ESClassInfo *childInfo = classInfo.propertyClassDic[key];
typeStr = childInfo.className;
if (!typeStr) {
typeStr = [key capitalizedString];
}
return [NSString stringWithFormat:propertyFormat,qualifierStr,typeStr,key];
}
return [NSString stringWithFormat:propertyFormat,qualifierStr,typeStr,key];
}
/**
* 格式化Swift属性字符串
*
* @param key JSON里面key字段
* @param value JSON里面key对应的NSDiction或者NSArray
* @param classInfo 类信息
*
* @return
*/
+ (NSString *)formatSwiftWithKey:(NSString *)key value:(NSObject *)value classInfo:(ESClassInfo *)classInfo{
NSString *typeStr = @"String?";
//判断大小写
if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) {
key = [key uppercaseString];
}
if ([value isKindOfClass:[NSString class]]) {
return [NSString stringWithFormat:@" var %@: %@",key,typeStr];
}else if([value isKindOfClass:[@(YES) class]]){
typeStr = @"Bool";
return [NSString stringWithFormat:@" var %@: %@ = false",key,typeStr];
}else if([value isKindOfClass:[NSNumber class]]){
NSString *valueStr = [NSString stringWithFormat:@"%@",value];
if ([valueStr rangeOfString:@"."].location!=NSNotFound){
typeStr = @"Double?";
}else{
typeStr = @"Int?";
}
return [NSString stringWithFormat:@" var %@: %@ = 0",key,typeStr];
}else if([value isKindOfClass:[NSArray class]]){
ESClassInfo *childInfo = classInfo.propertyArrayDic[key];
NSString *type = childInfo.className;
return [NSString stringWithFormat:@" var %@: [%@]?",key,type==nil?@"String":type];
}else if ([value isKindOfClass:[NSDictionary class]]){
ESClassInfo *childInfo = classInfo.propertyClassDic[key];
typeStr = childInfo.className;
if (!typeStr) {
typeStr = [key capitalizedString];
}
return [NSString stringWithFormat:@" var %@: %@?",key,typeStr];
}
return [NSString stringWithFormat:@" var %@: %@",key,typeStr];
}
+ (NSString *)parseClassHeaderContentWithClassInfo:(ESClassInfo *)classInfo{
if ([ESJsonFormat instance].isSwift) {
return [self parseClassContentForSwiftWithClassInfo:classInfo];
}else{
return [self parseClassHeaderContentForOjbcWithClassInfo:classInfo];
}
}
+ (NSString *)parseClassImpContentWithClassInfo:(ESClassInfo *)classInfo{
if ([ESJsonFormat instance].isSwift) {
return @"";
}
NSMutableString *result = [NSMutableString stringWithString:@""];
if ([ESJsonFormatSetting defaultSetting].impOjbClassInArray) {
[result appendFormat:@"@implementation %@\n%@\n@end\n",classInfo.className,[self methodContentOfObjectClassInArrayWithClassInfo:classInfo]];
}else{
[result appendFormat:@"@implementation %@\n\n@end\n",classInfo.className];
}
if ([ESJsonFormatSetting defaultSetting].outputToFiles) {
//headerStr
NSMutableString *headerString = [NSMutableString stringWithString:[self dealHeaderStrWithClassInfo:classInfo type:@"m"]];
//import
[headerString appendString:[NSString stringWithFormat:@"#import \"%@.h\"\n",classInfo.className]];
for (NSString *key in classInfo.propertyArrayDic) {
ESClassInfo *childClassInfo = classInfo.propertyArrayDic[key];
[headerString appendString:[NSString stringWithFormat:@"#import \"%@.h\"\n",childClassInfo.className]];
}
[headerString appendString:@"\n"];
[result insertString:headerString atIndex:0];
}
return [result copy];
}
/**
* 解析.h文件内容--Objc
*
* @param classInfo 类信息
*
* @return
*/
+ (NSString *)parseClassHeaderContentForOjbcWithClassInfo:(ESClassInfo *)classInfo{
NSMutableString *result = [NSMutableString stringWithFormat:@"@interface %@ : NSObject\n",classInfo.className];
[result appendString:classInfo.propertyContent];
[result appendString:@"\n@end"];
if ([ESJsonFormatSetting defaultSetting].outputToFiles) {
//headerStr
NSMutableString *headerString = [NSMutableString stringWithString:[self dealHeaderStrWithClassInfo:classInfo type:@"h"]];
//@class
[headerString appendString:[NSString stringWithFormat:@"%@\n\n",classInfo.atClassContent]];
[result insertString:headerString atIndex:0];
}
return [result copy];
}
/**
* 解析.swift文件内容--Swift
*
* @param classInfo 类信息
*
* @return
*/
+ (NSString *)parseClassContentForSwiftWithClassInfo:(ESClassInfo *)classInfo{
NSMutableString *result = [NSMutableString stringWithFormat:@"class %@: NSObject {\n",classInfo.className];
[result appendString:classInfo.propertyContent];
[result appendString:@"\n}"];
if ([ESJsonFormatSetting defaultSetting].outputToFiles) {
[result insertString:@"import UIKit\n\n" atIndex:0];
//headerStr
NSMutableString *headerString = [NSMutableString stringWithString:[self dealHeaderStrWithClassInfo:classInfo type:@"swift"]];
[result insertString:headerString atIndex:0];
}
return [result copy];
}
/**
* 生成 MJExtension 的集合中指定对象的方法
*
* @param classInfo 指定类信息
*
* @return
*/
+ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo{
if (classInfo.propertyArrayDic.count==0) {
return @"";
}else{
NSMutableString *result = [NSMutableString string];
for (NSString *key in classInfo.propertyArrayDic) {
ESClassInfo *childClassInfo = classInfo.propertyArrayDic[key];
[result appendFormat:@"@\"%@\" : [%@ class], ",key,childClassInfo.className];
}
if ([result hasSuffix:@", "]) {
result = [NSMutableString stringWithFormat:@"%@",[result substringToIndex:result.length-2]];
}
//append method content (objectClassInArray)
NSString *methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary *)objectClassInArray{\n return @{%@};\n}\n",result];
return methodStr;
}
}
/**
* 拼装模板信息
*
* @param classInfo 类信息
* @param type .h或者.m或者.swift
*
* @return
*/
+ (NSString *)dealHeaderStrWithClassInfo:(ESClassInfo *)classInfo type:(NSString *)type{
//模板文字
NSString *templateFile = [ESJsonFormatPluginPath stringByAppendingPathComponent:@"Contents/Resources/DataModelsTemplate.txt"];
NSString *templateString = [NSString stringWithContentsOfFile:templateFile encoding:NSUTF8StringEncoding error:nil];
//替换模型名字
templateString = [templateString stringByReplacingOccurrencesOfString:@"__MODELNAME__" withString:[NSString stringWithFormat:@"%@.%@",classInfo.className,type]];
//替换用户名
templateString = [templateString stringByReplacingOccurrencesOfString:@"__NAME__" withString:NSFullUserName()];
//产品名
NSString *productName = [ESPbxprojInfo shareInstance].productName;
if (productName.length) {
templateString = [templateString stringByReplacingOccurrencesOfString:@"__PRODUCTNAME__" withString:productName];
}
//组织名
NSString *organizationName = [ESPbxprojInfo shareInstance].organizationName;
if (organizationName.length) {
templateString = [templateString stringByReplacingOccurrencesOfString:@"__ORGANIZATIONNAME__" withString:organizationName];
}
//时间
templateString = [templateString stringByReplacingOccurrencesOfString:@"__DATE__" withString:[self dateStr]];
if ([type isEqualToString:@"h"] || [type isEqualToString:@"switf"]) {
NSMutableString *string = [NSMutableString stringWithString:templateString];
if ([type isEqualToString:@"h"]) {
[string appendString:@"#import <Foundation/Foundation.h>\n\n"];
}else{
[string appendString:@"import UIKit\n\n"];
}
templateString = [string copy];
}
return [templateString copy];
}
/**
* 返回模板信息里面日期字符串
*
* @return
*/
+ (NSString *)dateStr{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yy/MM/dd";
return [formatter stringFromDate:[NSDate date]];
}
+ (void)createFileWithFolderPath:(NSString *)folderPath classInfo:(ESClassInfo *)classInfo{
if (![ESJsonFormat instance].isSwift) {
//创建.h文件
[self createFileWithFileName:[folderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.h",classInfo.className]] content:classInfo.classContentForH];
//创建.m文件
[self createFileWithFileName:[folderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.m",classInfo.className]] content:classInfo.classContentForM];
}else{
//创建.swift文件
[self createFileWithFileName:[folderPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.swift",classInfo.className]] content:classInfo.classContentForH];
}
}
/**
* 创建文件
*
* @param FileName 文件名字
* @param content 文件内容
*/
+ (void)createFileWithFileName:(NSString *)FileName content:(NSString *)content{
NSFileManager *manager = [NSFileManager defaultManager];
[manager createFileAtPath:FileName contents:[content dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
}
@end