From daae523c81dca51e12ae1f9c0a64ee0ffd2615ff Mon Sep 17 00:00:00 2001 From: tanpengsccd Date: Thu, 16 Feb 2017 00:22:57 +0800 Subject: [PATCH 01/10] add YYModel selection --- .DS_Store | Bin 0 -> 6148 bytes .../Controller/ESDialogController.xib | 12 ++-- .../Controller/ESInputJsonController.xib | 8 +-- ESJsonFormat/Controller/ESSettingController.m | 45 ++++++++++++++- .../Controller/ESSettingController.xib | 54 +++++++++++++----- ESJsonFormat/ESJsonFormat.m | 2 +- ESJsonFormat/ESJsonFormatManager.h | 3 +- ESJsonFormat/ESJsonFormatManager.m | 20 +++++-- ESJsonFormat/Info.plist | 2 + ESJsonFormat/Setting/ESJsonFormatSetting.h | 11 +++- ESJsonFormat/Setting/ESJsonFormatSetting.m | 30 ++++++++-- 11 files changed, 148 insertions(+), 39 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..eccfc69f38a71c558e38b86194ba3f1477ea30c2 GIT binary patch literal 6148 zcmeHKu};H441F#gin??{jQ0gd{e!4V8Q4&M0F)pQB3uNm#F(#RU|`~dcs?J6Dlk+? z2!Sox@8Z}=?p<^~1CYhKnFBKb6RP59pXL+M`>F#OWzU!>=@}8XI7Y-B+Cj8Cej@|A zb_ZCZ!U^uVa_{SRjunpZfSTS07wEXE5!W}D^Qw+*XOnq+-Zj6CW!bD(HSqE@Jxx#9 z>HTeNzLnoyefWOS|K7zJa0Z-#f5!l8w#sB`=++r<2AqKn1G+y1s$!9`H%waxO=(~idZVqQYE(-V(IjU99LxQ4J{p#n-9rvmfWGdo#-T_a7bb3 z)){aHwi(#7%bC{y<=6fHc9LH?1J1yoVnD`aRW3NCTw4c|(^?y-XH*r9>kT(49Hdgr eSS`he)Fku=9T1C*y&*jmKL{im+&BY2%D^i(tU+=B literal 0 HcmV?d00001 diff --git a/ESJsonFormat/Controller/ESDialogController.xib b/ESJsonFormat/Controller/ESDialogController.xib index 8b050db..45f204f 100644 --- a/ESJsonFormat/Controller/ESDialogController.xib +++ b/ESJsonFormat/Controller/ESDialogController.xib @@ -1,7 +1,7 @@ - - + + - + @@ -22,7 +22,7 @@ - + @@ -46,7 +46,7 @@ - + - + diff --git a/ESJsonFormat/Controller/ESInputJsonController.xib b/ESJsonFormat/Controller/ESInputJsonController.xib index c68e2b1..3509fde 100644 --- a/ESJsonFormat/Controller/ESInputJsonController.xib +++ b/ESJsonFormat/Controller/ESInputJsonController.xib @@ -1,7 +1,7 @@ - - + + - + @@ -18,7 +18,7 @@ - + diff --git a/ESJsonFormat/Controller/ESSettingController.m b/ESJsonFormat/Controller/ESSettingController.m index e91e7a0..8af3027 100644 --- a/ESJsonFormat/Controller/ESSettingController.m +++ b/ESJsonFormat/Controller/ESSettingController.m @@ -11,6 +11,7 @@ @interface ESSettingController () @property (weak) IBOutlet NSButton *btnImpMJExtesion; +@property (weak) IBOutlet NSButton *btnImpYYModel; @property (weak) IBOutlet NSButton *btnGeneric; @property (weak) IBOutlet NSButton *btnOutputToFile; @property (weak) IBOutlet NSButton *btnUpercaseForId; @@ -22,8 +23,30 @@ @implementation ESSettingController - (void)windowDidLoad { [super windowDidLoad]; - - self.btnImpMJExtesion.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] impOjbClassInArray]; + switch ([[ESJsonFormatSetting defaultSetting] impOjbClassInArray]) { + case ImpOjbClassInArrayType_None: + { + self.btnImpMJExtesion.state = NSOffState; + self.btnImpYYModel.state = NSOffState; + } + break; + case ImpOjbClassInArrayType_MJExtension: + { + self.btnImpMJExtesion.state = NSOnState; + self.btnImpYYModel.state = NSOffState; + } + break; + case ImpOjbClassInArrayType_YYModel: + { + self.btnImpMJExtesion.state = NSOffState; + self.btnImpYYModel.state = NSOnState; + } + break; + + default: + break; + } +// self.btnImpMJExtesion.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] impOjbClassInArray]; self.btnGeneric.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] useGeneric]; self.btnOutputToFile.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] outputToFiles]; self.btnUpercaseForId.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] uppercaseKeyWordForId]; @@ -32,8 +55,24 @@ - (void)windowDidLoad { } } +- (IBAction)btnImpMtdForYYClick:(NSButton *)sender { + [[ESJsonFormatSetting defaultSetting] setImpOjbClassInArray:sender.state?ImpOjbClassInArrayType_YYModel:ImpOjbClassInArrayType_None]; + if (sender.state) { + self.btnImpMJExtesion.state = NSOffState; + + +// [self btnImpMtdForMJClick:self.btnImpMJExtesion]; + } + +} + - (IBAction)btnImpMtdForMJClick:(NSButton *)sender { - [[ESJsonFormatSetting defaultSetting] setImpOjbClassInArray:sender.state]; + [[ESJsonFormatSetting defaultSetting] setImpOjbClassInArray:sender.state?ImpOjbClassInArrayType_MJExtension:ImpOjbClassInArrayType_None]; + if (sender.state) { + self.btnImpYYModel.state = NSOffState; +// [self btnImpMtdForYYClick:self.btnImpYYModel]; + } + } - (IBAction)btnUseGenericClick:(NSButton *)sender { diff --git a/ESJsonFormat/Controller/ESSettingController.xib b/ESJsonFormat/Controller/ESSettingController.xib index 8a380ef..37ea13b 100644 --- a/ESJsonFormat/Controller/ESSettingController.xib +++ b/ESJsonFormat/Controller/ESSettingController.xib @@ -1,13 +1,14 @@ - - + + - + + @@ -17,14 +18,14 @@ - - + + - + - + @@ -69,7 +70,7 @@ + + + + + + + + + + + + + + + + + - + + - + diff --git a/ESJsonFormat/ESJsonFormat.m b/ESJsonFormat/ESJsonFormat.m index 13ecf20..5129934 100755 --- a/ESJsonFormat/ESJsonFormat.m +++ b/ESJsonFormat/ESJsonFormat.m @@ -124,7 +124,7 @@ -(void)outputResult:(NSNotification*)noti{ //输出RootClass的impOjbClassInArray方法 if ([ESJsonFormatSetting defaultSetting].impOjbClassInArray) { - NSString *methodStr = [ESJsonFormatManager methodContentOfObjectClassInArrayWithClassInfo:classInfo]; + NSString *methodStr = [ESJsonFormatManager methodContentOfObjectClassInArrayWithClassInfo:classInfo ImpOjbClassInArrayType:[ESJsonFormatSetting defaultSetting].impOjbClassInArray]; if (methodStr.length) { NSRange lastEndRange = [originalContent rangeOfString:@"@end"]; if (lastEndRange.location != NSNotFound) { diff --git a/ESJsonFormat/ESJsonFormatManager.h b/ESJsonFormat/ESJsonFormatManager.h index e1cb98a..bd74081 100644 --- a/ESJsonFormat/ESJsonFormatManager.h +++ b/ESJsonFormat/ESJsonFormatManager.h @@ -7,6 +7,7 @@ // #import +#import "ESJsonFormatSetting.h" @class ESClassInfo; @interface ESJsonFormatManager : NSObject @@ -46,7 +47,7 @@ * * @return */ -+ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo; ++ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo ImpOjbClassInArrayType:(ImpOjbClassInArrayType)modelType; /** diff --git a/ESJsonFormat/ESJsonFormatManager.m b/ESJsonFormat/ESJsonFormatManager.m index 27c50ff..496f2a8 100644 --- a/ESJsonFormat/ESJsonFormatManager.m +++ b/ESJsonFormat/ESJsonFormatManager.m @@ -12,7 +12,7 @@ #import "ESClassInfo.h" #import "ESPair.h" #import "ESJsonFormat.h" -#import "ESJsonFormatSetting.h" + #import "ESPbxprojInfo.h" #import "ESClassInfo.h" @@ -167,7 +167,7 @@ + (NSString *)parseClassImpContentWithClassInfo:(ESClassInfo *)classInfo{ NSMutableString *result = [NSMutableString stringWithString:@""]; if ([ESJsonFormatSetting defaultSetting].impOjbClassInArray) { - [result appendFormat:@"@implementation %@\n%@\n@end\n",classInfo.className,[self methodContentOfObjectClassInArrayWithClassInfo:classInfo]]; + [result appendFormat:@"@implementation %@\n%@\n@end\n",classInfo.className,[self methodContentOfObjectClassInArrayWithClassInfo:classInfo ImpOjbClassInArrayType:[ESJsonFormatSetting defaultSetting].impOjbClassInArray]]; }else{ [result appendFormat:@"@implementation %@\n\n@end\n",classInfo.className]; } @@ -237,7 +237,7 @@ + (NSString *)parseClassContentForSwiftWithClassInfo:(ESClassInfo *)classInfo{ * * @return */ -+ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo{ ++ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo ImpOjbClassInArrayType:(ImpOjbClassInArrayType)modelType{ if (classInfo.propertyArrayDic.count==0) { return @""; }else{ @@ -250,7 +250,19 @@ + (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)clas result = [NSMutableString stringWithFormat:@"%@",[result substringToIndex:result.length-2]]; } //append method content (objectClassInArray) - NSString *methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary *)objectClassInArray{\n return @{%@};\n}\n",result]; + NSString * impString; + switch (modelType) { + case ImpOjbClassInArrayType_MJExtension: + impString = @"objectClassInArray"; + break; + case ImpOjbClassInArrayType_YYModel: + impString = @"modelContainerPropertyGenericClass"; + break; + + default: + break; + } + NSString *methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary *)%@{\n return @{%@};\n}\n",impString,result]; return methodStr; } } diff --git a/ESJsonFormat/Info.plist b/ESJsonFormat/Info.plist index 0dfeb8a..ba09530 100644 --- a/ESJsonFormat/Info.plist +++ b/ESJsonFormat/Info.plist @@ -36,6 +36,8 @@ 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 7265231C-39B4-402C-89E1-16167C4CC990 ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C + DA4FDFD8-C509-4D8B-8B55-84A7B66AE701 + E0A62D1F-3C18-4D74-BFE5-A4167D643966 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) diff --git a/ESJsonFormat/Setting/ESJsonFormatSetting.h b/ESJsonFormat/Setting/ESJsonFormatSetting.h index b1ef6f0..2443057 100644 --- a/ESJsonFormat/Setting/ESJsonFormatSetting.h +++ b/ESJsonFormat/Setting/ESJsonFormatSetting.h @@ -7,13 +7,20 @@ // #import - +typedef NS_ENUM(NSUInteger , ImpOjbClassInArrayType) { + ImpOjbClassInArrayType_None, + ImpOjbClassInArrayType_YYModel, + ImpOjbClassInArrayType_MJExtension + +}; @interface ESJsonFormatSetting : NSObject + (ESJsonFormatSetting *)defaultSetting; @property BOOL useGeneric; -@property BOOL impOjbClassInArray; +//@property BOOL impOjbClassInArray; +@property ImpOjbClassInArrayType impOjbClassInArray; +//@property BOOL impModelContainerPropertyGenericClass; @property BOOL outputToFiles; @property BOOL uppercaseKeyWordForId; diff --git a/ESJsonFormat/Setting/ESJsonFormatSetting.m b/ESJsonFormat/Setting/ESJsonFormatSetting.m index 5db43a2..181f98b 100644 --- a/ESJsonFormat/Setting/ESJsonFormatSetting.m +++ b/ESJsonFormat/Setting/ESJsonFormatSetting.m @@ -9,8 +9,10 @@ #import "ESJsonFormatSetting.h" + NSString *const kESJsonFormatGeneric = @"com.EnjoySR.ESJsonFormat.Generic"; NSString *const kESJsonFormatOutputToFiles = @"com.EnjoySR.ESJsonFormat.OutputToFiles"; +//NSString *const kESJsonFormatImpModelContainerPropertyGenericClass = @"com.EnjoySR.ESJsonFormat.ImpModelContainerPropertyGenericClass"; NSString *const kESJsonFormatImpObjClassInArray = @"com.EnjoySR.ESJsonFormat.ImpObjClassInArray"; NSString *const kESJsonFormatUppercaseKeyWordForId = @"com.EnjoySR.ESJsonFormat.UppercaseKeyWordForId"; @@ -24,7 +26,7 @@ + (ESJsonFormatSetting *)defaultSetting defaultSetting = [[ESJsonFormatSetting alloc] init]; NSDictionary *defaults = @{kESJsonFormatGeneric: @YES, kESJsonFormatOutputToFiles: @NO, - kESJsonFormatImpObjClassInArray: @YES, + kESJsonFormatImpObjClassInArray:[NSNumber numberWithUnsignedInt:ImpOjbClassInArrayType_MJExtension],//@YES, kESJsonFormatUppercaseKeyWordForId: @NO}; [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; }); @@ -40,13 +42,31 @@ - (BOOL)useGeneric{ return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatGeneric]; } -- (void)setImpOjbClassInArray:(BOOL)impOjbClassInArray{ - [[NSUserDefaults standardUserDefaults] setBool:impOjbClassInArray forKey:kESJsonFormatImpObjClassInArray]; +//- (void)setImpModelContainerPropertyGenericClass:(BOOL)impModelContainerPropertyGenericClass{ +// [[NSUserDefaults standardUserDefaults] setBool:impModelContainerPropertyGenericClass forKey:kESJsonFormatImpModelContainerPropertyGenericClass]; +// [[NSUserDefaults standardUserDefaults] synchronize]; +//} +// +//- (BOOL)impModelContainerPropertyGenericClass{ +// return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatImpModelContainerPropertyGenericClass]; +//} + +//- (void)setImpOjbClassInArray:(BOOL)impOjbClassInArray{ +// [[NSUserDefaults standardUserDefaults] setBool:impOjbClassInArray forKey:kESJsonFormatImpObjClassInArray]; +// [[NSUserDefaults standardUserDefaults] synchronize]; +//} +// +//- (BOOL)impOjbClassInArray{ +// return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatImpObjClassInArray]; +//} + +- (void)setImpOjbClassInArray:(ImpOjbClassInArrayType)impOjbClassInArray{ + [[NSUserDefaults standardUserDefaults] setInteger:impOjbClassInArray forKey:kESJsonFormatImpObjClassInArray]; [[NSUserDefaults standardUserDefaults] synchronize]; } -- (BOOL)impOjbClassInArray{ - return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatImpObjClassInArray]; +- (ImpOjbClassInArrayType)impOjbClassInArray{ + return [[NSUserDefaults standardUserDefaults] integerForKey:kESJsonFormatImpObjClassInArray]; } - (void)setOutputToFiles:(BOOL)outputToFiles{ From 34fb3c358acee39cd14263d798b72a4f2c94c662 Mon Sep 17 00:00:00 2001 From: tanpengsccd Date: Thu, 16 Feb 2017 00:49:50 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E6=B7=BB=E5=8A=A0xcode=20=208.1=208.2=20?= =?UTF-8?q?8.2.1=20UDID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes ESJsonFormat/Controller/ESSettingController.m | 10 ++++++++- .../Controller/ESSettingController.xib | 21 ++++++++++-------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/.DS_Store b/.DS_Store index eccfc69f38a71c558e38b86194ba3f1477ea30c2..c0f40c94461123b791ec27a4cc84046cc74cfcf4 100644 GIT binary patch delta 27 jcmZoMXffE}#l&>z&SW2^eVYZDzp+egVBgHn@s}R}lU@o- delta 29 lcmZoMXffE}#l&>%++-i7eT)K|1)0CGOl)A=%+B$b9{`@q3Q+(6 diff --git a/ESJsonFormat/Controller/ESSettingController.m b/ESJsonFormat/Controller/ESSettingController.m index 8af3027..ff1a0a4 100644 --- a/ESJsonFormat/Controller/ESSettingController.m +++ b/ESJsonFormat/Controller/ESSettingController.m @@ -88,11 +88,19 @@ - (IBAction)btnUpercaseKeyWordForIdClick:(NSButton *)sender { } -- (IBAction)tapGes:(NSClickGestureRecognizer *)sender { +- (IBAction)tapMJGes:(NSClickGestureRecognizer *)sender { + NSURL* url = [[ NSURL alloc ] initWithString :@"http://t.cn/RLarUfg"]; [[NSWorkspace sharedWorkspace] openURL:url]; } +- (IBAction)tapYYGes:(id)sender { + NSURL* url = [[ NSURL alloc ] initWithString :@"http://dwz.cn/3smhbO"]; + [[NSWorkspace sharedWorkspace] openURL:url]; +} + + + @end diff --git a/ESJsonFormat/Controller/ESSettingController.xib b/ESJsonFormat/Controller/ESSettingController.xib index 37ea13b..6ad23f3 100644 --- a/ESJsonFormat/Controller/ESSettingController.xib +++ b/ESJsonFormat/Controller/ESSettingController.xib @@ -1,7 +1,8 @@ - + - + + @@ -21,7 +22,7 @@ - + - - + + - + - + @@ -114,8 +115,10 @@ + + From fae01e2a2aac01be4ba254c00a555385bfc78e5e Mon Sep 17 00:00:00 2001 From: tanpengsccd Date: Thu, 16 Feb 2017 01:05:25 +0800 Subject: [PATCH 03/10] add gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c964cd8..c3ad185 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ DerivedData *.hmap *.ipa *.xcuserstate - +.DS_Store # CocoaPods # # We recommend against adding the Pods directory to your .gitignore. However From 254963286d53febdfffa6ed0d72228dfc6a940ce Mon Sep 17 00:00:00 2001 From: tanpengsccd Date: Thu, 16 Feb 2017 01:06:57 +0800 Subject: [PATCH 04/10] rm ds --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index c0f40c94461123b791ec27a4cc84046cc74cfcf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!AiqG5Pe&FsPxj4c-$`#`Ujz;9=u6@KuJUq;|6WPW4_I!XODi2Z*~T?M1>-V z*cq68o5{>>=WW@^00@h9GY4h>CRD-EK8H_4-ir=oWR@{8<+L*g%jNK! Date: Thu, 16 Feb 2017 01:13:48 +0800 Subject: [PATCH 05/10] update readme --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 03f031b..b88d14a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ +## 新增功能------------------------------------------------------- + +### 添加 8.1 8.2(8.2.1)的支持,需要自签名 Xcode + +### 添加 YYModel 支持,不影响 MJExtension 支持 + +## 以下为EnjoySR 原作的介绍---------------------------------------- + ### ESJsonFormat-Xcode 将JSON格式化输出为模型的属性    个人活动范围>[Weibo-EnjoySR](http://weibo.com/EnjoySR) From f7e1a6e67b9bdb6d1dce19ad11089663f9b63eb2 Mon Sep 17 00:00:00 2001 From: tanpengsccd Date: Thu, 16 Feb 2017 15:31:53 +0800 Subject: [PATCH 06/10] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b88d14a..d6bdb09 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ### 添加 8.1 8.2(8.2.1)的支持,需要自签名 Xcode ### 添加 YYModel 支持,不影响 MJExtension 支持 - +![image](https://cloud.githubusercontent.com/assets/13959880/22986169/a6647b9e-f3e5-11e6-90fc-71eceb861211.png) ## 以下为EnjoySR 原作的介绍---------------------------------------- ### ESJsonFormat-Xcode From f2b5d3e6cc0b4c31e4e818006877c090a8d95bcd Mon Sep 17 00:00:00 2001 From: TanPeng Date: Wed, 6 Sep 2017 10:07:29 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E6=B7=BB=E5=8A=A09=20beta=20=E7=9A=84UUI?= =?UTF-8?q?D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xcshareddata/xcschemes/ESJsonFormat.xcscheme | 2 ++ ESJsonFormat/Info.plist | 1 + 2 files changed, 3 insertions(+) diff --git a/ESJsonFormat.xcodeproj/xcshareddata/xcschemes/ESJsonFormat.xcscheme b/ESJsonFormat.xcodeproj/xcshareddata/xcschemes/ESJsonFormat.xcscheme index 752f4b3..966e4d3 100755 --- a/ESJsonFormat.xcodeproj/xcshareddata/xcschemes/ESJsonFormat.xcscheme +++ b/ESJsonFormat.xcodeproj/xcshareddata/xcschemes/ESJsonFormat.xcscheme @@ -40,6 +40,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" shouldUseLaunchSchemeArgsEnv = "YES"> @@ -50,6 +51,7 @@ buildConfiguration = "Release" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/ESJsonFormat/Info.plist b/ESJsonFormat/Info.plist index ba09530..34019fc 100644 --- a/ESJsonFormat/Info.plist +++ b/ESJsonFormat/Info.plist @@ -38,6 +38,7 @@ ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C DA4FDFD8-C509-4D8B-8B55-84A7B66AE701 E0A62D1F-3C18-4D74-BFE5-A4167D643966 + CA351AD8-3176-41CB-875C-42A05C7CDEC7 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) From 9d3743ddb9557dc40fba117707a1512eb4c64c60 Mon Sep 17 00:00:00 2001 From: TanPeng Date: Wed, 6 Sep 2017 12:57:07 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=8E=9F=E4=BD=9C?= =?UTF-8?q?=E8=80=85=E6=9C=80=E6=96=B0code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes .gitignore.orig | 30 ++ .../xcschemes/ESJsonFormat.xcscheme.orig | 100 +++++ .../Controller/ESDialogController.xib.orig | 108 +++++ .../Controller/ESInputJsonController.xib.orig | 112 ++++++ .../Controller/ESSettingController.m.orig | 126 ++++++ .../Controller/ESSettingController.xib.orig | 188 +++++++++ ESJsonFormat/ESJsonFormat.m | 2 +- ESJsonFormat/ESJsonFormat.m.orig | 233 +++++++++++ ESJsonFormat/ESJsonFormatManager.h.orig | 69 ++++ ESJsonFormat/ESJsonFormatManager.m.orig | 371 ++++++++++++++++++ ESJsonFormat/Info.plist.orig | 60 +++ .../Setting/ESJsonFormatSetting.h.orig | 35 ++ .../Setting/ESJsonFormatSetting.m.orig | 109 +++++ README.md.orig | 159 ++++++++ 15 files changed, 1701 insertions(+), 1 deletion(-) create mode 100644 .DS_Store create mode 100644 .gitignore.orig create mode 100755 ESJsonFormat.xcodeproj/xcshareddata/xcschemes/ESJsonFormat.xcscheme.orig create mode 100644 ESJsonFormat/Controller/ESDialogController.xib.orig create mode 100644 ESJsonFormat/Controller/ESInputJsonController.xib.orig create mode 100644 ESJsonFormat/Controller/ESSettingController.m.orig create mode 100644 ESJsonFormat/Controller/ESSettingController.xib.orig create mode 100755 ESJsonFormat/ESJsonFormat.m.orig create mode 100644 ESJsonFormat/ESJsonFormatManager.h.orig create mode 100644 ESJsonFormat/ESJsonFormatManager.m.orig create mode 100644 ESJsonFormat/Info.plist.orig create mode 100644 ESJsonFormat/Setting/ESJsonFormatSetting.h.orig create mode 100644 ESJsonFormat/Setting/ESJsonFormatSetting.m.orig create mode 100644 README.md.orig diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..56bd4cb9375abcde0724bbcd464ef913a7fe1910 GIT binary patch literal 6148 zcmeHKO-sW-5Pe%CRJ`;g9v4rZg#Lq2QV-rFe?UnjD$NHq6_4>B`Dgq;zS&udwR$Lm zNST3|mz~VpbYCFT0pMn81nU<&M~0_@ph<6}jOrhqA63ak~7?}Mic zrV$6l@abR(BLFdBIvB5ImJp7Qm_{5Fd57kdN>r+gBZgBt^FG$45eG%3!^Ppl#V5Ns zp}6pL?(ai6T&if%6fgxg6*$o4MEd{y=lOq=WGhp^6xb^TT$1J4j7N&Sb?b1_Yd!sj pE+%z@;+n#X(27|rt@xB4jCn5?#5Cfd$PCT?2m~1{m;!&Qzz0-5MkxRQ literal 0 HcmV?d00001 diff --git a/.gitignore.orig b/.gitignore.orig new file mode 100644 index 0000000..a90f7d6 --- /dev/null +++ b/.gitignore.orig @@ -0,0 +1,30 @@ +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +<<<<<<< HEAD +.DS_Store +======= + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +#Pods/ diff --git a/ESJsonFormat.xcodeproj/xcshareddata/xcschemes/ESJsonFormat.xcscheme.orig b/ESJsonFormat.xcodeproj/xcshareddata/xcschemes/ESJsonFormat.xcscheme.orig new file mode 100755 index 0000000..a94a49f --- /dev/null +++ b/ESJsonFormat.xcodeproj/xcshareddata/xcschemes/ESJsonFormat.xcscheme.orig @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + >>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "NO" + debugXPCServices = "NO" + debugServiceExtension = "internal" + allowLocationSimulation = "NO" + viewDebuggingEnabled = "No"> +<<<<<<< HEAD +======= + + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + + + + + + + + + diff --git a/ESJsonFormat/Controller/ESDialogController.xib.orig b/ESJsonFormat/Controller/ESDialogController.xib.orig new file mode 100644 index 0000000..ab3691e --- /dev/null +++ b/ESJsonFormat/Controller/ESDialogController.xib.orig @@ -0,0 +1,108 @@ +<<<<<<< HEAD + + + + +======= + + + + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + + + + + + + + + + + + + + + +<<<<<<< HEAD + +======= + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ESJsonFormat/Controller/ESInputJsonController.xib.orig b/ESJsonFormat/Controller/ESInputJsonController.xib.orig new file mode 100644 index 0000000..a964506 --- /dev/null +++ b/ESJsonFormat/Controller/ESInputJsonController.xib.orig @@ -0,0 +1,112 @@ +<<<<<<< HEAD + + + + +======= + + + + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + + + + + + + + + + + +<<<<<<< HEAD + +======= + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ESJsonFormat/Controller/ESSettingController.m.orig b/ESJsonFormat/Controller/ESSettingController.m.orig new file mode 100644 index 0000000..9a4be8e --- /dev/null +++ b/ESJsonFormat/Controller/ESSettingController.m.orig @@ -0,0 +1,126 @@ +// +// ESSettingController.m +// ESJsonFormat +// +// Created by 尹桥印 on 15/7/19. +// Copyright (c) 2015年 EnjoySR. All rights reserved. +// + +#import "ESSettingController.h" +#import "ESJsonFormatSetting.h" + +@interface ESSettingController () +@property (weak) IBOutlet NSButton *btnImpMJExtesion; +<<<<<<< HEAD +@property (weak) IBOutlet NSButton *btnImpYYModel; +======= +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +@property (weak) IBOutlet NSButton *btnGeneric; +@property (weak) IBOutlet NSButton *btnOutputToFile; +@property (weak) IBOutlet NSButton *btnUpercaseForId; + +@end + +@implementation ESSettingController + +- (void)windowDidLoad { + [super windowDidLoad]; + +<<<<<<< HEAD + switch ([[ESJsonFormatSetting defaultSetting] impOjbClassInArray]) { + case ImpOjbClassInArrayType_None: + { + self.btnImpMJExtesion.state = NSOffState; + self.btnImpYYModel.state = NSOffState; + } + break; + case ImpOjbClassInArrayType_MJExtension: + { + self.btnImpMJExtesion.state = NSOnState; + self.btnImpYYModel.state = NSOffState; + } + break; + case ImpOjbClassInArrayType_YYModel: + { + self.btnImpMJExtesion.state = NSOffState; + self.btnImpYYModel.state = NSOnState; + } + break; + + default: + break; + } +// self.btnImpMJExtesion.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] impOjbClassInArray]; +======= + + self.btnImpMJExtesion.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] impOjbClassInArray]; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + self.btnGeneric.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] useGeneric]; + self.btnOutputToFile.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] outputToFiles]; + self.btnUpercaseForId.state = (NSCellStateValue)[[ESJsonFormatSetting defaultSetting] uppercaseKeyWordForId]; + if (![ESUtils isXcode7AndLater]) { + self.btnGeneric.enabled = NO; + } +} + +<<<<<<< HEAD +- (IBAction)btnImpMtdForYYClick:(NSButton *)sender { + [[ESJsonFormatSetting defaultSetting] setImpOjbClassInArray:sender.state?ImpOjbClassInArrayType_YYModel:ImpOjbClassInArrayType_None]; + if (sender.state) { + self.btnImpMJExtesion.state = NSOffState; + + +// [self btnImpMtdForMJClick:self.btnImpMJExtesion]; + } + +} + +- (IBAction)btnImpMtdForMJClick:(NSButton *)sender { + [[ESJsonFormatSetting defaultSetting] setImpOjbClassInArray:sender.state?ImpOjbClassInArrayType_MJExtension:ImpOjbClassInArrayType_None]; + if (sender.state) { + self.btnImpYYModel.state = NSOffState; +// [self btnImpMtdForYYClick:self.btnImpYYModel]; + } + +======= +- (IBAction)btnImpMtdForMJClick:(NSButton *)sender { + [[ESJsonFormatSetting defaultSetting] setImpOjbClassInArray:sender.state]; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +} + +- (IBAction)btnUseGenericClick:(NSButton *)sender { + [[ESJsonFormatSetting defaultSetting] setUseGeneric:sender.state]; +} + +- (IBAction)btnOutputToFilesClick:(NSButton *)sender { + [[ESJsonFormatSetting defaultSetting] setOutputToFiles:sender.state]; +} + +- (IBAction)btnUpercaseKeyWordForIdClick:(NSButton *)sender { + [[ESJsonFormatSetting defaultSetting] setUppercaseKeyWordForId:sender.state]; +} + + +<<<<<<< HEAD +- (IBAction)tapMJGes:(NSClickGestureRecognizer *)sender { + +======= +- (IBAction)tapGes:(NSClickGestureRecognizer *)sender { +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + NSURL* url = [[ NSURL alloc ] initWithString :@"http://t.cn/RLarUfg"]; + [[NSWorkspace sharedWorkspace] openURL:url]; +} + + + +<<<<<<< HEAD +- (IBAction)tapYYGes:(id)sender { + NSURL* url = [[ NSURL alloc ] initWithString :@"http://dwz.cn/3smhbO"]; + [[NSWorkspace sharedWorkspace] openURL:url]; +} + + + +======= +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +@end diff --git a/ESJsonFormat/Controller/ESSettingController.xib.orig b/ESJsonFormat/Controller/ESSettingController.xib.orig new file mode 100644 index 0000000..d1cb70e --- /dev/null +++ b/ESJsonFormat/Controller/ESSettingController.xib.orig @@ -0,0 +1,188 @@ +<<<<<<< HEAD + + + + + +======= + + + + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + +<<<<<<< HEAD + +======= +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + + + + +<<<<<<< HEAD + + + + + + + + + + +<<<<<<< HEAD + + + + + +======= + + + + + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + + + + + +<<<<<<< HEAD + + + + + + + + + + + + + + + + + + + + +======= + + + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + +<<<<<<< HEAD + + + + + +======= + + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + + + + +<<<<<<< HEAD + +======= + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + + diff --git a/ESJsonFormat/ESJsonFormat.m b/ESJsonFormat/ESJsonFormat.m index 9eb4170..d0a052a 100755 --- a/ESJsonFormat/ESJsonFormat.m +++ b/ESJsonFormat/ESJsonFormat.m @@ -139,7 +139,7 @@ -(void)outputResult:(NSNotification*)noti{ //输出RootClass的impOjbClassInArray方法 if ([ESJsonFormatSetting defaultSetting].impOjbClassInArray) { - NSString *methodStr = [ESJsonFormatManager methodContentOfObjectClassInArrayWithClassInfo:classInfo]; + NSString *methodStr = [ESJsonFormatManager methodContentOfObjectClassInArrayWithClassInfo:classInfo ImpOjbClassInArrayType:[ESJsonFormatSetting defaultSetting].impOjbClassInArray]; if (methodStr.length) { NSRange lastEndRange = [originalContent rangeOfString:@"@end"]; if (lastEndRange.location != NSNotFound) { diff --git a/ESJsonFormat/ESJsonFormat.m.orig b/ESJsonFormat/ESJsonFormat.m.orig new file mode 100755 index 0000000..c63230f --- /dev/null +++ b/ESJsonFormat/ESJsonFormat.m.orig @@ -0,0 +1,233 @@ +// +// ESJsonFormat.m +// ESJsonFormat +// +// Created by 尹桥印 on 15/6/28. +// Copyright (c) 2015年 EnjoySR. All rights reserved. +// + +#import "ESJsonFormat.h" +#import "ESJsonFormatManager.h" +#import "ESFormatInfo.h" +#import "ESInputJsonController.h" +#import "ESSettingController.h" +#import "ESPbxprojInfo.h" +#import "ESJsonFormatSetting.h" +#import "ESClassInfo.h" + +@interface ESJsonFormat() +@property (nonatomic, strong) ESInputJsonController *inputCtrl; +@property (nonatomic, strong) ESSettingController *settingCtrl; +@property (nonatomic, strong) id eventMonitor; +@property (nonatomic, strong, readwrite) NSBundle *bundle; +@property (nonatomic, copy) NSString *currentFilePath; +@property (nonatomic, copy) NSString *currentProjectPath; +@property (nonatomic) NSTextView *currentTextView; +@property (nonatomic, assign) BOOL notiTag; + +@end + +@implementation ESJsonFormat + ++ (instancetype)sharedPlugin{ + return sharedPlugin; +} + ++ (instancetype)instance{ + return instance; +} + +- (id)initWithBundle:(NSBundle *)plugin +{ + if (self = [super init]) { + // reference to plugin's bundle, for resource access + self.bundle = plugin; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(didApplicationFinishLaunchingNotification:) + name:NSApplicationDidFinishLaunchingNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(outputResult:) name:ESFormatResultNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationLog:) name:NSTextViewDidChangeSelectionNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationLog:) name:@"IDEEditorDocumentDidChangeNotification" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationLog:) name:@"PBXProjectDidOpenNotification" object:nil]; +<<<<<<< HEAD +======= + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationLog:) name:@"SourceEditorSelectedSourceRangeChangedNotification" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationLog:) name:@"IDEWorkspaceDocumentWillWriteStateDataNotification" object:nil]; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + } + instance = self; + return self; +} + +- (void)notificationLog:(NSNotification *)notify +{ +<<<<<<< HEAD + if (!self.notiTag) return; + if ([notify.name isEqualToString:NSTextViewDidChangeSelectionNotification]) { + if ([notify.object isKindOfClass:[NSTextView class]]) { +======= + + if (!self.notiTag) return; + if ([notify.name isEqualToString:NSTextViewDidChangeSelectionNotification]) { + if ([notify.object isKindOfClass:NSClassFromString(@"DVTSourceTextView")]) { +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + NSTextView *text = (NSTextView *)notify.object; + self.currentTextView = text; + } + }else if ([notify.name isEqualToString:@"IDEEditorDocumentDidChangeNotification"]){ + //Track the current open paths + NSObject *array = notify.userInfo[@"IDEEditorDocumentChangeLocationsKey"]; + NSURL *url = [[array valueForKey:@"documentURL"] firstObject]; + if (![url isKindOfClass:[NSNull class]]) { + NSString *path = [url absoluteString]; + self.currentFilePath = path; + if ([self.currentFilePath hasSuffix:@"swift"]) { + self.swift = YES; + }else{ + self.swift = NO; + } + } + }else if ([notify.name isEqualToString:@"PBXProjectDidOpenNotification"]){ + self.currentProjectPath = [notify.object valueForKey:@"path"]; + [[ESPbxprojInfo shareInstance] setParamsWithPath:[self.currentProjectPath stringByAppendingPathComponent:@"project.pbxproj"]]; +<<<<<<< HEAD + } +======= + }else if ([notify.name isEqualToString:@"SourceEditorSelectedSourceRangeChangedNotification"]) { + // 适配 Xcode 9,在Xcode 9 中代码编辑区域的 View 类型如下,继承于 NSView,但使用方式与 NSTextView 类似 + if ([notify.object isKindOfClass:NSClassFromString(@"IDEPegasusSourceEditor.SourceCodeEditorView")]) { + self.currentTextView = notify.object; + } + }else if ([notify.name isEqualToString:@"IDEWorkspaceDocumentWillWriteStateDataNotification"]) { + NSArray *recentEditorDocumentURLs = [notify.object valueForKey:@"_recentEditorDocumentURLs"]; + NSString *path = [recentEditorDocumentURLs.firstObject absoluteString]; + if ([path hasPrefix:@"file"]) { + self.currentFilePath = path; + } + } + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +} + +-(void)outputResult:(NSNotification*)noti{ + ESClassInfo *classInfo = noti.object; + if ([ESJsonFormatSetting defaultSetting].outputToFiles) { + //选择保存路径 + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setTitle:@"ESJsonFormat"]; + [panel setCanChooseDirectories:YES]; + [panel setCanCreateDirectories:YES]; + [panel setCanChooseFiles:NO]; + + if ([panel runModal] == NSModalResponseOK) { + NSString *folderPath = [[[panel URLs] objectAtIndex:0] relativePath]; + [classInfo createFileWithFolderPath:folderPath]; + [[NSWorkspace sharedWorkspace] openFile:folderPath]; + } + + }else{ + if (!self.currentTextView) return; + if (!self.isSwift) { + //先添加主类的属性 + [self.currentTextView insertText:classInfo.propertyContent]; + + //再添加把其他类的的字符串拼接到最后面 + [self.currentTextView insertText:classInfo.classInsertTextViewContentForH replacementRange:NSMakeRange(self.currentTextView.string.length, 0)]; + + //@class + NSString *atClassContent = classInfo.atClassContent; + if (atClassContent.length>0) { + NSRange atInsertRange = [self.currentTextView.string rangeOfString:@"\n@interface"]; + if (atInsertRange.location != NSNotFound) { + [self.currentTextView insertText:[NSString stringWithFormat:@"\n%@",atClassContent] replacementRange:NSMakeRange(atInsertRange.location, 0)]; + } + } + + //再添加.m文件的内容 + NSString *urlStr = [NSString stringWithFormat:@"%@m",[self.currentFilePath substringWithRange:NSMakeRange(0, self.currentFilePath.length-1)]] ; + NSURL *writeUrl = [NSURL URLWithString:urlStr]; + //The original content + NSString *originalContent = [NSString stringWithContentsOfURL:writeUrl encoding:NSUTF8StringEncoding error:nil]; + + //输出RootClass的impOjbClassInArray方法 + if ([ESJsonFormatSetting defaultSetting].impOjbClassInArray) { +<<<<<<< HEAD + NSString *methodStr = [ESJsonFormatManager methodContentOfObjectClassInArrayWithClassInfo:classInfo ImpOjbClassInArrayType:[ESJsonFormatSetting defaultSetting].impOjbClassInArray]; +======= + NSString *methodStr = [ESJsonFormatManager methodContentOfObjectClassInArrayWithClassInfo:classInfo]; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + if (methodStr.length) { + NSRange lastEndRange = [originalContent rangeOfString:@"@end"]; + if (lastEndRange.location != NSNotFound) { + originalContent = [originalContent stringByReplacingCharactersInRange:NSMakeRange(lastEndRange.location, 0) withString:methodStr]; + } + } + } + originalContent = [originalContent stringByReplacingCharactersInRange:NSMakeRange(originalContent.length, 0) withString:classInfo.classInsertTextViewContentForM]; + [originalContent writeToURL:writeUrl atomically:YES encoding:NSUTF8StringEncoding error:nil]; + + }else{ + //Swift + [self.currentTextView insertText:classInfo.propertyContent]; + + //再添加把其他类的的字符串拼接到最后面 + [self.currentTextView insertText:classInfo.classInsertTextViewContentForH replacementRange:NSMakeRange(self.currentTextView.string.length, 0)]; + } + } +} + +- (void)didApplicationFinishLaunchingNotification:(NSNotification*)noti{ + self.notiTag = YES; + [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidFinishLaunchingNotification object:nil]; + NSMenuItem *menuItem = [[NSApp mainMenu] itemWithTitle:@"Window"]; + if (menuItem) { + + NSMenu *menu = [[NSMenu alloc] init]; + + //Input JSON window + NSMenuItem *inputJsonWindow = [[NSMenuItem alloc] initWithTitle:@"Input JSON window" action:@selector(showInputJsonWindow:) keyEquivalent:@"J"]; + [inputJsonWindow setKeyEquivalentModifierMask:NSAlphaShiftKeyMask | NSControlKeyMask]; + inputJsonWindow.target = self; + [menu addItem:inputJsonWindow]; + + //Setting + NSMenuItem *settingWindow = [[NSMenuItem alloc] initWithTitle:@"Setting" action:@selector(showSettingWindow:) keyEquivalent:@""]; + settingWindow.target = self; + [menu addItem:settingWindow]; + + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:@"ESJsonFormat" action:nil keyEquivalent:@""]; + item.submenu = menu; + + [[menuItem submenu] addItem:item]; + } +} + +- (void)showInputJsonWindow:(NSMenuItem *)item{ + + if (!(self.currentTextView && self.currentFilePath)) { + NSError *error = [NSError errorWithDomain:@"Current state is not edit!" code:0 userInfo:nil]; + NSAlert *alert = [NSAlert alertWithError:error]; + [alert runModal]; + return; + } + self.notiTag = NO; + self.inputCtrl = [[ESInputJsonController alloc] initWithWindowNibName:@"ESInputJsonController"]; + self.inputCtrl.delegate = self; + [self.inputCtrl showWindow:self.inputCtrl]; +} + +- (void)showSettingWindow:(NSMenuItem *)item{ + self.settingCtrl = [[ESSettingController alloc] initWithWindowNibName:@"ESSettingController"]; + [self.settingCtrl showWindow:self.settingCtrl]; +} + +-(void)windowWillClose{ + self.notiTag = YES; +} +- (void)dealloc{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + + +@end diff --git a/ESJsonFormat/ESJsonFormatManager.h.orig b/ESJsonFormat/ESJsonFormatManager.h.orig new file mode 100644 index 0000000..e463f17 --- /dev/null +++ b/ESJsonFormat/ESJsonFormatManager.h.orig @@ -0,0 +1,69 @@ +// +// ESJsonFormatManager.h +// ESJsonFormat +// +// Created by 尹桥印 on 15/6/28. +// Copyright (c) 2015年 EnjoySR. All rights reserved. +// + +#import +<<<<<<< HEAD +#import "ESJsonFormatSetting.h" +======= +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +@class ESClassInfo; +@interface ESJsonFormatManager : NSObject + +/** + * 解析一个类里面属性字段的内容 + * + * @param classInfo 类信息 + * + * @return + */ ++ (NSString *)parsePropertyContentWithClassInfo:(ESClassInfo *)classInfo; + +/** + * 解析一个类头文件的内容(会根据是否创建文件返回的内容有所不同) + * + * @param classInfo 类信息 + * + * @return 类头文件里面的内容 + */ ++ (NSString *)parseClassHeaderContentWithClassInfo:(ESClassInfo *)classInfo; + + +/** + * 解析一个类实现文件内容 (仅对OC有效) + * + * @param classInfo 类信息 + * + * @return 实现文件里面的内容 + */ ++ (NSString *)parseClassImpContentWithClassInfo:(ESClassInfo *)classInfo; + + +/** + * 生成 MJExtension2.0 的集合中指定对象的方法 + * + * @param classInfo 指定类信息 + * + * @return + */ +<<<<<<< HEAD ++ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo ImpOjbClassInArrayType:(ImpOjbClassInArrayType)modelType; +======= ++ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + + +/** + * 创建文件 + * + * @param folderPath 输出的文件夹路径 + * @param classInfo 类信息 + */ ++ (void)createFileWithFolderPath:(NSString *)folderPath classInfo:(ESClassInfo *)classInfo; + + +@end diff --git a/ESJsonFormat/ESJsonFormatManager.m.orig b/ESJsonFormat/ESJsonFormatManager.m.orig new file mode 100644 index 0000000..4002a40 --- /dev/null +++ b/ESJsonFormat/ESJsonFormatManager.m.orig @@ -0,0 +1,371 @@ +// +// 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" +<<<<<<< HEAD + +======= +#import "ESJsonFormatSetting.h" +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +#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 *qualifierStr = @"copy"; + NSString *typeStr = @"NSString"; + //判断大小写 + if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) { + key = [key uppercaseString]; + } + if ([value isKindOfClass:[NSString class]]) { + return [NSString stringWithFormat:@"@property (nonatomic, %@) %@ *%@;",qualifierStr,typeStr,key]; + }else if([value isKindOfClass:[@(YES) class]]){ + //the 'NSCFBoolean' is private subclass of 'NSNumber' + qualifierStr = @"assign"; + typeStr = @"BOOL"; + return [NSString stringWithFormat:@"@property (nonatomic, %@) %@ %@;",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:@"@property (nonatomic, %@) %@ %@;",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 = @""; + }else if ([firstObj isKindOfClass:[NSNumber class]]){ + genericTypeStr = @""; + } + + qualifierStr = @"strong"; + typeStr = @"NSArray"; + if ([ESJsonFormatSetting defaultSetting].useGeneric && [ESUtils isXcode7AndLater]) { + return [NSString stringWithFormat:@"@property (nonatomic, %@) %@%@ *%@;",qualifierStr,typeStr,genericTypeStr,key]; + } + return [NSString stringWithFormat:@"@property (nonatomic, %@) %@ *%@;",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:@"@property (nonatomic, %@) %@ *%@;",qualifierStr,typeStr,key]; + } + return [NSString stringWithFormat:@"@property (nonatomic, %@) %@ *%@;",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{ +<<<<<<< HEAD + NSString *typeStr = @"String?"; +======= + NSString *typeStr = @"String"; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + //判断大小写 + if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) { + key = [key uppercaseString]; + } + if ([value isKindOfClass:[NSString class]]) { +<<<<<<< HEAD + return [NSString stringWithFormat:@" var %@: %@",key,typeStr]; +======= + return [NSString stringWithFormat:@" var %@: %@ = \"\"",key,typeStr]; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + }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) { +<<<<<<< HEAD + [result appendFormat:@"@implementation %@\n%@\n@end\n",classInfo.className,[self methodContentOfObjectClassInArrayWithClassInfo:classInfo ImpOjbClassInArrayType:[ESJsonFormatSetting defaultSetting].impOjbClassInArray]]; +======= + [result appendFormat:@"@implementation %@\n%@\n@end\n",classInfo.className,[self methodContentOfObjectClassInArrayWithClassInfo:classInfo]]; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + }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 + */ +<<<<<<< HEAD ++ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo ImpOjbClassInArrayType:(ImpOjbClassInArrayType)modelType{ +======= ++ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo{ +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + 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) +<<<<<<< HEAD + NSString * impString; + switch (modelType) { + case ImpOjbClassInArrayType_MJExtension: + impString = @"objectClassInArray"; + break; + case ImpOjbClassInArrayType_YYModel: + impString = @"modelContainerPropertyGenericClass"; + break; + + default: + break; + } + NSString *methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary *)%@{\n return @{%@};\n}\n",impString,result]; +======= + NSString *methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary *)objectClassInArray{\n return @{%@};\n}\n",result]; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + 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 \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 diff --git a/ESJsonFormat/Info.plist.orig b/ESJsonFormat/Info.plist.orig new file mode 100644 index 0000000..ca1cb3f --- /dev/null +++ b/ESJsonFormat/Info.plist.orig @@ -0,0 +1,60 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + com.enjoy.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + DVTPlugInCompatibilityUUIDs + + AABB7188-E14E-4433-AD3B-5CD791EAD9A3 +<<<<<<< HEAD +======= + 1637F4D5-0B27-416B-A78D-498965D64877 +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + F41BD31E-2683-44B8-AE7F-5F09E919790E + 992275C1-432A-4CF7-B659-D84ED6D42D3F + 7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90 + C4A681B0-4A26-480E-93EC-1218098B9AA0 + AD68E85B-441B-4301-B564-A45E4919A6AD + A16FF353-8441-459E-A50C-B071F53F51B7 + 9F75337B-21B4-4ADC-B558-F9CADF7073A7 + E969541F-E6F9-4D25-8158-72DC3545A6C6 + 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 + 7265231C-39B4-402C-89E1-16167C4CC990 + ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C +<<<<<<< HEAD + DA4FDFD8-C509-4D8B-8B55-84A7B66AE701 + E0A62D1F-3C18-4D74-BFE5-A4167D643966 +======= + DFFB3951-EB0A-4C09-9DAC-5F2D28CC839C +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + CA351AD8-3176-41CB-875C-42A05C7CDEC7 + + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSPrincipalClass + ESJsonFormat + XC4Compatible + + XCPluginHasUI + + + diff --git a/ESJsonFormat/Setting/ESJsonFormatSetting.h.orig b/ESJsonFormat/Setting/ESJsonFormatSetting.h.orig new file mode 100644 index 0000000..964fb27 --- /dev/null +++ b/ESJsonFormat/Setting/ESJsonFormatSetting.h.orig @@ -0,0 +1,35 @@ +// +// ESJsonFormatSetting.h +// ESJsonFormat +// +// Created by 尹桥印 on 15/7/19. +// Copyright (c) 2015年 EnjoySR. All rights reserved. +// + +#import +<<<<<<< HEAD +typedef NS_ENUM(NSUInteger , ImpOjbClassInArrayType) { + ImpOjbClassInArrayType_None, + ImpOjbClassInArrayType_YYModel, + ImpOjbClassInArrayType_MJExtension + +}; +======= + +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +@interface ESJsonFormatSetting : NSObject + ++ (ESJsonFormatSetting *)defaultSetting; + +@property BOOL useGeneric; +<<<<<<< HEAD +//@property BOOL impOjbClassInArray; +@property ImpOjbClassInArrayType impOjbClassInArray; +//@property BOOL impModelContainerPropertyGenericClass; +======= +@property BOOL impOjbClassInArray; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +@property BOOL outputToFiles; +@property BOOL uppercaseKeyWordForId; + +@end diff --git a/ESJsonFormat/Setting/ESJsonFormatSetting.m.orig b/ESJsonFormat/Setting/ESJsonFormatSetting.m.orig new file mode 100644 index 0000000..1be0c0b --- /dev/null +++ b/ESJsonFormat/Setting/ESJsonFormatSetting.m.orig @@ -0,0 +1,109 @@ +// +// ESJsonFormatSetting.m +// ESJsonFormat +// +// Created by 尹桥印 on 15/7/19. +// Copyright (c) 2015年 EnjoySR. All rights reserved. +// + +#import "ESJsonFormatSetting.h" + + +<<<<<<< HEAD + +NSString *const kESJsonFormatGeneric = @"com.EnjoySR.ESJsonFormat.Generic"; +NSString *const kESJsonFormatOutputToFiles = @"com.EnjoySR.ESJsonFormat.OutputToFiles"; +//NSString *const kESJsonFormatImpModelContainerPropertyGenericClass = @"com.EnjoySR.ESJsonFormat.ImpModelContainerPropertyGenericClass"; +======= +NSString *const kESJsonFormatGeneric = @"com.EnjoySR.ESJsonFormat.Generic"; +NSString *const kESJsonFormatOutputToFiles = @"com.EnjoySR.ESJsonFormat.OutputToFiles"; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +NSString *const kESJsonFormatImpObjClassInArray = @"com.EnjoySR.ESJsonFormat.ImpObjClassInArray"; +NSString *const kESJsonFormatUppercaseKeyWordForId = @"com.EnjoySR.ESJsonFormat.UppercaseKeyWordForId"; + +@implementation ESJsonFormatSetting + ++ (ESJsonFormatSetting *)defaultSetting +{ + static dispatch_once_t once; + static ESJsonFormatSetting *defaultSetting; + dispatch_once(&once, ^ { + defaultSetting = [[ESJsonFormatSetting alloc] init]; + NSDictionary *defaults = @{kESJsonFormatGeneric: @YES, + kESJsonFormatOutputToFiles: @NO, +<<<<<<< HEAD + kESJsonFormatImpObjClassInArray:[NSNumber numberWithUnsignedInt:ImpOjbClassInArrayType_MJExtension],//@YES, +======= + kESJsonFormatImpObjClassInArray: @YES, +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + kESJsonFormatUppercaseKeyWordForId: @NO}; + [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; + }); + return defaultSetting; +} + +- (void)setUseGeneric:(BOOL)useGeneric{ + [[NSUserDefaults standardUserDefaults] setBool:useGeneric forKey:kESJsonFormatGeneric]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +- (BOOL)useGeneric{ + return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatGeneric]; +} + +<<<<<<< HEAD +//- (void)setImpModelContainerPropertyGenericClass:(BOOL)impModelContainerPropertyGenericClass{ +// [[NSUserDefaults standardUserDefaults] setBool:impModelContainerPropertyGenericClass forKey:kESJsonFormatImpModelContainerPropertyGenericClass]; +// [[NSUserDefaults standardUserDefaults] synchronize]; +//} +// +//- (BOOL)impModelContainerPropertyGenericClass{ +// return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatImpModelContainerPropertyGenericClass]; +//} + +//- (void)setImpOjbClassInArray:(BOOL)impOjbClassInArray{ +// [[NSUserDefaults standardUserDefaults] setBool:impOjbClassInArray forKey:kESJsonFormatImpObjClassInArray]; +// [[NSUserDefaults standardUserDefaults] synchronize]; +//} +// +//- (BOOL)impOjbClassInArray{ +// return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatImpObjClassInArray]; +//} + +- (void)setImpOjbClassInArray:(ImpOjbClassInArrayType)impOjbClassInArray{ + [[NSUserDefaults standardUserDefaults] setInteger:impOjbClassInArray forKey:kESJsonFormatImpObjClassInArray]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +- (ImpOjbClassInArrayType)impOjbClassInArray{ + return [[NSUserDefaults standardUserDefaults] integerForKey:kESJsonFormatImpObjClassInArray]; +======= +- (void)setImpOjbClassInArray:(BOOL)impOjbClassInArray{ + [[NSUserDefaults standardUserDefaults] setBool:impOjbClassInArray forKey:kESJsonFormatImpObjClassInArray]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +- (BOOL)impOjbClassInArray{ + return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatImpObjClassInArray]; +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +} + +- (void)setOutputToFiles:(BOOL)outputToFiles{ + [[NSUserDefaults standardUserDefaults] setBool:outputToFiles forKey:kESJsonFormatOutputToFiles]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +- (BOOL)outputToFiles{ + return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatOutputToFiles]; +} + +- (void)setUppercaseKeyWordForId:(BOOL)uppercaseKeyWordForId{ + [[NSUserDefaults standardUserDefaults] setBool:uppercaseKeyWordForId forKey:kESJsonFormatUppercaseKeyWordForId]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +- (BOOL)uppercaseKeyWordForId{ + return [[NSUserDefaults standardUserDefaults] boolForKey:kESJsonFormatUppercaseKeyWordForId]; +} + +@end diff --git a/README.md.orig b/README.md.orig new file mode 100644 index 0000000..83e6c6a --- /dev/null +++ b/README.md.orig @@ -0,0 +1,159 @@ +<<<<<<< HEAD +## 新增功能------------------------------------------------------- + +### 添加 8.1 8.2(8.2.1)的支持,需要自签名 Xcode + +### 添加 YYModel 支持,不影响 MJExtension 支持 +![image](https://cloud.githubusercontent.com/assets/13959880/22986169/a6647b9e-f3e5-11e6-90fc-71eceb861211.png) +## 以下为EnjoySR 原作的介绍---------------------------------------- + +======= +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +### ESJsonFormat-Xcode +将JSON格式化输出为模型的属性    个人活动范围>[Weibo-EnjoySR](http://weibo.com/EnjoySR) + +**写在之前的注意** +> * **JSON中的key对应的value为Null的话会格式化成NSString类型** +> * **格式化之前光标放在你需要添加属性的地方** +> * **如果不输出到文件,RootClass需要自己手动创建,插件只负责RootClass里面的属性生成** +> * **生成的 MJExtension 框架中objectClassInArray方法(类方法)** +<<<<<<< HEAD + + +####怎么安装: +======= +> * **Xcode 8及之后使用插件见:[http://www.cocoachina.com/ios/20161207/18313.html](http://www.cocoachina.com/ios/20161207/18313.html)** + + +#### 怎么安装: +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + +方式1:下载-Xcode打开-Command+B-重启Xcode + +方式2:通过[Alcatraz](http://alcatraz.io/)安装,搜索 `ESJsonFormat` + +方式3:下载-解压plugin文件夹中zip到`~/Library/Application Support/Developer/Shared/Xcode/Plug-ins`-重启Xcode + + +<<<<<<< HEAD +####怎么使用: +======= +#### 怎么使用: +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + +Window-ESJsonFormat-输入Json-Enter **OR** 快捷键(Control+Shift+J)-输入JSON-Enter + +![Screenshot](https://github.com/EnjoySR/ESJsonFormat-Xcode/blob/master/ScreenShot/ScreenShot1.png) + +关于设置: + +![Screenshot](https://raw.githubusercontent.com/EnjoySR/ESJsonFormat-Xcode/master/ScreenShot/Setting.png) + +打开方式:Xcode菜单-Window-ESJsonFormat-Setting + +* 1)是否生成的 MJExtension 框架中objectClassInArray方法(类方法,默认勾选) +* 2)是否格式化输出泛型(Xcode 7 及之后才有效,默认勾选) +* 3)是否输出到文件(如果勾选,不用自己新建 RootClass。默认`不勾选`) +* 4)key为id关键字的话是否大写(默认`不勾选`) +* 注:输出到文件的内容还需要添加什么的可以联系我,人个认为不用像 JSON Accelerator 一样生成字典转模型的方法以及@synthesize修饰符,建议使用-> [MJExtension](https://github.com/CoderMJLee/MJExtension),保型模型清爽干净。 + + +<<<<<<< HEAD +####功能说明: +======= +#### 功能说明: +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +> -0.1 + +* 通过JSON字符串生成对应属性 +* 通过文件写入的方式生成到.m文件 +* 支持输入嵌套模型名称 + +> -0.2 + +* 支持Swift +* 修复JSON的value的值为Null的时候多出来的空行 +* 修复BOOL类型值格式化失效问题 + +> -0.3 + +* 支持生成MJExtension框架中objectClassInArray方法 +* 修复数组嵌套多级,里面子数组不能格式化的Bug + +> -0.4 + +* 支持格式输出到文件 +* 支持格式输出泛型(Xcode 7及之后) + +<<<<<<< HEAD +####Alcatraz +======= +> -0.5 + +* 支持更新 Xcode 9 + +#### Alcatraz +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +* 支持 [Alcatraz](http://alcatraz.io/) ,请搜索 `ESJsonFormat` + +![Screenshot](https://raw.githubusercontent.com/EnjoySR/ESJsonFormat-Xcode/master/ScreenShot/ScreenShot4.jpeg) + +<<<<<<< HEAD +####效果: +======= +#### 效果: +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 +简单模型 + +![Screenshot](https://raw.githubusercontent.com/EnjoySR/ESJsonFormat-Xcode/master/ScreenShot/ScreenShot3.gif) + +复杂模型 + +![Screenshot](https://raw.githubusercontent.com/EnjoySR/ESJsonFormat-Xcode/master/ScreenShot/ScreenShot2.gif) + +图中的JSON格式 +~~~ +{ + "name": "王五", + "gender": "man", + "age": 15, + "height": "140cm" +} +~~~ + +~~~ +{ + "name": "王五", + "gender": "man", + "age": 15, + "height": "140cm", + "addr": { + "province": "fujian", + "city": "quanzhou", + "code": "300000" + }, + "hobby": [ + { + "name": "billiards", + "code": "1" + }, + { + "name": "computerGame", + "code": "2" + } + ] +} +~~~ + +<<<<<<< HEAD +####其他: +======= +#### 其他: +>>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 + +* 如在使用过程中需要到问题,请你Issues我。 +* 有什么好的想法也可以Issues我。 +* 如果你半夜睡不着觉也可以Issues我。 + + +Thanks:[GsonFormat](https://github.com/zzz40500/GsonFormat)、[VVDocumenter-Xcode](https://github.com/onevcat/VVDocumenter-Xcode)、[MJExtension](https://github.com/CoderMJLee/MJExtension) From 90203e0b955f506a41978fd40d069ac1cc8330d4 Mon Sep 17 00:00:00 2001 From: TanPeng Date: Mon, 11 Sep 2017 01:52:41 +0800 Subject: [PATCH 09/10] update readme --- .DS_Store | Bin 6148 -> 6148 bytes .gitignore.orig | 30 --------- README.md | 2 +- README.md.orig | 159 ------------------------------------------------ 4 files changed, 1 insertion(+), 190 deletions(-) delete mode 100644 .gitignore.orig delete mode 100644 README.md.orig diff --git a/.DS_Store b/.DS_Store index 56bd4cb9375abcde0724bbcd464ef913a7fe1910..e021f6e7d6019e606b2ad6e7b4e1efb9754ac6ad 100644 GIT binary patch delta 138 zcmZoMXfc@J&&aVcU^gQp$7CKRX>lF~SB78)FNR`eJLpnnyLta^MQC?1dUOG^m5s0~fCME;T dNd>|@AUgwSYRSfk&5WBJn6EHxX6N|J4*)sxBC7xZ delta 60 zcmZoMXfc@J&&awlU^gQp>tr4#>B;^~)=Z5`lY5w~nKc4~C!b=n1=C#24vZT%Ph>7* Nnb?rGnVsV=KL7-i5yk)j diff --git a/.gitignore.orig b/.gitignore.orig deleted file mode 100644 index a90f7d6..0000000 --- a/.gitignore.orig +++ /dev/null @@ -1,30 +0,0 @@ -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -<<<<<<< HEAD -.DS_Store -======= - ->>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control -# -#Pods/ diff --git a/README.md b/README.md index a2f775f..dd27a59 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## 新增功能------------------------------------------------------- -### 添加 8.1 8.2(8.2.1)的支持,需要自签名 Xcode +### Xcode9-beta 以前的应该都支持(但需要先自签名 Xcode) ### 添加 YYModel 支持,不影响 MJExtension 支持 ![image](https://cloud.githubusercontent.com/assets/13959880/22986169/a6647b9e-f3e5-11e6-90fc-71eceb861211.png) diff --git a/README.md.orig b/README.md.orig deleted file mode 100644 index 83e6c6a..0000000 --- a/README.md.orig +++ /dev/null @@ -1,159 +0,0 @@ -<<<<<<< HEAD -## 新增功能------------------------------------------------------- - -### 添加 8.1 8.2(8.2.1)的支持,需要自签名 Xcode - -### 添加 YYModel 支持,不影响 MJExtension 支持 -![image](https://cloud.githubusercontent.com/assets/13959880/22986169/a6647b9e-f3e5-11e6-90fc-71eceb861211.png) -## 以下为EnjoySR 原作的介绍---------------------------------------- - -======= ->>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 -### ESJsonFormat-Xcode -将JSON格式化输出为模型的属性    个人活动范围>[Weibo-EnjoySR](http://weibo.com/EnjoySR) - -**写在之前的注意** -> * **JSON中的key对应的value为Null的话会格式化成NSString类型** -> * **格式化之前光标放在你需要添加属性的地方** -> * **如果不输出到文件,RootClass需要自己手动创建,插件只负责RootClass里面的属性生成** -> * **生成的 MJExtension 框架中objectClassInArray方法(类方法)** -<<<<<<< HEAD - - -####怎么安装: -======= -> * **Xcode 8及之后使用插件见:[http://www.cocoachina.com/ios/20161207/18313.html](http://www.cocoachina.com/ios/20161207/18313.html)** - - -#### 怎么安装: ->>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 - -方式1:下载-Xcode打开-Command+B-重启Xcode - -方式2:通过[Alcatraz](http://alcatraz.io/)安装,搜索 `ESJsonFormat` - -方式3:下载-解压plugin文件夹中zip到`~/Library/Application Support/Developer/Shared/Xcode/Plug-ins`-重启Xcode - - -<<<<<<< HEAD -####怎么使用: -======= -#### 怎么使用: ->>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 - -Window-ESJsonFormat-输入Json-Enter **OR** 快捷键(Control+Shift+J)-输入JSON-Enter - -![Screenshot](https://github.com/EnjoySR/ESJsonFormat-Xcode/blob/master/ScreenShot/ScreenShot1.png) - -关于设置: - -![Screenshot](https://raw.githubusercontent.com/EnjoySR/ESJsonFormat-Xcode/master/ScreenShot/Setting.png) - -打开方式:Xcode菜单-Window-ESJsonFormat-Setting - -* 1)是否生成的 MJExtension 框架中objectClassInArray方法(类方法,默认勾选) -* 2)是否格式化输出泛型(Xcode 7 及之后才有效,默认勾选) -* 3)是否输出到文件(如果勾选,不用自己新建 RootClass。默认`不勾选`) -* 4)key为id关键字的话是否大写(默认`不勾选`) -* 注:输出到文件的内容还需要添加什么的可以联系我,人个认为不用像 JSON Accelerator 一样生成字典转模型的方法以及@synthesize修饰符,建议使用-> [MJExtension](https://github.com/CoderMJLee/MJExtension),保型模型清爽干净。 - - -<<<<<<< HEAD -####功能说明: -======= -#### 功能说明: ->>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 -> -0.1 - -* 通过JSON字符串生成对应属性 -* 通过文件写入的方式生成到.m文件 -* 支持输入嵌套模型名称 - -> -0.2 - -* 支持Swift -* 修复JSON的value的值为Null的时候多出来的空行 -* 修复BOOL类型值格式化失效问题 - -> -0.3 - -* 支持生成MJExtension框架中objectClassInArray方法 -* 修复数组嵌套多级,里面子数组不能格式化的Bug - -> -0.4 - -* 支持格式输出到文件 -* 支持格式输出泛型(Xcode 7及之后) - -<<<<<<< HEAD -####Alcatraz -======= -> -0.5 - -* 支持更新 Xcode 9 - -#### Alcatraz ->>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 -* 支持 [Alcatraz](http://alcatraz.io/) ,请搜索 `ESJsonFormat` - -![Screenshot](https://raw.githubusercontent.com/EnjoySR/ESJsonFormat-Xcode/master/ScreenShot/ScreenShot4.jpeg) - -<<<<<<< HEAD -####效果: -======= -#### 效果: ->>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 -简单模型 - -![Screenshot](https://raw.githubusercontent.com/EnjoySR/ESJsonFormat-Xcode/master/ScreenShot/ScreenShot3.gif) - -复杂模型 - -![Screenshot](https://raw.githubusercontent.com/EnjoySR/ESJsonFormat-Xcode/master/ScreenShot/ScreenShot2.gif) - -图中的JSON格式 -~~~ -{ - "name": "王五", - "gender": "man", - "age": 15, - "height": "140cm" -} -~~~ - -~~~ -{ - "name": "王五", - "gender": "man", - "age": 15, - "height": "140cm", - "addr": { - "province": "fujian", - "city": "quanzhou", - "code": "300000" - }, - "hobby": [ - { - "name": "billiards", - "code": "1" - }, - { - "name": "computerGame", - "code": "2" - } - ] -} -~~~ - -<<<<<<< HEAD -####其他: -======= -#### 其他: ->>>>>>> 761e20d0334233346748565e58affb4ab5b04c23 - -* 如在使用过程中需要到问题,请你Issues我。 -* 有什么好的想法也可以Issues我。 -* 如果你半夜睡不着觉也可以Issues我。 - - -Thanks:[GsonFormat](https://github.com/zzz40500/GsonFormat)、[VVDocumenter-Xcode](https://github.com/onevcat/VVDocumenter-Xcode)、[MJExtension](https://github.com/CoderMJLee/MJExtension) From 2ebc75324c51b432b66f98fefc218115a014036e Mon Sep 17 00:00:00 2001 From: tanpengsccd Date: Wed, 23 Oct 2019 21:40:24 +0800 Subject: [PATCH 10/10] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index dd27a59..1b2fd35 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +## 不再使用OC了,如果对swift 感兴趣可以看看自己开源的Xcode插件 https://github.com/tanpengsccd/TPJSONFormatter ## 新增功能------------------------------------------------------- ### Xcode9-beta 以前的应该都支持(但需要先自签名 Xcode)