git.iko.soy/typeable/pandoc
on master help sign in
Docx reader: more efficient trimSps.
a197dc9John MacFarlane
src/Text/Pandoc/Readers/Docx.hs+9−9
@@ -83,7 +83,7 @@ import Data.Default (Default)
83import Data.List (delete, intersect)
83import Data.List (delete, intersect)
84import qualified Data.Map as M
84import qualified Data.Map as M
85import Data.Sequence (ViewL (..), viewl)
85import Data.Sequence (ViewL (..), viewl)
86−import qualified Data.Sequence as Seq (null)
86+import qualified Data.Sequence as Seq
87import qualified Data.Set as Set
87import qualified Data.Set as Set
88import Text.Pandoc.Builder
88import Text.Pandoc.Builder
89-- import Text.Pandoc.Definition
89-- import Text.Pandoc.Definition
@@ -476,12 +476,13 @@ rowToBlocksList (Row cells) = do
476 blksList <- mapM cellToBlocks cells
476 blksList <- mapM cellToBlocks cells
477 return $ map singleParaToPlain blksList
477 return $ map singleParaToPlain blksList
478
478
479−trimLineBreaks :: [Inline] -> [Inline]
479+-- like trimInlines, but also take out linebreaks
480−trimLineBreaks [] = []
480+trimSps :: Inlines -> Inlines
481−trimLineBreaks (LineBreak : ils) = trimLineBreaks ils
481+trimSps (Many ils) = Many $ Seq.dropWhileL isSp $ Seq.dropWhileR isSp $ ils
482−trimLineBreaks ils
482+ where isSp Space = True
483− | (LineBreak : ils') <- reverse ils = trimLineBreaks (reverse ils')
483+ isSp SoftBreak = True
484−trimLineBreaks ils = ils
484+ isSp LineBreak = True
485+ isSp _ = False
485
486
486parStyleToTransform :: ParagraphStyle -> (Blocks -> Blocks)
487parStyleToTransform :: ParagraphStyle -> (Blocks -> Blocks)
487parStyleToTransform pPr
488parStyleToTransform pPr
@@ -534,8 +535,7 @@ bodyPartToBlocks (Paragraph pPr parparts)
534 makeHeaderAnchor $
535 makeHeaderAnchor $
535 headerWith ("", delete style (pStyle pPr), []) n ils
536 headerWith ("", delete style (pStyle pPr), []) n ils
536 | otherwise = do
537 | otherwise = do
537− ils <- smushInlines <$> mapM parPartToInlines parparts >>=
538+ ils <- (trimSps . smushInlines) <$> mapM parPartToInlines parparts
538− (return . fromList . trimLineBreaks . normalizeSpaces . toList)
539 dropIls <- gets docxDropCap
539 dropIls <- gets docxDropCap
540 let ils' = dropIls <> ils
540 let ils' = dropIls <> ils
541 if dropCap pPr
541 if dropCap pPr