2017-01-30 51 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標籤的東西時,它不再顯示中斷。現在將整個字符串傳遞給語法突出顯示器進行格式化。