fork download
  1. bp = "<p>"
  2. ep = "</p>\n"
  3. bbq = "<block quote>\n"
  4. ebq = "</block quote>\n"
  5.  
  6. convert txt = let
  7. ls = ( lines txt )
  8. depth cs = if "> " == ( take 2 cs )
  9. then 1 + ( depth $ drop 2 cs )
  10. else 0
  11. leftCs cs = drop ( 2 * ( depth cs ) ) cs
  12. dpAndLeft cs = ( depth cs, leftCs cs )
  13. dpAndCs = ( map dpAndLeft ls ) ++ [ ( 0, "" ) ]
  14. join ( p, txt ) ( q , cs ) = id
  15. $ ( ( , ) q )
  16. $ ( txt ++ )
  17. $ ( ++ ( ( replicate q ' ' ) ++ bp ++ cs ++ ep ) )
  18. $ concat
  19. $ case ( compare p q ) of
  20. EQ -> [ "" ]
  21. LT -> id
  22. $ [ ( replicate r ' ' ) ++ bbq | r <- [p..q-1] ]
  23. GT -> reverse
  24. $ [ ( replicate r ' ' ) ++ ebq | r <- [q..p-1] ]
  25. result = foldl join ( 0, "" ) dpAndCs
  26. in reverse $ drop 8 $ reverse $ snd result
  27.  
  28. sample1= "paragraph\n"
  29. ++ "> block quoted paragraph"
  30.  
  31. sample2= "> hoge\n"
  32. ++ "> > nested piyo1\n"
  33. ++ "> > nested piyo2\n"
  34. ++ "> fuga"
  35.  
  36. main = do
  37. putStrLn $ convert sample1
  38. putStrLn $ convert sample2
  39.  
Success #stdin #stdout 0s 4952KB
stdin
Standard input is empty
stdout
<p>paragraph</p>
<block quote>
 <p>block quoted paragraph</p>
</block quote>

<block quote>
 <p>hoge</p>
 <block quote>
  <p>nested piyo1</p>
  <p>nested piyo2</p>
 </block quote>
 <p>fuga</p>
</block quote>