Django precise_bbcode没有正确解析[code]标签的内容?

时间:2017-01-30 07:40:09

标签: python django bbcode

我刚在Django 1.10.4应用程序中安装了precise_bbcode 1.2.6。

当我提供字符串时:

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

输出只是纯文本:

  

for var in var:         打印(VAR [I])

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

我猜think_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 个答案:

答案 0 :(得分:0)

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

  

注意这适用于我的应用程序并基于我的测试   改变没有产生不必要的副作用。我无法保证   这是最好的解决方案,我鼓励您测试您的应用程序   完成这个编辑之后。但是,如果我发现任何不受欢迎的   将来的行为我会尝试在此处发布详细信息。

程序:

  1. 找到文件:.../dist-packages/precise_bbcode/bbcode/parser.py

  2. 打开文件并导航至:

    • 对于django-precise-bbcode 1.2.6找到line #242
    • 对于django-precise-bbcode 1.2.9找到line #248
  3. 然后修改内容:

    自:

    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()
    
  4. 这是唯一需要的改变。

    执行此操作后,对于render_embedded = False的任何标记,当在所附文本中识别出类似于bbcode标记的内容时,它不再出现中断。现在传递整个字符串以通过语法高亮显示格式化。

    [更新]

    近一年后(升级到1.2.9版本后),原始问题仍然存在。但是我一直在使用这篇文章中说明的程序,到目前为止它仍然运作良好!