RxMarkdown 是一个运用 RxJava API 在 android.widget.TextViewandroid.widget.EditText 中编辑和(实时)预览基本 markdown 语法的 Android 库。

传送门

传送门:RxMarkdown

gif

为什么做

看到很多 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 的形式的对比…