GONMarkupParser的使用

简介:

GONMarkupParser的使用

 

说明

这是一个写得非常好的富文本工具类,便于你进行简易的封装。本人抛砖引玉,只进行了少量的简化使用封装。

 

效果

 

源码

https://github.com/nicolasgoutaland/GONMarkupParser



//
//  NSString+MarkupParserString.h
//  RichText
//
//  Created by YouXianMing on 15/5/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface NSString (MarkupParserString)

/**
 *  添加颜色标识
 *
 *  @param mark 颜色标识
 *
 *  @return 添加好的文本
 */
- (NSString *)addColorMark:(NSString *)mark;


/**
 *  添加字体标识
 *
 *  @param name 字体名字(如果为空则为系统字体)
 *  @param size 字体大小
 *
 *  @return 添加好的文本
 */
- (NSString *)addFontMarkWithFontName:(NSString *)name
                                 size:(CGFloat)size;

/**
 *  添加链接标识
 *
 *  @param mark 链接标识
 *
 *  @return 添加好的文本
 */
- (NSString *)addLinkMark:(NSString *)mark;


/**
 *  创建富文本
 *
 *  @return 创建好的富文本
 */
- (NSAttributedString *)createAttributedString;

@end


//
//  NSString+MarkupParserString.m
//  RichText
//
//  Created by YouXianMing on 15/5/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "NSString+MarkupParserString.h"
#import "GONMarkupParser_All.h"


@implementation NSString (MarkupParserString)

- (NSString *)addColorMark:(NSString *)mark {
    
    //  <color value="red">text</>
    //  <color value="#FFEEAA">text</>
    //  <color value="myCustomRegisteredColor">text</>
    
    return [NSString stringWithFormat:@"<color value=\"%@\">%@</>", mark, self];
}

- (NSString *)addFontMarkWithFontName:(NSString *)name
                                 size:(CGFloat)size {
    
    //  Define a generic markup to configure font
    //  "size" is used to define font size
    //      If missing, current font size will be used. If not found is set, default system font size will be used
    //  "name" define a registered font name or full font name
    //      - Markup will first try to find a registeredFont with given name.
    //      - If no font found, markup will try to load a font using given name
    //  If "name" isn't set, current defined font will be used with new defined size. If no font is currently used, default system one will be used
    //
    //  If no attribute is set, current defined font will be removed (NSFontAttributeName), and default system one will be used instead
    //
    //  Examples
    //
    //  <font size="18">This text will use current font, set to 18</>
    //  <font name="Helvetica">This text will use Helvetica as font, using current font size</>
    //  <font name="Helvetica" size="18">This text will use Helvetica, set to 18</>
    
    if (name == nil) {
        return [NSString stringWithFormat:@"<font size=\"%f\">%@</>", size, self];
    } else {
        return [NSString stringWithFormat:@"<font name=\"%@\" size=\"%f\">%@</>", name, size, self];
    }
}

- (NSString *)addLinkMark:(NSString *)mark {
    
    //  To detect user touch on link :
    //  - display attributed string in a UITextView
    //  - configure UITextView selectable property to YES and isEditable to NO
    //  - set delegate
    //  - implement "textView:shouldInteractWithURL:inRange:" method
    //
    //  Examples
    //
    //  <a href="#1">Link 1</>
    //  <a href="http://www.apple.com">Link to apple.com</>
    //  <a href="myscheme://myapp">Custom link</>
    
    return [NSString stringWithFormat:@"<a href=\"%@\">%@</>", mark, self];
}

- (NSAttributedString *)createAttributedString {
    return [[GONMarkupParserManager sharedParser] attributedStringFromString:self
                                                                       error:nil];
}

@end


//
//  ViewController.m
//  RichText
//
//  Created by YouXianMing on 15/5/14.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "NSString+MarkupParserString.h"

@interface ViewController ()
@property (nonatomic, strong) UILabel  *label;
@property (nonatomic, strong) NSTimer  *timer;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建label
    self.label        = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 200, 30)];
    self.label.center = self.view.center;
    [self.view addSubview:self.label];
    
    // 定时器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1f
                                                  target:self
                                                selector:@selector(timerEvent)
                                                userInfo:nil
                                                 repeats:YES];
}

- (void)timerEvent {
    NSString *num  = [NSString stringWithFormat:@"%d", (arc4random() % 100)];
    NSString *name = [[@"YouXianMing" addFontMarkWithFontName:@"Avenir-MediumOblique" size:20] addColorMark:@"red"];
    NSString *age  = [[num addFontMarkWithFontName:@"Avenir-MediumOblique" size:30.f] addColorMark:@"gray"];
    
    // 加载富文本
    self.label.attributedText = [[NSString stringWithFormat:@" %@ %@", name, age] createAttributedString];
}

@end

细节


目录
相关文章
|
1月前
|
JSON 数据格式
LangChain-02 JsonOutputParser
LangChain-02 JsonOutputParser
25 2
|
5月前
|
JavaScript 前端开发 API
URLSearchParams
【6月更文挑战第4天】
36 1
|
Python
Python参数解析工具argparse.ArgumentParser()
Python参数解析工具argparse.ArgumentParser()
categorical_crossentropy与sparse_categorical_crossentropy的区别
categorical_crossentropy与sparse_categorical_crossentropy的区别
|
JSON 数据格式
parse 和parseObject 有什么区别
JSON.parse()返回的结果是Object对象
368 0
GuessedAtParserWarning: No parser was explicitly specified,
GuessedAtParserWarning 一、问题描述 二、错误分析 二、解决方案
420 0
GuessedAtParserWarning: No parser was explicitly specified,