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

细节


目录
相关文章
|
Java 数据库连接 Nacos
nacos常见问题之Nacos2.0.3集群模式启动报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
Element UI之el-tabs的样式修改字体颜色、下划线、选中/未选中
Element UI之el-tabs的样式修改字体颜色、下划线、选中/未选中
3337 0
|
JavaScript
Vue在Element UI下使用富文本框插件quill-editor(我个人不推荐用这个复杂的富文本插件)
Vue在Element UI下使用富文本框插件quill-editor(我个人不推荐用这个复杂的富文本插件)
|
10月前
|
NoSQL 网络协议 Java
【赵渝强老师】Redis的管道Pipeline
Redis采用客户端-服务器模型和请求/响应协议,通常一个请求包括客户端发送查询请求并等待服务端响应。为了提高性能,Redis引入了管道PipeLine技术,可以一次性发送多条命令并一次性返回结果,减少客户端与服务器间的通信次数,从而降低往返延迟。示例代码展示了普通命令和管道命令在插入1万条数据时的性能差异,后者执行时间显著缩短。视频讲解提供了更详细的解释。
290 1
|
计算机视觉 Python
ImageDraw, ImageFont
【9月更文挑战第25天】
262 3
|
开发框架 Dart 开发者
Serverpod 适合全栈 Dart 开发吗?
Serverpod 是一款适用于全栈Dart开发的框架,尤其适合熟悉Dart的开发者。它提供了Docker部署、代码自动生成、数据库连接等功能,简化了前后端开发流程。通过Serverpod,可以创建单体服务架构,但处理复杂业务时可能需要借助其他语言的丰富生态。框架包括对postgres和redis的支持,以及可视化工具Insights。开发步骤涉及安装、创建项目、启动服务和配置文件。Serverpod还允许动态生成接口和数据库代码,简化CURD操作。虽然适合简单到中等复杂度的应用,对于更复杂需求,可能需要结合其他语言或服务。
192 1
Serverpod 适合全栈 Dart 开发吗?
|
存储 安全 Java
Spring Boot读取配置文件
Spring Boot读取配置文件
|
Java Nacos 数据库
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(下)应用整合shardingsphere集成seata完整代码及订单-库存完整模拟案例
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(下)应用整合shardingsphere集成seata完整代码及订单-库存完整模拟案例
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(下)应用整合shardingsphere集成seata完整代码及订单-库存完整模拟案例
|
智能硬件
搭建Home Assistant智能家居系统 - 随时随地控制你的家庭设备「内网穿透」(三)
搭建Home Assistant智能家居系统 - 随时随地控制你的家庭设备「内网穿透」
534 0
|
存储 小程序 安全
【微信小程序】实现授权登入---超详细讲解
【微信小程序】实现授权登入---超详细讲解
1895 1