@@ -33,7 +33,6 @@ module Text.Pandoc.Readers.Docx.Lists ( blocksToBullets
3333 , listParagraphDivs
3434 ) where
3535
36−import Control.Monad
3736import Data.List
3837import Data.Maybe
3938import Text.Pandoc.Generic (bottomUp)
@@ -45,22 +44,18 @@ isListItem (Div (_, classes, _) _) | "list-item" `elem` classes = True
4544isListItem _ = False
4645
4746getLevel :: Block -> Maybe Integer
48−getLevel (Div (_, _, kvs) _) = liftM read $ lookup "level" kvs
47+getLevel (Div (_, _, kvs) _) = fmap read $ lookup "level" kvs
4948getLevel _ = Nothing
5049
5150getLevelN :: Block -> Integer
52−getLevelN b = case getLevel b of
53− Just n -> n
54− Nothing -> -1
51+getLevelN b = fromMaybe (-1) (getLevel b)
5552
5653getNumId :: Block -> Maybe Integer
57−getNumId (Div (_, _, kvs) _) = liftM read $ lookup "num-id" kvs
54+getNumId (Div (_, _, kvs) _) = fmap read $ lookup "num-id" kvs
5855getNumId _ = Nothing
5956
6057getNumIdN :: Block -> Integer
61−getNumIdN b = case getNumId b of
62− Just n -> n
63− Nothing -> -1
58+getNumIdN b = fromMaybe (-1) (getNumId b)
6459
6560getText :: Block -> Maybe String
6661getText (Div (_, _, kvs) _) = lookup "text" kvs
@@ -109,27 +104,27 @@ listParagraphDivs = ["ListParagraph"]
109104handleListParagraphs :: [Block] -> [Block]
110105handleListParagraphs [] = []
111106handleListParagraphs (
112− (Div attr1@(_, classes1, _) blks1) :
113− (Div (ident2, classes2, kvs2) blks2) :
107+ Div attr1@(_, classes1, _) blks1 :
108+ Div (ident2, classes2, kvs2) blks2 :
114109 blks
115110 ) | "list-item" `elem` classes1 &&
116− not ("list-item" `elem` classes2) &&
111+ notElem "list-item" classes2 &&
117112 (not . null) (listParagraphDivs `intersect` classes2) =
118113 -- We don't want to keep this indent.
119114 let newDiv2 =
120− (Div (ident2, classes2, filter (\kv -> fst kv /= "indent") kvs2) blks2)
115+ Div (ident2, classes2, filter (\kv -> fst kv /= "indent") kvs2) blks2
121116 in
122− handleListParagraphs ((Div attr1 (blks1 ++ [newDiv2])) : blks)
123−handleListParagraphs (blk:blks) = blk : (handleListParagraphs blks)
117+ handleListParagraphs (Div attr1 (blks1 ++ [newDiv2]) : blks)
118+handleListParagraphs (blk:blks) = blk : handleListParagraphs blks
124119
125120separateBlocks' :: Block -> [[Block]] -> [[Block]]
126−separateBlocks' blk ([] : []) = [[blk]]
127−separateBlocks' b@(BulletList _) acc = (init acc) ++ [(last acc) ++ [b]]
128−separateBlocks' b@(OrderedList _ _) acc = (init acc) ++ [(last acc) ++ [b]]
121+separateBlocks' blk [[]] = [[blk]]
122+separateBlocks' b@(BulletList _) acc = init acc ++ [last acc ++ [b]]
123+separateBlocks' b@(OrderedList _ _) acc = init acc ++ [last acc ++ [b]]
129124-- The following is for the invisible bullet lists. This is how
130125-- pandoc-generated ooxml does multiparagraph item lists.
131−separateBlocks' b acc | liftM trim (getText b) == Just "" =
132− (init acc) ++ [(last acc) ++ [b]]
126+separateBlocks' b acc | fmap trim (getText b) == Just "" =
127+ init acc ++ [last acc ++ [b]]
133128separateBlocks' b acc = acc ++ [[b]]
134129
135130separateBlocks :: [Block] -> [[Block]]
@@ -138,38 +133,37 @@ separateBlocks blks = foldr separateBlocks' [[]] (reverse blks)
138133flatToBullets' :: Integer -> [Block] -> [Block]
139134flatToBullets' _ [] = []
140135flatToBullets' num xs@(b : elems)
141− | getLevelN b == num = b : (flatToBullets' num elems)
136+ | getLevelN b == num = b : flatToBullets' num elems
142137 | otherwise =
143138 let bNumId = getNumIdN b
144139 bLevel = getLevelN b
145140 (children, remaining) =
146141 span
147142 (\b' ->
148− ((getLevelN b') > bLevel ||
149− ((getLevelN b') == bLevel && (getNumIdN b') == bNumId)))
143+ (getLevelN b') > bLevel ||
144+ ((getLevelN b') == bLevel && (getNumIdN b') == bNumId))
150145 xs
151146 in
152147 case getListType b of
153148 Just (Enumerated attr) ->
154− (OrderedList attr (separateBlocks $ flatToBullets' bLevel children)) :
155− (flatToBullets' num remaining)
149+ OrderedList attr (separateBlocks $ flatToBullets' bLevel children) :
150+ flatToBullets' num remaining
156151 _ ->
157− (BulletList (separateBlocks $ flatToBullets' bLevel children)) :
158− (flatToBullets' num remaining)
152+ BulletList (separateBlocks $ flatToBullets' bLevel children) :
153+ flatToBullets' num remaining
159154
160155flatToBullets :: [Block] -> [Block]
161156flatToBullets elems = flatToBullets' (-1) elems
162157
163158singleItemHeaderToHeader :: Block -> Block
164−singleItemHeaderToHeader (OrderedList _ [[h@(Header _ _ _)]]) = h
159+singleItemHeaderToHeader (OrderedList _ [[h@(Header{})]]) = h
165160singleItemHeaderToHeader blk = blk
166161
167162
168163blocksToBullets :: [Block] -> [Block]
169164blocksToBullets blks =
170165 map singleItemHeaderToHeader $
171− bottomUp removeListDivs $
172− flatToBullets $ (handleListParagraphs blks)
166+ bottomUp removeListDivs $flatToBullets (handleListParagraphs blks)
173167
174168plainParaInlines :: Block -> [Inline]
175169plainParaInlines (Plain ils) = ils
@@ -179,18 +173,16 @@ plainParaInlines _ = []
179173blocksToDefinitions' :: [([Inline], [[Block]])] -> [Block] -> [Block] -> [Block]
180174blocksToDefinitions' [] acc [] = reverse acc
181175blocksToDefinitions' defAcc acc [] =
182− reverse $ (DefinitionList (reverse defAcc)) : acc
176+ reverse $ DefinitionList (reverse defAcc) : acc
183177blocksToDefinitions' defAcc acc
184− ((Div (_, classes1, _) blks1) : (Div (ident2, classes2, kvs2) blks2) : blks)
178+ (Div (_, classes1, _) blks1 : Div (ident2, classes2, kvs2) blks2 : blks)
185179 | "DefinitionTerm" `elem` classes1 && "Definition" `elem` classes2 =
186180 let remainingAttr2 = (ident2, delete "Definition" classes2, kvs2)
187− pair = case remainingAttr2 == ("", [], []) of
188− True -> (concatMap plainParaInlines blks1, [blks2])
189− False -> (concatMap plainParaInlines blks1, [[Div remainingAttr2 blks2]])
181+ pair = if remainingAttr2 == ("", [], []) then (concatMap plainParaInlines blks1, [blks2]) else (concatMap plainParaInlines blks1, [[Div remainingAttr2 blks2]])
190182 in
191183 blocksToDefinitions' (pair : defAcc) acc blks
192184blocksToDefinitions' defAcc acc
193− ((Div (ident2, classes2, kvs2) blks2) : blks)
185+ (Div (ident2, classes2, kvs2) blks2 : blks)
194186 | (not . null) defAcc && "Definition" `elem` classes2 =
195187 let remainingAttr2 = (ident2, delete "Definition" classes2, kvs2)
196188 defItems2 = case remainingAttr2 == ("", [], []) of
@@ -205,14 +197,14 @@ blocksToDefinitions' defAcc acc
205197blocksToDefinitions' [] acc (b:blks) =
206198 blocksToDefinitions' [] (b:acc) blks
207199blocksToDefinitions' defAcc acc (b:blks) =
208− blocksToDefinitions' [] (b : (DefinitionList (reverse defAcc)) : acc) blks
200+ blocksToDefinitions' [] (b : DefinitionList (reverse defAcc) : acc) blks
209201
210202removeListDivs' :: Block -> [Block]
211203removeListDivs' (Div (ident, classes, kvs) blks)
212204 | "list-item" `elem` classes =
213205 case delete "list-item" classes of
214206 [] -> blks
215− classes' -> [Div (ident, classes', kvs) $ blks]
207+ classes' -> [Div (ident, classes', kvs) blks]
216208removeListDivs' (Div (ident, classes, kvs) blks)
217209 | not $ null $ listParagraphDivs `intersect` classes =
218210 case classes \\ listParagraphDivs of