Skip to content

Commit a462cf8

Browse files
committed
md编辑优化
1 parent 46d2a63 commit a462cf8

9 files changed

Lines changed: 151 additions & 35 deletions

File tree

Coding_iOS/Controllers/EditTaskViewController.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,9 @@ - (void)goToDescriptionVC{
479479
}
480480
ESWeakSelf;
481481
TaskDescriptionViewController *vc = [[TaskDescriptionViewController alloc] init];
482+
vc.curTask = _myCopyTask;
482483
vc.markdown = _myCopyTask.task_description.markdown;
484+
483485
vc.savedNewMDBlock = ^(NSString *mdStr, NSString *mdHtmlStr){
484486
ESStrongSelf;
485487
_self.myCopyTask.has_description = [NSNumber numberWithBool:(mdStr.length > 0)];

Coding_iOS/Controllers/EditTopicViewController.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ - (void)loadEditView{
122122
[_editView addSubview:_inputTitleView];
123123

124124
_inputContentView = [[EaseMarkdownTextView alloc] initWithFrame:CGRectZero];
125+
_inputContentView.curProject = self.curProTopic.project;
125126
_inputContentView.textColor = [UIColor colorWithHexString:@"0x666666"];
126127

127128
_inputContentView.backgroundColor = [UIColor clearColor];

Coding_iOS/Controllers/TaskDescriptionViewController.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
//
88

99
#import "BaseViewController.h"
10+
#import "Tasks.h"
1011

1112
@interface TaskDescriptionViewController : BaseViewController
1213
@property (strong, nonatomic) NSString *markdown;
14+
@property (strong, nonatomic) Task *curTask;
1315
@property (copy, nonatomic) void(^savedNewMDBlock)(NSString *mdStr, NSString *mdHtmlStr);
1416

1517
@end

Coding_iOS/Controllers/TaskDescriptionViewController.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ - (void)setCurIndex:(NSInteger)curIndex{
103103
- (void)loadEditView{
104104
if (!_editView) {
105105
_editView = [[EaseMarkdownTextView alloc] initWithFrame:self.view.bounds];
106+
_editView.curProject = self.curTask.project;
106107
_editView.backgroundColor = [UIColor clearColor];
107108
_editView.textColor = [UIColor colorWithHexString:@"0x666666"];
108109
_editView.font = [UIFont systemFontOfSize:16];

Coding_iOS/Models/Task.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ typedef NS_ENUM(NSInteger, TaskHandleType) {
7979

8080
@interface Task_Description : NSObject
8181
@property (strong, nonatomic) NSString *description_mine, *markdown;
82-
@property (strong, nonatomic) HtmlMedia *htmlMedia;
8382
+ (instancetype)taskDescriptionFrom:(Task_Description *)oldDes;
8483
+ (instancetype)defaultDescription;
8584
- (BOOL)isSameTo:(Task_Description *)td;

Coding_iOS/Models/Task.m

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -272,21 +272,13 @@ - (instancetype)init
272272
return self;
273273
}
274274

275-
- (void)setDescription_mine:(NSString *)description_mine{
276-
if (_description_mine != description_mine) {
277-
_htmlMedia = [HtmlMedia htmlMediaWithString:description_mine showType:MediaShowTypeImageAndMonkey];
278-
_description_mine = _htmlMedia.contentDisplay;
279-
}
280-
}
281-
282275
+ (instancetype)taskDescriptionFrom:(Task_Description *)oldDes{
283276
if (!oldDes) {
284277
return nil;
285278
}
286279
Task_Description *des = [[Task_Description alloc] init];
287280
des.markdown = oldDes.markdown;
288281
des.description_mine = oldDes.description_mine;
289-
des.htmlMedia = oldDes.htmlMedia;
290282
return des;
291283
}
292284
+ (instancetype)defaultDescription{

Coding_iOS/Vendor/RFKeyboardToolbar/RFToolbarButton.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ - (id)initWithTitle:(NSString *)title {
4141

4242
- (id)init {
4343
CGSize sizeOfText = [self.title sizeWithAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:14.f]}];
44+
sizeOfText.width = MAX(sizeOfText.width, 20);
4445

4546
if (self = [super initWithFrame:CGRectMake(0, 0, sizeOfText.width + 18.104, sizeOfText.height + 10.298)]) {
4647
self.backgroundColor = [UIColor colorWithWhite:0.902 alpha:1.0];

Coding_iOS/Views/EaseMarkdownTextView.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#import <UIKit/UIKit.h>
1010
#import "UIPlaceHolderTextView.h"
11-
@interface EaseMarkdownTextView : UIPlaceHolderTextView
11+
#import "Projects.h"
1212

13+
@interface EaseMarkdownTextView : UIPlaceHolderTextView
14+
@property (strong, nonatomic) Project *curProject;
1315
@end

Coding_iOS/Views/EaseMarkdownTextView.m

Lines changed: 141 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
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

Comments
 (0)