Python 如何避免evoque中的html转义

Python 如何避免evoque中的html转义,python,Python,我试着让我的evoque模板颜色代码有点, 但是我得到的html已经用lt gt转义了 我读到应该有一个类似“不再上课”的地方 但是我还没有找到evoque.quoted的软件包 我的目标不是让html脱离模板,而是“真实的” from pygments import highlight from pygments.lexers import get_lexer_by_name from pygments.formatters import HtmlFormatter from evoque.d

我试着让我的evoque模板颜色代码有点, 但是我得到的html已经用lt gt转义了

我读到应该有一个类似“不再上课”的地方 但是我还没有找到evoque.quoted的软件包

我的目标不是让html脱离模板,而是“真实的”

from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter
from evoque.domain import Domain
import os


tmpl="""

$begin{code}
    ${codyfy(evoque(name=label), lang=label.split()[0][1:])}
$end{code}

$begin{c 0}
    int main(void){printf("hello world");return 0;}
$end{c 0}

$begin{python 0}
    print "hello world"
$end{python 0}

$evoque{#code, label="#c 0"}
$evoque{#code, label="#python 0"}
"""
td = Domain(os.path.abspath("."))
def codyfy(src,lang="python"):
    return highlight(src,get_lexer_by_name(lang, stripall=True),HtmlFormatter())

td.set_on_globals('codyfy',codyfy)
td.set_template("testtmpl", src=tmpl, from_string=True)
t = td.get_template("testtmpl")
print t.evoque()

你用
raw=True
试过吗?见:

我以前没有使用过Qpy,但本说明可能会有所帮助:

[…]还强烈建议下载并安装Qpy unicode模板实用程序,该实用程序提供了Qpy.xml无需引用的类,用于自动输入转义。[……]


是的,我们是平行的,艾尔斯和我。 答案就在这里——把它剪到上面:

from qpy import xml
def codyfy(src,lang="python"):
    return xml(highlight(src,get_lexer_by_name(lang, stripall=True),HtmlFormatter()))
xml()显然是一种使后续转义器停止工作的有效负载。

qpy.xml()是qpy包提供的xml(和HTML)的无需引用的类——在superfast C和其他python版本中都是如此。Evoque在模板加载或呈现时使用quoting=“xml”(即等效于:quoting=qpy.xml)时查找此特定类

但是,任何自定义的quoted no more类型都可以指定为quoting参数的值。evoque.quoted包提供了一个基本的quoted no more类型和一些具体的示例,使自定义quoted no more类型的定义更容易。但是,如前所述,evoque.quoted还不可用——它在变更日志中有提及,但适用于尚未发布的evoque版本(请参见变更日志页面)

如果您通过CODYFY()传递整个一堆模板的输出,您可能还希望考虑将其指定为筛选器,或者在每个模板上指定,或者作为集合上的默认筛选器。使用过滤器的一个示例是:

事实上,使用过滤器是一种更好的方法,因为它更通用——您将:
a) 不必在codyfy()中硬连接qpy.xml()调用,并且

b) 能够在所有模板中使用与filter完全相同的codyfy()函数,即使这些模板指定了qpy.xml以外的引号

是的,我试过了。它似乎是这样打印整个tmpl字符串:$begin{code}${codyfy(evoque(name=label),lang=label.split()[0][1:])}$end{code}您是说在t.evoque()中吗?我的意思是从模板中调用$evoque{…},您可以在模板中输出HTML——它似乎最接近文档所讨论的内容,即从模板中调用另一个模板。有关更多详细信息,请参见链接。但是我没有试过。是的-不幸的是我也试过:$evoque{code,raw=True,label=“#c0”}产生:${codyfy(evoque(name=label),lang=label.split()[0][1:])和${codyfy(evoque(name=label,raw=True),lang=label.split()[0][1:])产生:div class=“highlight”请看我刚才添加到答案中的Qpy注释。谢谢你,我不应该接受你的答案,这样我们就可以接近魔鬼了!非常感谢你,马里奥——正如你所看到的,我投票通过了这个,希望它能及时超越我自己的答案。我不去买过滤器的原因——嗯——它已经在我混乱的头脑中消失了。这就是我的目标(当它启动时…)-项目暂停了一段时间-爱好学习就是这样。