2010-04-24 7 views
1

J'utilise Text.ParserCombinators.Parsec et Text.XHtml pour analyser une entrée et obtenir une sortie HTML.Parsec Haskell Listes

Si mon entrée est:

 
    * First item, First level 
    ** First item, Second level 
    ** Second item, Second level 
    * Second item, First level 

Ma sortie doit être:

<ul><li>First item, First level <ul><li>First item, Second level </li><li>Second item, Second level </li></ul></li><li>Second item, First level</li></ul>

j'ai écrit, mais ne fonctionne évidemment pas récursive

list= do{ s <- many1 item;return (olist << s) } item= do{ (count 1 (char '*')) ;s <- manyTill anyChar newline ;return (li << s) }

Tous des idées? la récursivité peut être plus de deux niveaux

Merci!

Répondre

2
list n = do first <- item n 
      rest <- many $ try $ try (list (n+1)) <|> item n 
      return $ ulist << (first : rest) 

item n = do count n (char '*') 
      s <- manyTill anyChar newline 
      return $ li << s 

Maintenant parse (list 1) "foo" "* a\n** a 1\n** a 2\n* b\n** b 1\n** b 2\n" retournera ce que vous avez demandé. Notez cependant que les listes imbriquées doivent elles-mêmes être dans un li, pour que ce soit xhtml valide.

+0

Merci! mais quand je fais 'parse (liste 1)" foo "" * a \ n ** a 1 \ n ** a 2 \ n * b \ n ** b 1 \ n ** b 2 \ n "' rendements

  • un
  • * a 1
  • * a 2
  • b
    • b 1
    • b 2
Martin

+0

@ Martin: Bah, tu as raison. Je n'ai pas lu la sortie assez attentivement quand j'ai testé. – sepp2k

+0

Pourriez-vous s'il vous plaît m'aider à améliorer la sortie? Merci! – Martin

Questions connexes