RxMarkdown介绍
RxMarkdown 是一个运用 RxJava API 在 android.widget.TextView
或 android.widget.EditText
中编辑和(实时)预览基本 markdown 语法的 Android 库。
传送门
传送门:RxMarkdown
为什么做
看到很多 Android 上的 markdown 的库或者 App ,基本上都是基于 WebView
的,通过 JavaScript 解析内容,加上 CSS 渲染显示在 WebView 上。我就想到如果在 Android 的TextView 上和 EditText 上渲染 markdown 的内容的话会不会很屌,就打算这么做了,做之前我就想到了做出来应该是一个很鸡肋的样子,因为很多 markdown 的语法都应该不会支持吧,但是在做的过程中真的是克服了很多问题,但是表格真是不知道该去怎么实现。
怎么做
在 Android 上实现富文本显示的话,起初想到的是将文本转成HTML,然后在 TextView 或者 EditText 中展示出来就好了,但是发现 TextView 或者 EditText 能支持的 HTML 的标签并不多,那么打算自己写一个 Html.TagHandler
处理好了,最后发现其过程麻烦了,先将 markdown 的内容转成 HTML 的,然后再转成 Android 上的富文本。那么,现在的处理是直接将 markdown 的内容转成 Android 上的富文本。
Android 的富文本是啥?就是 Spannable
,Github 上关于 Android 的 Spannable
的开源库有很多,都写的很棒,但是对于 Android 提供的那些 Span
没法满足要求,然后就只能自己搞一些 Span
来做,比如 markdown 的 todo 的那个语法等。
遇到问题
图片渲染
在图片渲染这部分,虽然提供了
ImageSpan
,但是这个类似乎好像不支持网络访问,因为数据( Drawable )是通过方法返回值返回到底层去的,所以就没法执行异步操作。在这个地方,刚好看到了 Bilibilib 开源的drawee-text-view
,就是基于 Fresco 的 Spannable TextView,读了源码之后,豁然开朗,知道了怎么搞,这个问题耶就解决了,但是在 EditText 上似乎还有写问题,当图片从网络上获取完之后,渲染之后,不会马上显示出来,只有当 EditText 上的内容有改变的时候才会显示出来。有序和无序列表
在处理这部分的逻辑的时候,脑子都要炸了,因为不仅要处理语法这部分,还要考虑上下文,也就是当为有序的时候,前面那一行如果是
3.
,那么该行无论前面是几,当渲染出来的时候都应该是4.
;不仅如此,还要考虑嵌套问题,嵌套一层的时候,应该是1.
这样的;嵌套结束之后,前面的数字应该继续是非嵌套的时候的数字 + 1。实时预览
在实时预览的时候,当某个地方发生改变的时候,需要将那部分的数据重新解析一下,这个解析数据要考虑速度和正确性。
嵌套
还是嵌套,在 『引用』和『无序列表』的时候,位置的判断稍微比较难处理;还要『居中』和『 Header 』的嵌套等等。
还用到了什么
在该库中,人生第一次用了的『责任链模式』,虽然写出来的责任链跟书上的有很大的区别,但是为了适应项目嘛,还要『工厂方法模式』、『建造者模式』
接下来做什么
- 一直在考虑有没有必要将 markdown 的文本转换成 HTML ?
- 表格该怎么处理?
- 与 WebView 的形式的对比…