diff options
-rw-r--r-- | bbcode/src/BBCode.hs | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/bbcode/src/BBCode.hs b/bbcode/src/BBCode.hs index 3071db6..118aed7 100644 --- a/bbcode/src/BBCode.hs +++ b/bbcode/src/BBCode.hs | |||
@@ -55,7 +55,20 @@ make' (Cooked c) = c | |||
55 | make' (Raw _) = error "Cannot transform block containing raw data to bbcode" | 55 | make' (Raw _) = error "Cannot transform block containing raw data to bbcode" |
56 | 56 | ||
57 | parse :: String -> Either String (Block String) | 57 | parse :: String -> Either String (Block String) |
58 | parse input = (remerge . blockify <$> (tokenize input >>= treeify)) >>= semantics | 58 | parse input = (remerge . massage . blockify <$> (tokenize input >>= treeify)) >>= semantics |
59 | |||
60 | massage :: [Decorated String] -> [Decorated String] | ||
61 | massage [] = [] | ||
62 | massage (x@(Decorated _ tags) : x'@(Decorated wSpace []) : xs) | ||
63 | | any $ map isSpace wSpace | ||
64 | , any $ map isBlock tags = (x:Decorated (massage' wSpace) []:xs) | ||
65 | | otherwise = x : massage (x':xs) | ||
66 | where | ||
67 | massage' [] = [] | ||
68 | massage' l@(x:xs) | ||
69 | | isSpace x = massage' xs | ||
70 | | otherwise = l | ||
71 | massage (x:xs) = x : massage xs | ||
59 | 72 | ||
60 | blockify :: ContentForest -> [Decorated String] | 73 | blockify :: ContentForest -> [Decorated String] |
61 | blockify = map sortDeco . concat . map (blockify' []) | 74 | blockify = map sortDeco . concat . map (blockify' []) |