以前写了一个沸点说被排了一个任务写一个Markdown解析器,如今分享一下全程的思路好了。git
Github传送门 |
---|
先来看一张图片,清醒一下咱们的脑瓜子好了github
里面有不少要实现的功能,固然我尚未实现出来。毕竟我周一至周三一直在上课,如今才抽出空来写代码了。先进行一个语法划分,在图中我也已经写到了。可是一样注意,并无表格的显示,确实尚未思路。bash
要用什么样的方式去进行一个Markdown解析的实现呢?markdown
这是一个很是值得思考的问题了,我看了很多的源码,给出的方案都是基本统一 —— HTML
。但显然对Android而言不是一个很是好的方案了,因此纵观一下整个Android中的各个方案,好比说TextView
复合,确实可以实现,可是从一个性能角度上来讲,若是一个标题一个TextView
,一个正文又是TextView
。那么以下所示的Markdown
文本他有多少个TextView进行复合呢?post
# 大标题
## 中标题
### 小标题
这是一个测试案例
复制代码
显然是4个没跑了,可是咱们能不能简化呢?性能
上面咱们说了HTML
,显然这是一个解决方案,可是没有其余的方案了吗?显然是有的,Android
内部其余提供了一个叫作Spannable
的玩意儿,能够高效的实现一个不一样样式文本的拼接,但一样的有一点很不幸,这玩意儿没有这么好用其实。看了网上不少不少的教程,为了学习而学习,而不是为了实战而学习的文章大有所在,为何这么说呢?学习
其实你去进行尝试就会发现,若是你复用一样的Span
,前者就会失效;或者说你下标没有把控会直接影响到后续的Span
,可是这在别人的教程却彻底没有说起到,固然我还在试错的阶段,还有什么问题欢迎反馈。测试
在Markdown
解析器进行分析的时候,咱们应该对整个的文本作一个了解,就拿掘金的Markdown
解析器来讲好了。何时会成为一行,和简书的Markdown
语法器存在一点不同的地方,若是说你要完成一个正文的分行,你须要两个回车,而简书只须要一个,其余的二者基本保持一致。spa
为了方便起见,咱们按照简书的方案来好了。下面为各位罗列一下总体的思路是怎么样的:3d
怎么样去组合这些解析的数据。很简单的方案就是经过两个链表的组合来完成,一个用于存储数据,一个用于存储数据类型。
经过上述的思路,咱们先可以对Markdown
语法作一个总体的分析。下面给出一个分析以后的结果
HTML
的标签,主要是由于还没想出行内的格式转化应该怎么样去作,如今主要是为了一个效果,后期会进行更正。
先看看咱们会出现的Bug
标题1
和
标题2
的样式并不相同,那让咱们看看测试
Markdown
文件。
# 标题1
# 标题2
## 人员
### 人员
############# 人员
文字`123`11**11*
> 123
> 123
1. 2
2. 4
+ 2
复制代码
由于代码块还没作就先不放了。
你能明显的看到标题1
和标题2
经过Markdown
语法显示出来的照理应该说是<h1>
标签这样的形式,可是实际效果确实咱们也看到了不一样,这就是Spannable
他的一个Bug
,固然解决方案也是有的。就是从新定义长度,你的Start
要向前延伸。最方便的方案就是使用一个栈来保存了。
而后经过入栈的数量,判断以前的重复数量有多少个,就能够从新定义长度了。
最后还有一个问题就是,关于连接点击的问题,这是统一的问题,为了解决Google
早就已经给出了方案。
text.movementMethod = LinkMovementMethod.getInstance()
复制代码
项目持续更新,但愿一样可以获得你的Star。
以上就是个人学习成果,若是有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。
相关文章推荐: