99#import " EaseMarkdownTextView.h"
1010#import " RFKeyboardToolbar.h"
1111#import " RFToolbarButton.h"
12+ #import < RegexKitLite/RegexKitLite.h>
13+
14+ // at某人的功能
15+ #import " UsersViewController.h"
16+ #import " ProjectMemberListViewController.h"
17+ #import " Users.h"
18+ #import " Login.h"
1219
1320
1421@implementation EaseMarkdownTextView
@@ -20,46 +27,69 @@ - (id)initWithFrame:(CGRect)frame {
2027}
2128
2229- (NSArray *)buttons {
23- return @[[self createButtonWithTitle: @" #" andEventHandler: ^{ [self insertText: @" #" ]; }],
30+ return @[
31+ [self createButtonWithTitle: @" @" andEventHandler: ^{ [self doAT ]; }],
32+
33+ [self createButtonWithTitle: @" #" andEventHandler: ^{ [self insertText: @" #" ]; }],
2434 [self createButtonWithTitle: @" *" andEventHandler: ^{ [self insertText: @" *" ]; }],
25- [self createButtonWithTitle: @" _" andEventHandler: ^{ [self insertText: @" _" ]; }],
2635 [self createButtonWithTitle: @" `" andEventHandler: ^{ [self insertText: @" `" ]; }],
27- [self createButtonWithTitle: @" @" andEventHandler: ^{ [self insertText: @" @" ]; }],
36+ [self createButtonWithTitle: @" -" andEventHandler: ^{ [self insertText: @" -" ]; }],
37+
38+
39+
40+ [self createButtonWithTitle: @" 标题" andEventHandler: ^{ [self doTitle ]; }],
41+ [self createButtonWithTitle: @" 粗体" andEventHandler: ^{ [self doBold ]; }],
42+ [self createButtonWithTitle: @" 斜体" andEventHandler: ^{ [self doItalic ]; }],
43+ [self createButtonWithTitle: @" 代码" andEventHandler: ^{ [self doCode ]; }],
44+ [self createButtonWithTitle: @" 引用" andEventHandler: ^{ [self doQuote ]; }],
45+ [self createButtonWithTitle: @" 列表" andEventHandler: ^{ [self doList ]; }],
46+
2847 [self createButtonWithTitle: @" 链接" andEventHandler: ^{
48+ NSString *tipStr = @" 在此输入链接描述" ;
2949 NSRange selectionRange = self.selectedRange ;
3050 selectionRange.location += 1 ;
31- [self insertText: @" []()" ];
32- [self setSelectionRange: selectionRange];
33-
34- }],
35- [self createButtonWithTitle: @" 代码" andEventHandler: ^{
36- NSRange selectionRange = self.selectedRange ;
37- selectionRange.location += self.text .length == 0 ? 3 : 4 ;
38-
39- [self insertText: self .text.length == 0 ? @" ```\n ```" : @" \n ```\n ```" ];
51+ selectionRange.length = tipStr.length ;
52+
53+ [self insertText: [NSString stringWithFormat: @" [%@ ]()" , tipStr]];
4054 [self setSelectionRange: selectionRange];
4155 }],
56+
4257 [self createButtonWithTitle: @" 图片链接" andEventHandler: ^{
58+ NSString *tipStr = @" 在此输入图片描述" ;
4359 NSRange selectionRange = self.selectedRange ;
4460 selectionRange.location += 2 ;
45-
46- [self insertText: @" ![]()" ];
47- [self setSelectionRange: self .selectedRange];
48- }],
49- [self createButtonWithTitle: @" 任务" andEventHandler: ^{
50- NSRange selectionRange = self.selectedRange ;
51- selectionRange.location += 7 ;
52-
53- [self insertText: self .text.length == 0 ? @" - [ ] " : @" \n - [ ] " ];
61+ selectionRange.length = tipStr.length ;
62+
63+ [self insertText: [NSString stringWithFormat: @" ![%@ ]()" , tipStr]];
5464 [self setSelectionRange: selectionRange];
5565 }],
56- [self createButtonWithTitle: @" 引用" andEventHandler: ^{
66+
67+ [self createButtonWithTitle: @" 分割线" andEventHandler: ^{
5768 NSRange selectionRange = self.selectedRange ;
58- selectionRange.location += 3 ;
69+ NSString *insertStr = [self needPreNewLine ]? @" \n\n ------\n " : @" \n ------\n " ;
70+
71+ selectionRange.location += insertStr.length ;
72+ selectionRange.length = 0 ;
5973
60- [self insertText: self .text.length == 0 ? @" > " : @" \n > " ];
74+ [self insertText: insertStr ];
6175 [self setSelectionRange: selectionRange];
62- }]];
76+ }],
77+
78+ [self createButtonWithTitle: @" _" andEventHandler: ^{ [self insertText: @" _" ]; }],
79+ [self createButtonWithTitle: @" +" andEventHandler: ^{ [self insertText: @" +" ]; }],
80+ [self createButtonWithTitle: @" ~" andEventHandler: ^{ [self insertText: @" ~" ]; }],
81+ [self createButtonWithTitle: @" =" andEventHandler: ^{ [self insertText: @" =" ]; }],
82+ [self createButtonWithTitle: @" [" andEventHandler: ^{ [self insertText: @" [" ]; }],
83+ [self createButtonWithTitle: @" ]" andEventHandler: ^{ [self insertText: @" ]" ]; }],
84+ [self createButtonWithTitle: @" <" andEventHandler: ^{ [self insertText: @" <" ]; }],
85+ [self createButtonWithTitle: @" >" andEventHandler: ^{ [self insertText: @" >" ]; }]
86+ ];
87+ }
88+
89+ - (BOOL )needPreNewLine {
90+ NSString *preStr = [self .text substringToIndex: self .selectedRange.location];
91+ return !(preStr.length == 0
92+ || [preStr isMatchedByRegex: @" [\\ n\\ r]+[\\ t\\ f]*$" ]);
6393}
6494
6595- (RFToolbarButton *)createButtonWithTitle : (NSString *)title andEventHandler : (void (^)())handler {
@@ -73,4 +103,90 @@ - (void)setSelectionRange:(NSRange)range {
73103 self.selectedRange = range;
74104 self.tintColor = previousTint;
75105}
106+
107+ #pragma mark md_Method
108+ - (void )doTitle {
109+ [self doMDWithLeftStr: @" ## " rightStr: @" ##" tipStr: @" 在此输入标题" doNeedPreNewLine: YES ];
110+ }
111+
112+ - (void )doBold {
113+ [self doMDWithLeftStr: @" **" rightStr: @" **" tipStr: @" 在此输入粗体文字" doNeedPreNewLine: NO ];
114+ }
115+
116+ - (void )doItalic {
117+ [self doMDWithLeftStr: @" *" rightStr: @" *" tipStr: @" 在此输入斜体文字" doNeedPreNewLine: NO ];
118+ }
119+
120+ - (void )doCode {
121+ [self doMDWithLeftStr: @" ```\n " rightStr: @" \n ```" tipStr: @" 在此输入代码片段" doNeedPreNewLine: YES ];
122+ }
123+
124+ - (void )doQuote {
125+ [self doMDWithLeftStr: @" > " rightStr: @" " tipStr: @" 在此输入引用文字" doNeedPreNewLine: YES ];
126+ }
127+
128+ - (void )doList {
129+ [self doMDWithLeftStr: @" - " rightStr: @" " tipStr: @" 在此输入列表项" doNeedPreNewLine: YES ];
130+ }
131+
132+ - (void )doMDWithLeftStr : (NSString *)leftStr rightStr : (NSString *)rightStr tipStr : (NSString *)tipStr doNeedPreNewLine : (BOOL )doNeedPreNewLine {
133+
134+ BOOL needPreNewLine = doNeedPreNewLine? [self needPreNewLine ]: NO ;
135+
136+
137+ if (!leftStr || !rightStr || !tipStr) {
138+ return ;
139+ }
140+ NSRange selectionRange = self.selectedRange ;
141+ NSString *insertStr = [self .text substringWithRange: selectionRange];
142+
143+ if (selectionRange.length > 0 ) {// 已有选中文字
144+ // 撤销
145+ if (selectionRange.location >= leftStr.length && selectionRange.location + selectionRange.length + rightStr.length <= self.text .length ) {
146+ NSRange expandRange = NSMakeRange (selectionRange.location - leftStr.length , selectionRange.length +leftStr.length +rightStr.length );
147+ if ([self .text rangeOfString: [NSString stringWithFormat: @" %@%@%@ " , leftStr, insertStr, rightStr] options: NSLiteralSearch range: expandRange].location != NSNotFound ) {
148+ selectionRange.location -= leftStr.length ;
149+ selectionRange.length = insertStr.length ;
150+ self.text = [self .text stringByReplacingCharactersInRange: expandRange withString: insertStr];
151+ [self setSelectionRange: selectionRange];
152+ return ;
153+ }
154+ }
155+ // 添加
156+ selectionRange.location += needPreNewLine? leftStr.length +1 : leftStr.length ;
157+ insertStr = [NSString stringWithFormat: needPreNewLine? @" \n %@%@%@ " : @" %@%@%@ " , leftStr, insertStr, rightStr];
158+ }else {// 未选中任何文字
159+ // 添加
160+ selectionRange.location += needPreNewLine? leftStr.length +1 : leftStr.length ;
161+ selectionRange.length = tipStr.length ;
162+ insertStr = [NSString stringWithFormat: needPreNewLine? @" \n %@%@%@ " : @" %@%@%@ " , leftStr, tipStr, rightStr];
163+ }
164+ [self insertText: insertStr];
165+ [self setSelectionRange: selectionRange];
166+ }
167+
168+ #pragma mark AT
169+ - (void )doAT {
170+ __weak typeof (self) weakSelf = self;
171+ if (self.curProject ) {
172+ // @项目成员
173+ [ProjectMemberListViewController showATSomeoneWithBlock: ^(User *curUser) {
174+ [weakSelf atSomeUser: curUser andRange: self .selectedRange];
175+ } withProject: self .curProject];
176+ }else {
177+ // @好友
178+ [UsersViewController showATSomeoneWithBlock: ^(User *curUser) {
179+ [weakSelf atSomeUser: curUser andRange: self .selectedRange];
180+ }];
181+ }
182+ }
183+
184+ - (void )atSomeUser : (User *)curUser andRange : (NSRange )range {
185+ if (curUser) {
186+ NSString *appendingStr = [NSString stringWithFormat: @" @%@ " , curUser.name];
187+ [self insertText: appendingStr];
188+ }
189+ }
190+
191+
76192@end
0 commit comments