怎样把SegmentFault目前的语法格式无缝转换为标准的Markdown格式

Viewed 6789

SF社区目前用的语法是基于wiki和markdown衍生的,已经不止一个人跟我提过这个东西比较诡异了,我目前想在问题数还不是那么多的时候把这个问题解决掉。也就是换成完全标准的Markdown语法。它的语法解析完全没啥问题,网上都有很成熟的解析库。

但是如何把现在的语法格式转换成标准的markdown呢?希望大家能给出完整的解决方案


就是希望能有一个php实现的class或者function,输入现在的语法文字输出Markdown格式文字

写个脚本把现有语法批量转一下不行?

我倒是觉得现在这样的语法没什么问题 ... 只有两个事情需要解决 ... 第一代码高亮的错误 ... 第二转义 ...

如果要转 ... 目前想到的问题 ... 图片和分隔线无法无缝转换 ... SF 目前的语法无法获得图片的真实地址 ... 以及 markdown 的语法无法在分隔线上写文字 ... 这个要如何处理 ..?

4 Answers

关于这个,我记得我之前有提到过一个想法,就是通过元标记来辨别,类似于 vim 的 modeline。

从某个时间点开始,旧的内容头部统一添加类似 “!!syntax:sgwiki” 这样的标记用以区别旧的 wiki 语法,新的内容默认使用 markdown 撰写。当然,也可以支持更多的轻量的语法标记,不局限于 markdown,只要头部有相应的元标记即可。比如,“!!syntax:markdown” "!!syntax:multimarkdown" 等等。

十分不建议做自动的语法转换,这就好比用 RegEx 解析 HTML 一个道理,因为你永远也不可能考虑全部的情况,而且,最好保持用户的输入 intact,只提供兼容机制。这是最简单的方案。

只要系统支持的语法,用户都可以使用,毕竟个人有不同的口味,至于具体支持哪些语法,那要看设计者的考虑。不过考虑到 markdown 已经成为事实上的程序员写作语法,这个应该成为默认,也就是说默认只提供 markdown 的编辑器。如果编辑器检测到用户选择使用其它的语法,那么自动禁用自身切换到源代码模式就可以了。个人认为,既然 markdown 了,编辑器实在是多余的,小白用户可能会用的比较多。至于说语法转换的,我只建议通过 js 版本的 sf 自己的语法到 md 的转化,用于一些旧的内容,由用户决定是否转换。

这个方法可行,但有点ugly,我们还需要维护两种markdown的语法解析,以及两套编辑器

不是,完全默认转向 markdown,编辑器也只提供 markdown。只在编辑旧的内容的时候提供旧的编辑器,如果可能,最好是 js 的转换器,由用户来决定是否转换标记语法,这样还可以保证用户自己修正一些错误。

与其做转换, 不如给每个文字条目都加一个语法属性. 老的条目默认记录为老语法, 新的条目记录为markdown. 输出页面的时候根据语法属性调用不同的解析库就好了. 当然未来也可以支持更多的语法, 但意义不大, markdown已经够大众了.

btw, 推荐用GFM https://help.github.com/articles/gith...

方案:界面上渲染出的是html,如果把现在语法渲染后得到的界面上的html转成markdown呢?然后将库洗一遍。

最终的效果是不是这样的:界面上提供一个markdown语法的editor,然后从这个新editor上线后,对于以前的数据,用户点击‘编辑’时出现的是markdown的语法格式,对于以后新添的数据,也是用markdown语法编辑。

如果是这样的话:

  • 需要把以前的数据洗库,用上面的方案是最合适的,用户感觉不到功能更改的疼痛。
  • 使用目前界面上的以前的语法渲染的html,将这些tml转化为markdown格式数据,然后用它清洗数据库里的旧数据,能保证样式不会发生多大变化。
  • 不需要再在界面上添加两套编辑器语法和转换程序。

洗库的工作量也是很大吧 , 支持 咳嗽di小鱼 , 这样最简单了 ,几步既可搞定, 功能扩展优于数据重构。

segmentfault也就几万-10万的数据吧,这还算大