④ 四鞭 → 图片、链接
这里有个坑要注意下,笔者再这里卡了好一段时间,手滑按了tab缩进:
渲染后的代码:
这里是被当成代码块处理了,改为没缩进,或一两个空格缩进就可以了。 同样,抠出样式模板:
重写函数渲染模板:
这里也有个坑,mistune中会把每一行都当做段落,然后把在这个上面又套一层样式,所以还需要修改下段落渲染函数:
传参校验:
效果如下:
⑤ 五鞭 → 代码高亮、引用、行内代码
代码块的渲染亦称代码高亮,看了网上大部分转换工具,使用的都是使用 highlight.js,样式多多:highlightjs.org/
这里是Python,直接调js渲染有些麻烦,这里使用 pygments代码高亮库 来替换,样式及预览可到下述链接挑选:pygments.org/demo/
pip命令安装一波库:
pip install Pygaments
使用方式也很简单:
参数简述:
- noclasses=True:设置不生成css文件,即使用HTML内联样式;
- style='perldoc':设置主题;
- wrapcode=True:使用<code>包裹渲染后的代码;
复制到编辑器看下效果:
这里坑可多着呢,罗列下:
- ① 代码超过屏幕,没有显示横向滚动条,需添加 overflow-x: auto;
- ② 字体大了,设置12px为佳,要为每个span标签的style属性添加 font-size: 12px;
- ③ 如下图,代码中的部分字符串没有用span包裹,大小不一,需外层套一个span包裹;
此处使用lxml操作节点元素增删及属性修改,具体代码如下:
传参校验:
字体大小和滚动条都出来了,看似没啥问题了,但如果你点击手机上预览:
卧槽,全乱了,有些代码挤在一行上了,归根到底还是换行符\n被微信吃了呗,看了下其他工具的做法:
添加 → white-space:nowrap,指定文本不换行,直到遇到<br>为止。
所以我们需要在合适的地方插入<br>标签,就在lxml解析前加吧:
看下手机上的效果:
换行倒是换行了,就是前面的缩进没了,看了下别的工具的做法:
前面加上缩进对应数量的
所以,还需要统计每行前面的空格,补上对应数量的
看下手机上的效果:
好家伙,可以了,也算是把代码块的坑都踩完了!
然后把引用的样式也补上吧:
传参校验:
最后,把行内代码的样式也补上
传参校验:
常用结点的解析渲染就讲解到这里,然后就是全文渲染的微调了,换行,各种解析冲突处理啊,限于篇幅,就不一一讲解了,可以参考仓库中的最新代码。
0x5、传统功夫以点到为止
正文的渲染就这样,另外一般公号喜欢每一篇都加上一个特定的头部和尾部,这个简单,直接偷两个样式保存成html模板,正文渲染完后,拼接即可,写下简单示例吧:
点击预览,手机看下效果:
效果还是很赞的,踩N多坑+写文,总耗时三天,终于把这个工具的雏形做出来了;
尽管它还不完整,不是很人性化,目前只有一个主题,还有各种未知的BUG,鸡动,久违的成就感;