0

vCard 形式を解析するパーサーを作成することで、パセリを学んでいます。私の問題は、vCard 形式の一部の行が複数の行に分割される可能性があることです。RFC 822 の「折りたたみ」技術を使用した複数行の表現。つまり、線形の空白が存在する可能性がある場合は、CRLF の直後に少なくとも 1 つの LWSP-char が続きます。私の解決策は、最初に生のテキストを解析することです。改行の後にスペースが続き、その行を結合できます。しかし、私はそれを動作させることができません:私の最新の試みがあります:コードは最後にエラーを返します: TypeError: +: 'bool' および 'str のサポートされていないオペランド型(s)

import parsley
my_newline = "\n"
space = " "

def isLogicalLine(txt=""): #Function called from Parsley, just search for newline followed by space
    result = True
    if txt[:-2] == my_newline+space:
        result = False
    return result

tst_line2 = parsley.makeGrammar("""
CRLF = '\n' 
line = (~(CRLF) anything+:x ?(isLogicalLine(x))):first_part  -> first_part+ ' test '
""", {"isLogicalLine":isLogicalLine})
# ~(CRLF) = NOT CRLF
# ?(isLogicalLine(x)) = python expression that is true or false
# -> first_part+ ' test ' == modify result by Python express

test_string = "BEGIN:VCARD"+my_newline+"VERSION:2.1"+my_newline+\
              "N;CHARSET=UTF-8;ENCODING=8BIT:Bab"+my_newline+\
              "TEL;PREF;VOICE;ENCODING=8BIT:123456789"+my_newline+"END:VCARD"+\
              my_newline+" END:VCARD"

print(tst_line2(test_string).line())
4

1 に答える 1

0

次のように、テストをバインディングの外に移動することで修正できます。

line = (~(CRLF) anything+:x):first_part ?(isLogicalLine(x)) -> first_part + ' test '

バグかどうかはわかりませんが、テストfirst_partの結果にバインドされていたので、bool と string を追加しようとしていました。isLogicalLinefirst_part + ' test '

于 2014-06-24T02:57:05.747 に答える