Shared.blocksToInlines: rewrote using builder.

This gives us automatic normalization, so we don't get
for example two consecutive Spaces.
This commit is contained in:
John MacFarlane 2017-12-02 16:26:26 -08:00
parent 7b8c2b6691
commit f4b86a1bc2

View file

@ -107,7 +107,7 @@ import qualified Data.ByteString.Lazy as BL
import Data.Char (isAlpha, isDigit, isLetter, isLower, isSpace, isUpper, import Data.Char (isAlpha, isDigit, isLetter, isLower, isSpace, isUpper,
toLower) toLower)
import Data.Data (Data, Typeable) import Data.Data (Data, Typeable)
import Data.List (find, intercalate, stripPrefix) import Data.List (find, intercalate, intersperse, stripPrefix)
import qualified Data.Map as M import qualified Data.Map as M
import Data.Maybe (mapMaybe) import Data.Maybe (mapMaybe)
import Data.Monoid ((<>)) import Data.Monoid ((<>))
@ -717,37 +717,40 @@ isURI = maybe False hasKnownScheme . parseURI
--- Squash blocks into inlines --- Squash blocks into inlines
--- ---
blockToInlines :: Block -> [Inline] blockToInlines :: Block -> Inlines
blockToInlines (Plain ils) = ils blockToInlines (Plain ils) = B.fromList ils
blockToInlines (Para ils) = ils blockToInlines (Para ils) = B.fromList ils
blockToInlines (LineBlock lns) = combineLines lns blockToInlines (LineBlock lns) = B.fromList $ combineLines lns
blockToInlines (CodeBlock attr str) = [Code attr str] blockToInlines (CodeBlock attr str) = B.codeWith attr str
blockToInlines (RawBlock fmt str) = [RawInline fmt str] blockToInlines (RawBlock (Format fmt) str) = B.rawInline fmt str
blockToInlines (BlockQuote blks) = blocksToInlines blks blockToInlines (BlockQuote blks) = blocksToInlines' blks
blockToInlines (OrderedList _ blkslst) = blockToInlines (OrderedList _ blkslst) =
concatMap blocksToInlines blkslst mconcat $ map blocksToInlines' blkslst
blockToInlines (BulletList blkslst) = blockToInlines (BulletList blkslst) =
concatMap blocksToInlines blkslst mconcat $ map blocksToInlines' blkslst
blockToInlines (DefinitionList pairslst) = blockToInlines (DefinitionList pairslst) =
concatMap f pairslst mconcat $ map f pairslst
where where
f (ils, blkslst) = ils ++ f (ils, blkslst) = B.fromList ils <> B.str ":" <> B.space <>
[Str ":", Space] ++ mconcat (map blocksToInlines' blkslst)
concatMap blocksToInlines blkslst blockToInlines (Header _ _ ils) = B.fromList ils
blockToInlines (Header _ _ ils) = ils blockToInlines HorizontalRule = mempty
blockToInlines HorizontalRule = []
blockToInlines (Table _ _ _ headers rows) = blockToInlines (Table _ _ _ headers rows) =
intercalate [LineBreak] $ map (concatMap blocksToInlines) tbl mconcat $ intersperse B.linebreak $
where map (mconcat . map blocksToInlines') (headers:rows)
tbl = headers : rows blockToInlines (Div _ blks) = blocksToInlines' blks
blockToInlines (Div _ blks) = blocksToInlines blks blockToInlines Null = mempty
blockToInlines Null = []
blocksToInlinesWithSep :: [Inline] -> [Block] -> [Inline] blocksToInlinesWithSep :: Inlines -> [Block] -> Inlines
blocksToInlinesWithSep sep blks = intercalate sep $ map blockToInlines blks blocksToInlinesWithSep sep =
mconcat . intersperse sep . map blockToInlines
blocksToInlines' :: [Block] -> Inlines
blocksToInlines' = blocksToInlinesWithSep parSep
where parSep = B.space <> B.str "" <> B.space
blocksToInlines :: [Block] -> [Inline] blocksToInlines :: [Block] -> [Inline]
blocksToInlines = blocksToInlinesWithSep [Space, Str "", Space] blocksToInlines = B.toList . blocksToInlines'
-- --