git.iko.soy/typeable/pandoc
on master help sign in
Rewrote header generation.

In preparation for auto ids.

commit5969baf5b97c0926384b1619be3c4be6d92b277b authorJesse Rosenthal <jrosenthal@jhu.edu> dateSat 28 Jun 2014, 02:47 (12 years ago) parent1de8d4d
1 file changed+25−25
src/Text/Pandoc/Readers/Docx.hs+25−25
src/Text/Pandoc/Readers/Docx.hs+25−25
@@ -84,6 +84,7 @@ import Text.Pandoc.Walk
8484import Text.Pandoc.Readers.Docx.Parse
8585import Text.Pandoc.Readers.Docx.Lists
8686import Text.Pandoc.Readers.Docx.Reducible
87+import Text.Pandoc.Shared
8788import Data.Maybe (mapMaybe)
8889import Data.List (delete, isPrefixOf, (\\))
8990import qualified Data.ByteString as BS
@@ -151,9 +152,8 @@ runStyleToContainers rPr =
151152
152153divAttrToContainers :: [String] -> [(String, String)] -> [Container Block]
153154divAttrToContainers (c:cs) _ | Just n <- isHeaderClass c =
154− [(Container $ \blks ->
155− makeHeaderAnchor $
156− Header n ("", delete ("Heading" ++ show n) cs, []) (blksToInlines blks))]
155+ [Container $ \_ ->
156+ Header n ("", delete ("Heading" ++ show n) cs, []) []]
157157divAttrToContainers (c:cs) kvs | c `elem` divsToKeep =
158158 (Container $ Div ("", [c], [])) : (divAttrToContainers cs kvs)
159159divAttrToContainers (c:cs) kvs | c `elem` codeDivs =
@@ -305,13 +305,14 @@ isAnchorSpan _ = False
305305dummyAnchors :: [String]
306306dummyAnchors = ["_GoBack"]
307307
308−makeHeaderAnchor :: Block -> Block
308+makeHeaderAnchor :: Block -> DocxContext Block
309309makeHeaderAnchor (Header n (_, classes, kvs) ils)
310310 | (x : xs) <- filter isAnchorSpan ils
311311 , (Span (ident, _, _) _) <- x
312312 , notElem ident dummyAnchors =
313− Header n (ident, classes, kvs) (ils \\ (x:xs))
314−makeHeaderAnchor blk = blk
313+ return $ Header n (ident, classes, kvs) (ils \\ (x:xs))
314+makeHeaderAnchor blk = return blk
315+
315316
316317parPartsToInlines :: [ParPart] -> DocxContext [Inline]
317318parPartsToInlines parparts = do
@@ -326,36 +327,40 @@ cellToBlocks (Cell bps) = concatMapM bodyPartToBlocks bps
326327rowToBlocksList :: Row -> DocxContext [[Block]]
327328rowToBlocksList (Row cells) = mapM cellToBlocks cells
328329
329−blockCodeContainer :: Container Block -> Bool
330−blockCodeContainer (Container f) = case f [] of
331− CodeBlock _ _ -> True
332− _ -> False
333−blockCodeContainer _ = False
330+isBlockCodeContainer :: Container Block -> Bool
331+isBlockCodeContainer (Container f) | CodeBlock _ _ <- f [] = True
332+isBlockCodeContainer _ = False
333+
334+isHeaderContainer :: Container Block -> Bool
335+isHeaderContainer (Container f) | Header _ _ _ <- f [] = True
336+isHeaderContainer _ = False
334337
335338bodyPartToBlocks :: BodyPart -> DocxContext [Block]
336339bodyPartToBlocks (Paragraph pPr parparts)
337− | any blockCodeContainer (parStyleToContainers pPr) =
340+ | any isBlockCodeContainer (parStyleToContainers pPr) =
338341 let
339− otherConts = filter (not . blockCodeContainer) (parStyleToContainers pPr)
342+ otherConts = filter (not . isBlockCodeContainer) (parStyleToContainers pPr)
340343 in
341344 return $
342345 rebuild
343346 otherConts
344347 [CodeBlock ("", [], []) (concatMap parPartToString parparts)]
348+bodyPartToBlocks (Paragraph pPr parparts)
349+ | any isHeaderContainer (parStyleToContainers pPr) = do
350+ ils <- parPartsToInlines parparts >>= (return . normalizeSpaces)
351+ let (Container hdrFun) = head $ filter isHeaderContainer (parStyleToContainers pPr)
352+ Header n attr _ = hdrFun []
353+ hdr <- makeHeaderAnchor $ Header n attr ils
354+ return [hdr]
345355bodyPartToBlocks (Paragraph pPr parparts) = do
346− ils <- parPartsToInlines parparts
356+ ils <- parPartsToInlines parparts >>= (return . normalizeSpaces)
347357 case ils of
348358 [] -> return []
349359 _ -> do
350− parContents <- parPartsToInlines parparts
351− let trimmedContents = reverse $
352− dropWhile (Space ==) $
353− reverse $
354− dropWhile (Space ==) parContents
355360 return $
356361 rebuild
357362 (parStyleToContainers pPr)
358− [Para trimmedContents]
363+ [Para ils]
359364bodyPartToBlocks (ListItem pPr numId lvl parparts) = do
360365 (Docx _ _ numbering _ _) <- asks docxDocument
361366 let
@@ -446,8 +451,3 @@ isHeaderClass s | "Heading" `isPrefixOf` s =
446451 ((n, "") : []) -> Just n
447452 _ -> Nothing
448453isHeaderClass _ = Nothing
449−
450−blksToInlines :: [Block] -> [Inline]
451−blksToInlines (Para ils : _) = ils
452−blksToInlines (Plain ils : _) = ils
453−blksToInlines _ = []