diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..e021f6e Binary files /dev/null and b/.DS_Store differ 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 b/ESJsonFormat/Controller/ESSettingController.m index e91e7a0..ff1a0a4 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 { @@ -49,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.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 b/ESJsonFormat/Controller/ESSettingController.xib index 8a380ef..6ad23f3 100644 --- a/ESJsonFormat/Controller/ESSettingController.xib +++ b/ESJsonFormat/Controller/ESSettingController.xib @@ -1,13 +1,15 @@ - - + + - + + + @@ -17,14 +19,14 @@ - - + + - + - + - + - + @@ -69,7 +71,7 @@ + + + + + + + + + + + + + + + + + - + + + + - + 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 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.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 b/ESJsonFormat/ESJsonFormatManager.m index c4085d5..96c2ad4 100644 --- a/ESJsonFormat/ESJsonFormatManager.m +++ b/ESJsonFormat/ESJsonFormatManager.m @@ -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/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 b/ESJsonFormat/Info.plist index 792e11d..cec5c1e 100644 --- a/ESJsonFormat/Info.plist +++ b/ESJsonFormat/Info.plist @@ -38,6 +38,8 @@ 7265231C-39B4-402C-89E1-16167C4CC990 ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C DFFB3951-EB0A-4C09-9DAC-5F2D28CC839C + DA4FDFD8-C509-4D8B-8B55-84A7B66AE701 + E0A62D1F-3C18-4D74-BFE5-A4167D643966 CA351AD8-3176-41CB-875C-42A05C7CDEC7 LSMinimumSystemVersion 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 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.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 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{ 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 b/README.md index fad38f6..1b2fd35 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ +## 不再使用OC了,如果对swift 感兴趣可以看看自己开源的Xcode插件 https://github.com/tanpengsccd/TPJSONFormatter +## 新增功能------------------------------------------------------- + +### Xcode9-beta 以前的应该都支持(但需要先自签名 Xcode) + +### 添加 YYModel 支持,不影响 MJExtension 支持 +![image](https://cloud.githubusercontent.com/assets/13959880/22986169/a6647b9e-f3e5-11e6-90fc-71eceb861211.png) +## 以下为EnjoySR 原作的介绍---------------------------------------- + ### ESJsonFormat-Xcode 将JSON格式化输出为模型的属性    个人活动范围>[Weibo-EnjoySR](http://weibo.com/EnjoySR)