@@ -258,67 +258,70 @@ normalizeSpaces = cleanup . dropWhile isSpaceOrEmpty
258258-- combining adjacent 'Str's and 'Emph's, remove 'Null's and
259259-- empty elements, etc.
260260normalize :: Pandoc -> Pandoc
261−normalize = topDown normalizeInlines .
262− topDown normalizeBlocks
263−
264−normalizeBlocks :: [Block] -> [Block]
265−normalizeBlocks (Null : xs) = normalizeBlocks xs
266−normalizeBlocks (BulletList [] : xs) = normalizeBlocks xs
267−normalizeBlocks (OrderedList _ [] : xs) = normalizeBlocks xs
268−normalizeBlocks (DefinitionList [] : xs) = normalizeBlocks xs
269−normalizeBlocks (RawHtml [] : xs) = normalizeBlocks xs
270−normalizeBlocks (RawHtml x : RawHtml y : zs) = normalizeBlocks $
271− RawHtml (x++y) : zs
272−normalizeBlocks (x:xs) = x : normalizeBlocks xs
273−normalizeBlocks [] = []
274−
275−normalizeInlines :: [Inline] -> [Inline]
276−normalizeInlines (Str x : ys) =
261+normalize = topDown consolidateInlines .
262+ bottomUp removeEmptyInlines .
263+ topDown removeEmptyBlocks
264+
265+removeEmptyBlocks :: [Block] -> [Block]
266+removeEmptyBlocks (Null : xs) = removeEmptyBlocks xs
267+removeEmptyBlocks (BulletList [] : xs) = removeEmptyBlocks xs
268+removeEmptyBlocks (OrderedList _ [] : xs) = removeEmptyBlocks xs
269+removeEmptyBlocks (DefinitionList [] : xs) = removeEmptyBlocks xs
270+removeEmptyBlocks (RawHtml [] : xs) = removeEmptyBlocks xs
271+removeEmptyBlocks (x:xs) = x : removeEmptyBlocks xs
272+removeEmptyBlocks [] = []
273+
274+removeEmptyInlines :: [Inline] -> [Inline]
275+removeEmptyInlines (Emph [] : zs) = removeEmptyInlines zs
276+removeEmptyInlines (Strong [] : zs) = removeEmptyInlines zs
277+removeEmptyInlines (Subscript [] : zs) = removeEmptyInlines zs
278+removeEmptyInlines (Superscript [] : zs) = removeEmptyInlines zs
279+removeEmptyInlines (SmallCaps [] : zs) = removeEmptyInlines zs
280+removeEmptyInlines (Strikeout [] : zs) = removeEmptyInlines zs
281+removeEmptyInlines (TeX [] : zs) = removeEmptyInlines zs
282+removeEmptyInlines (HtmlInline [] : zs) = removeEmptyInlines zs
283+removeEmptyInlines (Code [] : zs) = removeEmptyInlines zs
284+removeEmptyInlines (x : xs) = x : removeEmptyInlines xs
285+removeEmptyInlines [] = []
286+
287+consolidateInlines :: [Inline] -> [Inline]
288+consolidateInlines (Str x : ys) =
277289 case concat (x : map fromStr strs) of
278− "" -> normalizeInlines rest
279− n -> Str n : normalizeInlines rest
290+ "" -> consolidateInlines rest
291+ n -> Str n : consolidateInlines rest
280292 where
281293 (strs, rest) = span isStr ys
282294 isStr (Str _) = True
283295 isStr _ = False
284296 fromStr (Str z) = z
285− fromStr _ = error "normalizeInlines - fromStr - not a Str"
286−normalizeInlines (Space : ys) =
297+ fromStr _ = error "consolidateInlines - fromStr - not a Str"
298+consolidateInlines (Space : ys) =
287299 if null rest
288300 then []
289301 else Space : rest
290302 where isSpace Space = True
291303 isSpace _ = False
292− rest = normalizeInlines $ dropWhile isSpace ys
293−normalizeInlines (Emph [] : zs) = normalizeInlines zs
294−normalizeInlines (Strong [] : zs) = normalizeInlines zs
295−normalizeInlines (Subscript [] : zs) = normalizeInlines zs
296−normalizeInlines (Superscript [] : zs) = normalizeInlines zs
297−normalizeInlines (SmallCaps [] : zs) = normalizeInlines zs
298−normalizeInlines (Strikeout [] : zs) = normalizeInlines zs
299−normalizeInlines (TeX [] : zs) = normalizeInlines zs
300−normalizeInlines (HtmlInline [] : zs) = normalizeInlines zs
301−normalizeInlines (Code [] : zs) = normalizeInlines zs
302−normalizeInlines (Emph xs : Emph ys : zs) = normalizeInlines $
304+ rest = consolidateInlines $ dropWhile isSpace ys
305+consolidateInlines (Emph xs : Emph ys : zs) = consolidateInlines $
303306 Emph (xs ++ ys) : zs
304−normalizeInlines (Strong xs : Strong ys : zs) = normalizeInlines $
307+consolidateInlines (Strong xs : Strong ys : zs) = consolidateInlines $
305308 Strong (xs ++ ys) : zs
306−normalizeInlines (Subscript xs : Subscript ys : zs) = normalizeInlines $
309+consolidateInlines (Subscript xs : Subscript ys : zs) = consolidateInlines $
307310 Subscript (xs ++ ys) : zs
308−normalizeInlines (Superscript xs : Superscript ys : zs) = normalizeInlines $
311+consolidateInlines (Superscript xs : Superscript ys : zs) = consolidateInlines $
309312 Superscript (xs ++ ys) : zs
310−normalizeInlines (SmallCaps xs : SmallCaps ys : zs) = normalizeInlines $
313+consolidateInlines (SmallCaps xs : SmallCaps ys : zs) = consolidateInlines $
311314 SmallCaps (xs ++ ys) : zs
312−normalizeInlines (Strikeout xs : Strikeout ys : zs) = normalizeInlines $
315+consolidateInlines (Strikeout xs : Strikeout ys : zs) = consolidateInlines $
313316 Strikeout (xs ++ ys) : zs
314−normalizeInlines (TeX x : TeX y : zs) = normalizeInlines $
317+consolidateInlines (TeX x : TeX y : zs) = consolidateInlines $
315318 TeX (x ++ y) : zs
316−normalizeInlines (HtmlInline x : HtmlInline y : zs) = normalizeInlines $
319+consolidateInlines (HtmlInline x : HtmlInline y : zs) = consolidateInlines $
317320 HtmlInline (x ++ y) : zs
318−normalizeInlines (Code x : Code y : zs) = normalizeInlines $
321+consolidateInlines (Code x : Code y : zs) = consolidateInlines $
319322 Code (x ++ y) : zs
320−normalizeInlines (x : xs) = x : normalizeInlines xs
321−normalizeInlines [] = []
323+consolidateInlines (x : xs) = x : consolidateInlines xs
324+consolidateInlines [] = []
322325
323326-- | Convert list of inlines to a string with formatting removed.
324327stringify :: [Inline] -> String