Pyparsing 嵌套的 transformString

Pyparsing nested transformString

我有一些工作可以将标签从 lua 转换为 hmtl,但最近我遇到了一个可以嵌套这些标签的特殊情况。这是我的代码中的一个快速示例:

from pyparsing import Literal, Word, Suppress, SkipTo, LineEnd, hexnums

text = "|c71d5FFFFI'm saying something in color|cFFFFFFFF then in white |r|r"

def colorize (t):
    hexRGB = "".join(list(t.hex)[:6])
    return "<span style=\"color:#{};\">{}</span>".format(hexRGB, t.content)

vbar = Literal("|")
eol = LineEnd().suppress()

endTag = ((vbar + (Literal("r")|Literal("R"))|eol))
parser = (
    Suppress(vbar + (Literal("c")|Literal("C"))) + 
    Word(hexnums, exact=8).setResultsName("hex") + 
    SkipTo(endTag).setResultsName("content") + 
    Suppress(endTag)
).addParseAction(colorize)

result = parser.transformString(text)
print (result)

我看到了另一个类似的问题Pyparsing: nested Markdown emphasis,但我的问题有点不同,有时没有 closetag 而 lineEnd 作为一个。

您可以添加一个 while 循环来迭代结果,直到找到所有颜色:

from pyparsing import Literal, Word, Suppress, SkipTo, LineEnd, hexnums


def colorize (t):
    hexRGB = "".join(list(t.hex)[:6])
    return "<span style=\"color:#{};\">{}</span>".format(hexRGB, t.content)

vbar = Literal("|")
eol = LineEnd().suppress()

endTag = ((vbar + (Literal("r")|Literal("R"))|eol))
parser = (
    Suppress(vbar + (Literal("c")|Literal("C"))) + 
    Word(hexnums, exact=8).setResultsName("hex") + 
    SkipTo(endTag).setResultsName("content") + 
    Suppress(endTag)
).addParseAction(colorize)

result = parser.transformString(text)
new_result = parser.transformString(result)

while(result != new_result):
   result = new_result
   new_result = parser.transformString(result)


print (result)

text = "|c71d5FFFFI'm saying something in color|cFFFFFFFF then in white |r|r":

输出:

<span style="color:#71d5FF;">I'm saying something in color<span style="color:#FFFFFF;"> then in white</span></span>

text = "|c71d5FFFFI'm saying something in color"

输出:

<span style="color:#71d5FF;">I'm saying something in color</span>