diff options
author | John MacFarlane <jgm@berkeley.edu> | 2011-02-04 13:22:31 -0800 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2011-02-04 13:43:38 -0800 |
commit | 70405ef98ab48e76e9cc8cdd827cb7580dacf4e6 (patch) | |
tree | 98acdaa5c5e8e9d2d8b1f735b8daa62ffef16f53 /src | |
parent | 8e81437fd1ad7e2fab200af722c86b2b265af818 (diff) | |
download | pandoc-70405ef98ab48e76e9cc8cdd827cb7580dacf4e6.tar.gz |
normalize: Normalize spaces too.
In normal form, Space elements only occur to separate two non-Space
elements. So, we never have [Space], or [, ..., Space].
Diffstat (limited to 'src')
-rw-r--r-- | src/Tests/Shared.hs | 5 | ||||
-rw-r--r-- | src/Text/Pandoc/Shared.hs | 15 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/Tests/Shared.hs b/src/Tests/Shared.hs index c35a158c1..f4bf13da4 100644 --- a/src/Tests/Shared.hs +++ b/src/Tests/Shared.hs @@ -10,6 +10,8 @@ tests :: [Test] tests = [ testGroup "normalize" [ property "p_normalize_blocks_rt" p_normalize_blocks_rt , property "p_normalize_inlines_rt" p_normalize_inlines_rt + , property "p_normalize_no_trailing_spaces" + p_normalize_no_trailing_spaces ] ] @@ -19,3 +21,6 @@ p_normalize_blocks_rt bs = normalize bs == normalize (normalize bs) p_normalize_inlines_rt :: [Inline] -> Bool p_normalize_inlines_rt ils = normalize ils == normalize (normalize ils) +p_normalize_no_trailing_spaces :: [Inline] -> Bool +p_normalize_no_trailing_spaces ils = null ils' || last ils' /= Space + where ils' = normalize $ ils ++ [Space] diff --git a/src/Text/Pandoc/Shared.hs b/src/Text/Pandoc/Shared.hs index b1d5de63f..37873f822 100644 --- a/src/Text/Pandoc/Shared.hs +++ b/src/Text/Pandoc/Shared.hs @@ -243,10 +243,7 @@ orderedListMarkers (start, numstyle, numdelim) = -- remove empty Str elements. normalizeSpaces :: [Inline] -> [Inline] normalizeSpaces = cleanup . dropWhile isSpaceOrEmpty - where isSpaceOrEmpty Space = True - isSpaceOrEmpty (Str "") = True - isSpaceOrEmpty _ = False - cleanup [] = [] + where cleanup [] = [] cleanup (Space:rest) = let rest' = dropWhile isSpaceOrEmpty rest in case rest' of [] -> [] @@ -254,13 +251,18 @@ normalizeSpaces = cleanup . dropWhile isSpaceOrEmpty cleanup ((Str ""):rest) = cleanup rest cleanup (x:rest) = x : cleanup rest +isSpaceOrEmpty :: Inline -> Bool +isSpaceOrEmpty Space = True +isSpaceOrEmpty (Str "") = True +isSpaceOrEmpty _ = False + -- | Normalize @Pandoc@ document, consolidating doubled 'Space's, -- combining adjacent 'Str's and 'Emph's, remove 'Null's and -- empty elements, etc. normalize :: (Eq a, Data a) => a -> a normalize = topDown removeEmptyBlocks . topDown consolidateInlines . - bottomUp removeEmptyInlines + bottomUp (removeEmptyInlines . removeTrailingInlineSpaces) removeEmptyBlocks :: [Block] -> [Block] removeEmptyBlocks (Null : xs) = removeEmptyBlocks xs @@ -284,6 +286,9 @@ removeEmptyInlines (Str "" : zs) = removeEmptyInlines zs removeEmptyInlines (x : xs) = x : removeEmptyInlines xs removeEmptyInlines [] = [] +removeTrailingInlineSpaces :: [Inline] -> [Inline] +removeTrailingInlineSpaces = reverse . dropWhile isSpaceOrEmpty . reverse + consolidateInlines :: [Inline] -> [Inline] consolidateInlines (Str x : ys) = case concat (x : map fromStr strs) of |