F2E的markdown支持,给个小建议

社区开发 mywaiting 发表于 2 年前最后回复来自 qq2850071112 1 年前

因为项目借鉴了F2E的一些代码,回来回馈一下F2E,感谢@guokai 同学的开源付出!谢谢!

F2E的markdown支持可以见项目根目录下面的helper.py文件中的 markdowncontent_process函数,调用上,由于使用了Jinja模板,是这样调用的{{ content_text|markdown|content_process }}

经过我的实际测试,这样是有一些问题的,首先文本经过了markdown的处理,在content_process中同样要处理github gist和youku等的链接,这样会造成链接重复被处理的现象,导致输出html结果的时候,会被重复处理链接。

插入link的实例: http://www.baidu.com
插入gist的实例: e718c8495f8589cf9a.git (随便找的代码!)
插入优酷链接的实例: (Think different)

实际测试的BUG:
1. 直接插入link是无法生成对应的<a href=""></a>的,必须用markdown的形式。真心的说,不是谁都有时间写个 http://www.baidu.com 这样的符号的。
2. F2E里面关于gist的正则需要把 /d修改为 /w
3. 插入youku的链接也需要修改一下。

鉴于以上的重复处理的BUG,建议,也是我在自己项目的实际里处理的那样,不是单独写个content_process的处理输出,而是,将各种自己的content_process处理逻辑写到markdown的插件里面去,这样最好!

用的 https://github.com/lepture/mistune 参考它的文档 http://mistune.readthedocs.org/en/latest/#developer-guide 写自己的renderer,对应的block处理中放入自己的content_process处理逻辑。这样我觉得比较优雅一点。

嗯嗯。不知道自己的建议怎么样。大家将就看看吧。

那个,老实说,其实加个可视化的markdown的编辑器,应该能解决很多问题,哈哈。

谢谢!

共收到4条回复
kqz901002 2 年前 #1

你的意思是将content_process插入markdown函数里面么?

kqz901002 2 年前 #2

我自己手写个autolink函数,参考了PB2, 然后自动插入markdown的标记,不是很优雅 你可以看看

    def autolink(self, text):
        """
        Converts any URLs in text into clickable links. Works on http://, https:// and
        www. links. Links can have trailing punctuation (periods, commas, close-parens)
        and leading punctuation (opening parens) and it'll still do the right thing.
        """
        url_tuple = (
            "v.youku.com/v_show/id_",
            "sinaimg.cn",
            "gistst.github.com",
            "zhimg")
        LEADING_PUNCTUATION = ['(', '<', '<']
        TRAILING_PUNCTUATION = ['.', ',', ')', '>', '\n', '>']
        word_split_re = re.compile(r'(\s+)')
        simple_email_re = re.compile(r'^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$')
        # text = re.sub(r'\n', r'  \n', text)
        words = word_split_re.split(text)
        punctuation_re = re.compile(
            '^(?P<lead>(?:%s)*)(?P<middle>.*?)(?P<trail>(?:%s)*)$' %
            ('|'.join([re.escape(x) for x in LEADING_PUNCTUATION]),
             '|'.join([re.escape(x) for x in TRAILING_PUNCTUATION])))
        for i, word in enumerate(words):
            match = punctuation_re.match(word)
            if match:
                lead, middle, trail = match.groups()
                if lead.startswith("<") or filter(lambda url: url in word, url_tuple):
                    pass
                elif middle.startswith('www.') or ('@' not in middle and not middle.startswith('http://') and not middle.startswith('https://') and len(middle) > 0 and middle[0] in string.letters + string.digits and (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))):
                    if re.search(ur'[\u4e00-\u9fa5]+', unicode(str(middle), "UTF-8")) is None:
                        middle = '[%s](http://%s)' % (middle, middle)
                elif middle.startswith("http://") or middle.startswith("https://"):
                    # print re.search(r'[\u4e00-\u9fa5]', middle).group(0)
                    if re.search(ur'[\u4e00-\u9fa5]+', unicode(str(middle), "UTF-8")) is None:
                        middle = '<%s>' % middle
                elif '@' in middle and not middle.startswith('www.') and not ':' in middle and simple_email_re.match(middle):
                    middle = '<%s>' % middle
                elif re.match(r'/t/[0-9]+', middle) is not None:
                    middle = '[%s](%s)' % (middle, middle)
                if lead + middle + trail != word:
                    words[i] = lead + middle + trail
        return ''.join(words)
mywaiting 2 年前 #4

回来看看,好像F2E给人玩坏了~

好像是有人恶意回复,F2E的排序机制是根据回复来排序的。一个社区没有限制回复的评论和数量是不行的!

@kqz901002 嗯嗯,我的意思就是这样。将content_process放过如到markdown解析文本过程中去实现!

登录后即可参与回复