0

私はText.ParserCombinators.ParsecText.XHtmlを使用して、次のような入力を解析しています。

this is the beginning of the paragraph --this is an emphasized text-- and this is the end\n

そして、私の出力は次のようになります。

<p>this is the beginning of the paragraph <em>this is an emphasized text</em> and this is the end\n</p>

このコードは、強調された要素を解析して返します


em = do{ 
      ;count 2 (char '-') ;
      ;s <- manyTill anyChar (count 2 (char '-')) 
      ;return  (emphasize  << s)
     }

しかし、強調項目のある段落を取得する方法がわかりません

何か案は?

ありがとう!!

4

1 に答える 1

1

これはハックですが、あなたが望むことをすると思います:

list = (:[])
text = many (try em <|> (anyChar >>= return . list)) 
       >>= return . ("<p>"++) . (++"</p>") . concat

(強調されていない各文字は、独自の文字列として返されます。)


仕組みは次のとおりです。

各文字で、まず parse を試みますem。これは 2 つのダッシュで始まります。em"ab" のように 1 つのダッシュを消費すると失敗する可能性があるため、接頭辞としてtry. 入力の残りの部分でダッシュが許可されていない場合、try は必要ありませんが、おそらくそうではありません。それ以外の場合は、anyChar を消費します。しかし、これはCharではなくタイプStringなので、リストでラップする必要があります。

これは、強調されたセクションがインターリーブされた 1 文字の文字列のリストを返します。ただし、タグで囲まれた単一の文字列が必要なpため、最初concatに 、次に開始/終了タグを開始/終了に追加します。次に、その値を返します。

このパーサー全体を書き換えて、anyChar の代わりに 2 つのダッシュが表示されるまで入力を消費する方法がおそらくあるでしょう。しかし、それを頭のてっぺんから書き出す方法がわからないので、代わりにこのハックを取得しますが、これはおそらくはるかに効率的ではありません.

于 2010-04-25T13:08:43.433 に答える