2017-01-30 49 views
0

我刚刚在我的Django 1.10.4应用程序中安装了precise_bbcode 1.2.6。Django precise_bbcode没有正确解析[code]标签的内容?

当我提供的字符串:

>>> s = """ 
    [code] 
    for i in var: 
     print(var[i]) 
    [/code] 
    """ 

输出仅仅是纯文本:

对于i在VAR: 打印(VAR [I])

然而如果我将[i]更改为[i2],它可以正常工作,并按预期格式化文本。

我在猜测,exact_bbcode认为[i]与斜体文本有关(即使它被[code]标签包围,[i]没有关联的结束标签)。这种行为也存在[b]和可能的任何其他公认的标签

然后我试着设置选项render_embedded = False,但我仍然得到相同的行为。

然后我试图使我自己的“代码”标签:

from pygments import highlight 
from pygments.lexers import PythonLexer 
from pygments.formatters import HtmlFormatter 

class PygmentsBBCodeTag(BBCodeTag): 
    name = 'code' 

    class Options: 
     strip = False 
     replace_links = False 
     render_embedded = False 
     transform_newlines = False 
     escape_html = False 

    def render(self, value, option=None, parent=None): 
     print(value) 
     return highlight(value, PythonLexer(), HtmlFormatter()) 

tag_pool.register_tag(PygmentsBBCodeTag) 

,得到了相同的结果。

陌生人仍然在我的PygmentsBBCodeTag类每当[i]存在我注意到它从来没有被调用(因为值不打印)。

有没有什么办法告诉precise_bbcode将[code]标签之间的内容纯粹看作是一个字符串,并忽略除了关闭[/code]标签之外的任何内容?

感谢

+1

你应该把它作为一个bug报告给开发者。 –

+0

我看到作者是摩根奥贝尔 - https://github.com/ellmetha我应该联系他吗?还是有更好的地方? – Logic1

回答

0

我想出了,只需要在bbcode/parser.py两行要添加一个解决方案。

注意这个工作对我的申请,并根据我的测试此 变化没有产生有害的副作用。我无法保证 这是最好的解决方案,我鼓励您在进行此编辑后全面测试您的应用程序 。但是,如果我在将来发现任何不合需要的行为,我会尽力在此处发布详细信息。


的过程:

找到名为.../dist-packages/precise_bbcode/bbcode/parser.py

然后导航到line 242文件,使这个编辑:

来源:

if previous_tag_options.end_tag_closes: 
    opening_tags.pop() 

收件人:

if not tag_options.render_embedded: 
    opening_tags = []  
elif previous_tag_options.end_tag_closes: 
    opening_tags.pop() 

这是唯一的变化。

完成此操作后,对于任何标签render_embedded = False当在封闭文本中识别出类似于bbcode标签的东西时,它不再显示中断。现在将整个字符串传递给语法突出显示器进行格式化。