我刚在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]
标记之外的任何内容?
谢谢
答案 0 :(得分:0)
我提出了一个解决方案,只需要添加bbcode/parser.py
中的两行。
注意:这适用于我的应用程序并基于我的测试 改变没有产生不必要的副作用。我无法保证 这是最好的解决方案,我鼓励您测试您的应用程序 完成这个编辑之后。但是,如果我发现任何不受欢迎的 将来的行为我会尝试在此处发布详细信息。
程序:
找到文件:.../dist-packages/precise_bbcode/bbcode/parser.py
打开文件并导航至:
然后修改内容:
自:
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标记的内容时,它不再出现中断。现在传递整个字符串以通过语法高亮显示格式化。
[更新]
近一年后(升级到1.2.9版本后),原始问题仍然存在。但是我一直在使用这篇文章中说明的程序,到目前为止它仍然运作良好!