git.iko.soy/typeable/pandoc
on master help sign in
Protect partial uses of maximum with NonEmpty.
commit4002c35a9184ecc1c9a6553e9ee28e283cb1fd0a authorJohn MacFarlane <jgm@berkeley.edu> dateFri 19 Mar 2021, 11:55 (6 years ago) parent8d51163
21 files changed+108−86
src/Text/Pandoc/Readers/DocBook.hs+3−3 src/Text/Pandoc/Readers/HTML/Table.hs+2−1 src/Text/Pandoc/Readers/Haddock.hs+2−1 src/Text/Pandoc/Readers/Markdown.hs+2−1 src/Text/Pandoc/Readers/Textile.hs+2−2 src/Text/Pandoc/Readers/Txt2Tags.hs+13−9 src/Text/Pandoc/Writers/AsciiDoc.hs+2−1 src/Text/Pandoc/Writers/ConTeXt.hs+4−2 src/Text/Pandoc/Writers/DokuWiki.hs+3−1 src/Text/Pandoc/Writers/Man.hs+2−2 src/Text/Pandoc/Writers/Markdown.hs+20−17 src/Text/Pandoc/Writers/Markdown/Inline.hs+3−6 src/Text/Pandoc/Writers/Ms.hs+2−2 src/Text/Pandoc/Writers/Muse.hs+6−3 src/Text/Pandoc/Writers/Org.hs+3−2 src/Text/Pandoc/Writers/Powerpoint/Output.hs+21−21 src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+2−3 src/Text/Pandoc/Writers/RST.hs+3−3 src/Text/Pandoc/Writers/Shared.hs+3−3 src/Text/Pandoc/Writers/Texinfo.hs+7−2 src/Text/Pandoc/Writers/ZimWiki.hs+3−1
src/Text/Pandoc/Readers/DocBook.hs+3−3
@@ -18,6 +18,7 @@ import Data.Either (rights)
1818import Data.Foldable (asum)
1919import Data.Generics
2020import Data.List (intersperse,elemIndex)
21+import Data.List.NonEmpty (nonEmpty)
2122import Data.Maybe (fromMaybe,mapMaybe)
2223import Data.Text (Text)
2324import qualified Data.Text as T
@@ -949,9 +950,8 @@ parseBlock (Elem e) =
949950 (x >= '0' && x <= '9')
950951 || x == '.') w
951952 if n > 0 then Just n else Nothing
952− let numrows = case bodyrows of
953− [] -> 0
954− xs -> maximum $ map length xs
953+ let numrows = maybe 0 maximum $ nonEmpty
954+ $ map length bodyrows
955955 let aligns = case colspecs of
956956 [] -> replicate numrows AlignDefault
957957 cs -> map toAlignment cs
src/Text/Pandoc/Readers/HTML/Table.hs+2−1
@@ -17,6 +17,7 @@ module Text.Pandoc.Readers.HTML.Table (pTable) where
1717
1818import Control.Applicative ((<|>))
1919import Data.Maybe (fromMaybe)
20+import Data.List.NonEmpty (nonEmpty)
2021import Data.Text (Text)
2122import Text.HTML.TagSoup
2223import Text.Pandoc.Builder (Blocks)
@@ -216,7 +217,7 @@ normalize widths head' bodies foot = do
216217 let rows = headRows head' <> concatMap bodyRows bodies <> footRows foot
217218 let cellWidth (Cell _ _ _ (ColSpan cs) _) = cs
218219 let rowLength = foldr (\cell acc -> cellWidth cell + acc) 0 . rowCells
219− let ncols = maximum (map rowLength rows)
220+ let ncols = maybe 0 maximum $ nonEmpty $ map rowLength rows
220221 let tblType = tableType (map rowCells rows)
221222 -- fail on empty table
222223 if null rows
src/Text/Pandoc/Readers/Haddock.hs+2−1
@@ -17,6 +17,7 @@ module Text.Pandoc.Readers.Haddock
1717
1818import Control.Monad.Except (throwError)
1919import Data.List (intersperse)
20+import Data.List.NonEmpty (nonEmpty)
2021import Data.Maybe (fromMaybe)
2122import Data.Text (Text, unpack)
2223import qualified Data.Text as T
@@ -92,7 +93,7 @@ docHToBlocks d' =
9293 then ([], map toCells bodyRows)
9394 else (toCells (head headerRows),
9495 map toCells (tail headerRows ++ bodyRows))
95− colspecs = replicate (maximum (map length body))
96+ colspecs = replicate (maybe 0 maximum (nonEmpty (map length body)))
9697 (AlignDefault, ColWidthDefault)
9798 in B.table B.emptyCaption
9899 colspecs
src/Text/Pandoc/Readers/Markdown.hs+2−1
@@ -22,6 +22,7 @@ import Control.Monad
2222import Control.Monad.Except (throwError)
2323import Data.Char (isAlphaNum, isPunctuation, isSpace)
2424import Data.List (transpose, elemIndex, sortOn, foldl')
25+import Data.List.NonEmpty (NonEmpty(..))
2526import qualified Data.Map as M
2627import Data.Maybe
2728import qualified Data.Set as Set
@@ -1364,7 +1365,7 @@ pipeTable = try $ do
13641365 lines' <- many pipeTableRow
13651366 let lines'' = map (take (length aligns) <$>) lines'
13661367 let maxlength = maximum $
1367− map (\x -> T.length . stringify $ runF x def) (heads' : lines'')
1368+ fmap (\x -> T.length . stringify $ runF x def) (heads' :| lines'')
13681369 numColumns <- getOption readerColumns
13691370 let widths = if maxlength > numColumns
13701371 then map (\len ->
src/Text/Pandoc/Readers/Textile.hs+2−2
@@ -39,6 +39,7 @@ import Control.Monad (guard, liftM)
3939import Control.Monad.Except (throwError)
4040import Data.Char (digitToInt, isUpper)
4141import Data.List (intersperse, transpose, foldl')
42+import Data.List.NonEmpty (NonEmpty(..), nonEmpty)
4243import Data.Text (Text)
4344import qualified Data.Text as T
4445import Text.HTML.TagSoup (Tag (..), fromAttrib)
@@ -53,7 +54,6 @@ import Text.Pandoc.Parsing
5354import Text.Pandoc.Readers.HTML (htmlTag, isBlockTag, isInlineTag)
5455import Text.Pandoc.Readers.LaTeX (rawLaTeXBlock, rawLaTeXInline)
5556import Text.Pandoc.Shared (crFilter, trim, tshow)
56−import Data.List.NonEmpty (nonEmpty)
5757
5858-- | Parse a Textile text and return a Pandoc document.
5959readTextile :: PandocMonad m
@@ -376,7 +376,7 @@ table = try $ do
376376 (toprow:rest) | any (fst . fst) toprow ->
377377 (toprow, rest)
378378 _ -> (mempty, rawrows)
379− let nbOfCols = maximum $ map length (headers:rows)
379+ let nbOfCols = maximum $ fmap length (headers :| rows)
380380 let aligns = map (maybe AlignDefault minimum . nonEmpty) $
381381 transpose $ map (map (snd . fst)) (headers:rows)
382382 let toRow = Row nullAttr . map B.simpleCell
src/Text/Pandoc/Readers/Txt2Tags.hs+13−9
@@ -1,4 +1,5 @@
11{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE LambdaCase #-}
23{- |
34 Module : Text.Pandoc.Readers.Txt2Tags
45 Copyright : Copyright (C) 2014 Matthew Pickering
@@ -19,6 +20,7 @@ import Control.Monad.Except (catchError, throwError)
1920import Control.Monad.Reader (Reader, asks, runReader)
2021import Data.Default
2122import Data.List (intercalate, transpose)
23+import Data.List.NonEmpty (nonEmpty)
2224import Data.Maybe (fromMaybe)
2325import Data.Text (Text)
2426import qualified Data.Text as T
@@ -53,14 +55,16 @@ getT2TMeta = do
5355 inps <- P.getInputFiles
5456 outp <- fromMaybe "" <$> P.getOutputFile
5557 curDate <- formatTime defaultTimeLocale "%F" <$> P.getZonedTime
56− let getModTime = fmap (formatTime defaultTimeLocale "%T") .
57− P.getModificationTime
58− curMtime <- case inps of
59− [] -> formatTime defaultTimeLocale "%T" <$> P.getZonedTime
60− _ -> catchError
61− (maximum <$> mapM getModTime inps)
62− (const (return ""))
63− return $ T2TMeta (T.pack curDate) (T.pack curMtime) (intercalate ", " inps) outp
58+ curMtime <- catchError
59+ ((nonEmpty <$> mapM P.getModificationTime inps) >>=
60+ \case
61+ Nothing ->
62+ formatTime defaultTimeLocale "%T" <$> P.getZonedTime
63+ Just ts -> return $
64+ formatTime defaultTimeLocale "%T" $ maximum ts)
65+ (const (return ""))
66+ return $ T2TMeta (T.pack curDate) (T.pack curMtime)
67+ (intercalate ", " inps) outp
6468
6569-- | Read Txt2Tags from an input string returning a Pandoc document
6670readTxt2Tags :: PandocMonad m
@@ -263,7 +267,7 @@ table = try $ do
263267 let ncolumns = length columns
264268 let aligns = map (fromMaybe AlignDefault . foldr findAlign Nothing) columns
265269 let rows' = map (map snd) rows
266− let size = maximum (map length rows')
270+ let size = maybe 0 maximum $ nonEmpty $ map length rows'
267271 let rowsPadded = map (pad size) rows'
268272 let headerPadded = if null tableHeader then mempty else pad size tableHeader
269273 let toRow = Row nullAttr . map B.simpleCell
src/Text/Pandoc/Writers/AsciiDoc.hs+2−1
@@ -22,6 +22,7 @@ module Text.Pandoc.Writers.AsciiDoc (writeAsciiDoc, writeAsciiDoctor) where
2222import Control.Monad.State.Strict
2323import Data.Char (isPunctuation, isSpace)
2424import Data.List (intercalate, intersperse)
25+import Data.List.NonEmpty (NonEmpty(..))
2526import Data.Maybe (fromMaybe, isJust)
2627import qualified Data.Set as Set
2728import qualified Data.Text as T
@@ -274,7 +275,7 @@ blockToAsciiDoc opts block@(Table _ blkCapt specs thead tbody tfoot) = do
274275 let colwidth = if writerWrapText opts == WrapAuto
275276 then writerColumns opts
276277 else 100000
277− let maxwidth = maximum $ map offset (head':rows')
278+ let maxwidth = maximum $ fmap offset (head' :| rows')
278279 let body = if maxwidth > colwidth then vsep rows' else vcat rows'
279280 let border = separator <> text "==="
280281 return $
src/Text/Pandoc/Writers/ConTeXt.hs+4−2
@@ -16,6 +16,7 @@ module Text.Pandoc.Writers.ConTeXt ( writeConTeXt ) where
1616import Control.Monad.State.Strict
1717import Data.Char (ord, isDigit)
1818import Data.List (intersperse)
19+import Data.List.NonEmpty (nonEmpty)
1920import Data.Maybe (mapMaybe)
2021import Data.Text (Text)
2122import qualified Data.Text as T
@@ -228,8 +229,9 @@ blockToConTeXt (OrderedList (start, style', delim) lst) = do
228229 Period -> "stopper=."
229230 OneParen -> "stopper=)"
230231 TwoParens -> "left=(,stopper=)"
231− let width = maximum $ map T.length $ take (length contents)
232− (orderedListMarkers (start, style', delim))
232+ let width = maybe 0 maximum $ nonEmpty $ map T.length $
233+ take (length contents)
234+ (orderedListMarkers (start, style', delim))
233235 let width' = (toEnum width + 1) / 2
234236 let width'' = if width' > (1.5 :: Double)
235237 then "width=" <> tshow width' <> "em"
src/Text/Pandoc/Writers/DokuWiki.hs+3−1
@@ -27,6 +27,7 @@ import Control.Monad.Reader (ReaderT, asks, local, runReaderT)
2727import Control.Monad.State.Strict (StateT, evalStateT)
2828import Data.Default (Default (..))
2929import Data.List (transpose)
30+import Data.List.NonEmpty (nonEmpty)
3031import Data.Text (Text)
3132import qualified Data.Text as T
3233import Text.Pandoc.Class.PandocMonad (PandocMonad, report)
@@ -172,7 +173,8 @@ blockToDokuWiki opts (Table _ blkCapt specs thead tbody tfoot) = do
172173 then return []
173174 else zipWithM (tableItemToDokuWiki opts) aligns headers
174175 rows' <- mapM (zipWithM (tableItemToDokuWiki opts) aligns) rows
175− let widths = map (maximum . map T.length) $ transpose (headers':rows')
176+ let widths = map (maybe 0 maximum . nonEmpty . map T.length)
177+ $ transpose (headers':rows')
176178 let padTo (width, al) s =
177179 case width - T.length s of
178180 x | x > 0 ->
src/Text/Pandoc/Writers/Man.hs+2−2
@@ -16,6 +16,7 @@ Conversion of 'Pandoc' documents to roff man page format.
1616module Text.Pandoc.Writers.Man ( writeMan ) where
1717import Control.Monad.State.Strict
1818import Data.List (intersperse)
19+import Data.List.NonEmpty (nonEmpty)
1920import Data.Maybe (fromMaybe)
2021import Data.Text (Text)
2122import qualified Data.Text as T
@@ -175,8 +176,7 @@ blockToMan opts (BulletList items) = do
175176 return (vcat contents)
176177blockToMan opts (OrderedList attribs items) = do
177178 let markers = take (length items) $ orderedListMarkers attribs
178− let indent = 1 +
179− maximum (map T.length markers)
179+ let indent = 1 + maybe 0 maximum (nonEmpty (map T.length markers))
180180 contents <- mapM (\(num, item) -> orderedListItemToMan opts num indent item) $
181181 zip markers items
182182 return (vcat contents)
src/Text/Pandoc/Writers/Markdown.hs+20−17
@@ -24,6 +24,7 @@ import Control.Monad.Reader
2424import Control.Monad.State.Strict
2525import Data.Default
2626import Data.List (intersperse, sortOn, transpose)
27+import Data.List.NonEmpty (nonEmpty, NonEmpty(..))
2728import qualified Data.Map as M
2829import Data.Maybe (fromMaybe, mapMaybe)
2930import qualified Data.Set as Set
@@ -492,19 +493,20 @@ blockToMarkdown' opts (CodeBlock attribs str) = do
492493 | isEnabled Ext_fenced_code_blocks opts ->
493494 tildes <> attrs <> cr <> literal str <> cr <> tildes <> blankline
494495 _ -> nest (writerTabStop opts) (literal str) <> blankline
495− where endline c = literal $ case [T.length ln
496− | ln <- map trim (T.lines str)
497− , T.pack [c,c,c] `T.isPrefixOf` ln
498− , T.all (== c) ln] of
499− [] -> T.replicate 3 $ T.singleton c
500− xs -> T.replicate (maximum xs + 1) $ T.singleton c
501− backticks = endline '`'
502− tildes = endline '~'
503− attrs = if isEnabled Ext_fenced_code_attributes opts
504− then nowrap $ " " <> attrsToMarkdown attribs
505− else case attribs of
506− (_,cls:_,_) -> " " <> literal cls
507− _ -> empty
496+ where
497+ endlineLen c = maybe 3 ((+1) . maximum) $ nonEmpty $
498+ [T.length ln
499+ | ln <- map trim (T.lines str)
500+ , T.pack [c,c,c] `T.isPrefixOf` ln
501+ , T.all (== c) ln]
502+ endline c = literal $ T.replicate (endlineLen c) $ T.singleton c
503+ backticks = endline '`'
504+ tildes = endline '~'
505+ attrs = if isEnabled Ext_fenced_code_attributes opts
506+ then nowrap $ " " <> attrsToMarkdown attribs
507+ else case attribs of
508+ (_,cls:_,_) -> " " <> literal cls
509+ _ -> empty
508510blockToMarkdown' opts (BlockQuote blocks) = do
509511 variant <- asks envVariant
510512 -- if we're writing literate haskell, put a space before the bird tracks
@@ -517,7 +519,7 @@ blockToMarkdown' opts (BlockQuote blocks) = do
517519 return $ prefixed leader contents <> blankline
518520blockToMarkdown' opts t@(Table _ blkCapt specs thead tbody tfoot) = do
519521 let (caption, aligns, widths, headers, rows) = toLegacyTable blkCapt specs thead tbody tfoot
520− let numcols = maximum (length aligns : length widths :
522+ let numcols = maximum (length aligns :| length widths :
521523 map length (headers:rows))
522524 caption' <- inlineListToMarkdown opts caption
523525 let caption''
@@ -619,7 +621,8 @@ pipeTable headless aligns rawHeaders rawRows = do
619621 blockFor AlignCenter x y = cblock (x + 2) (sp <> y <> sp) <> lblock 0 empty
620622 blockFor AlignRight x y = rblock (x + 2) (y <> sp) <> lblock 0 empty
621623 blockFor _ x y = lblock (x + 2) (sp <> y) <> lblock 0 empty
622− let widths = map (max 3 . maximum . map offset) $ transpose (rawHeaders : rawRows)
624+ let widths = map (max 3 . maybe 3 maximum . nonEmpty . map offset) $
625+ transpose (rawHeaders : rawRows)
623626 let torow cs = nowrap $ literal "|" <>
624627 hcat (intersperse (literal "|") $
625628 zipWith3 blockFor aligns widths (map chomp cs))
@@ -653,11 +656,11 @@ pandocTable opts multiline headless aligns widths rawHeaders rawRows = do
653656 -- Number of characters per column necessary to output every cell
654657 -- without requiring a line break.
655658 -- The @+2@ is needed for specifying the alignment.
656− let numChars = (+ 2) . maximum . map offset
659+ let numChars = (+ 2) . maybe 0 maximum . nonEmpty . map offset
657660 -- Number of characters per column necessary to output every cell
658661 -- without requiring a line break *inside a word*.
659662 -- The @+2@ is needed for specifying the alignment.
660− let minNumChars = (+ 2) . maximum . map minOffset
663+ let minNumChars = (+ 2) . maybe 0 maximum . nonEmpty . map minOffset
661664 let columns = transpose (rawHeaders : rawRows)
662665 -- minimal column width without wrapping a single word
663666 let relWidth w col =
src/Text/Pandoc/Writers/Markdown/Inline.hs+3−6
@@ -17,6 +17,7 @@ import Control.Monad.Reader
1717import Control.Monad.State.Strict
1818import Data.Char (isAlphaNum, isDigit)
1919import Data.List (find, intersperse)
20+import Data.List.NonEmpty (nonEmpty)
2021import qualified Data.Map as M
2122import Data.Maybe (fromMaybe)
2223import Data.Text (Text)
@@ -383,9 +384,7 @@ inlineToMarkdown opts (Quoted DoubleQuote lst) = do
383384 else "“" <> contents <> "”"
384385inlineToMarkdown opts (Code attr str) = do
385386 let tickGroups = filter (T.any (== '`')) $ T.group str
386− let longest = if null tickGroups
387− then 0
388− else maximum $ map T.length tickGroups
387+ let longest = maybe 0 maximum $ nonEmpty $ map T.length tickGroups
389388 let marker = T.replicate (longest + 1) "`"
390389 let spacer = if longest == 0 then "" else " "
391390 let attrs = if isEnabled Ext_inline_code_attributes opts && attr /= nullAttr
@@ -438,9 +437,7 @@ inlineToMarkdown opts (Math DisplayMath str) =
438437 (texMathToInlines DisplayMath str >>= inlineListToMarkdown opts)
439438inlineToMarkdown opts il@(RawInline f str) = do
440439 let tickGroups = filter (T.any (== '`')) $ T.group str
441− let numticks = if null tickGroups
442− then 1
443− else 1 + maximum (map T.length tickGroups)
440+ let numticks = 1 + maybe 0 maximum (nonEmpty (map T.length tickGroups))
444441 variant <- asks envVariant
445442 let Format fmt = f
446443 let rawAttribInline = return $
src/Text/Pandoc/Writers/Ms.hs+2−2
@@ -23,6 +23,7 @@ module Text.Pandoc.Writers.Ms ( writeMs ) where
2323import Control.Monad.State.Strict
2424import Data.Char (isLower, isUpper, ord)
2525import Data.List (intercalate, intersperse)
26+import Data.List.NonEmpty (nonEmpty)
2627import qualified Data.Map as Map
2728import Data.Maybe (catMaybes)
2829import Data.Text (Text)
@@ -274,8 +275,7 @@ blockToMs opts (BulletList items) = do
274275 return (vcat contents)
275276blockToMs opts (OrderedList attribs items) = do
276277 let markers = take (length items) $ orderedListMarkers attribs
277− let indent = 2 +
278− maximum (map T.length markers)
278+ let indent = 2 + maybe 0 maximum (nonEmpty (map T.length markers))
279279 contents <- mapM (\(num, item) -> orderedListItemToMs opts num indent item) $
280280 zip markers items
281281 setFirstPara
src/Text/Pandoc/Writers/Muse.hs+6−3
@@ -31,6 +31,7 @@ import Control.Monad.State.Strict
3131import Data.Char (isAlphaNum, isAsciiLower, isAsciiUpper, isDigit, isSpace)
3232import Data.Default
3333import Data.List (intersperse, transpose)
34+import Data.List.NonEmpty (nonEmpty, NonEmpty(..))
3435import qualified Data.Set as Set
3536import qualified Data.Text as T
3637import Data.Text (Text)
@@ -158,7 +159,8 @@ simpleTable caption headers rows = do
158159 caption' <- inlineListToMuse caption
159160 headers' <- mapM blockListToMuse headers
160161 rows' <- mapM (mapM blockListToMuse) rows
161− let widthsInChars = maximum . map offset <$> transpose (headers' : rows')
162+ let widthsInChars = maybe 0 maximum . nonEmpty . map offset <$>
163+ transpose (headers' : rows')
162164 let hpipeBlocks sep blocks = hcat $ intersperse sep' blocks
163165 where sep' = lblock (T.length sep) $ literal sep
164166 let makeRow sep = hpipeBlocks sep . zipWith lblock widthsInChars
@@ -238,7 +240,7 @@ blockToMuse (DefinitionList items) = do
238240 label' <- local (\env -> env { envOneLine = True, envAfterSpace = True }) $ inlineListToMuse' label
239241 let ind = offset' label' -- using Text.DocLayout.offset results in round trip failures
240242 hang ind (nowrap label') . vcat <$> mapM descriptionToMuse defs
241− where offset' d = maximum (0: map T.length
243+ where offset' d = maximum (0 :| map T.length
242244 (T.lines $ render Nothing d))
243245 descriptionToMuse :: PandocMonad m
244246 => [Block]
@@ -269,7 +271,8 @@ blockToMuse (Table _ blkCapt specs thead tbody tfoot) =
269271 (caption, aligns, widths, headers, rows) = toLegacyTable blkCapt specs thead tbody tfoot
270272 blocksToDoc opts blocks =
271273 local (\env -> env { envOptions = opts }) $ blockListToMuse blocks
272− numcols = maximum (length aligns : length widths : map length (headers:rows))
274+ numcols = maximum
275+ (length aligns :| length widths : map length (headers:rows))
273276 isSimple = onlySimpleTableCells (headers : rows) && all (== 0) widths
274277blockToMuse (Div _ bs) = flatBlockListToMuse bs
275278blockToMuse Null = return empty
src/Text/Pandoc/Writers/Org.hs+3−2
@@ -19,6 +19,7 @@ module Text.Pandoc.Writers.Org (writeOrg) where
1919import Control.Monad.State.Strict
2020import Data.Char (isAlphaNum, isDigit)
2121import Data.List (intersect, intersperse, partition, transpose)
22+import Data.List.NonEmpty (nonEmpty)
2223import Data.Text (Text)
2324import qualified Data.Text as T
2425import Text.Pandoc.Class.PandocMonad (PandocMonad, report)
@@ -163,7 +164,7 @@ blockToOrg (Table _ blkCapt specs thead tbody tfoot) = do
163164 else "#+caption: " <> caption''
164165 headers' <- mapM blockListToOrg headers
165166 rawRows <- mapM (mapM blockListToOrg) rows
166− let numChars = maximum . map offset
167+ let numChars = maybe 0 maximum . nonEmpty . map offset
167168 -- FIXME: width is not being used.
168169 let widthsInChars =
169170 map numChars $ transpose (headers' : rawRows)
@@ -198,7 +199,7 @@ blockToOrg (OrderedList (start, _, delim) items) = do
198199 x -> x
199200 let markers = take (length items) $ orderedListMarkers
200201 (start, Decimal, delim')
201− let maxMarkerLength = maximum $ map T.length markers
202+ let maxMarkerLength = maybe 0 maximum . nonEmpty $ map T.length markers
202203 let markers' = map (\m -> let s = maxMarkerLength - T.length m
203204 in m <> T.replicate s " ") markers
204205 contents <- zipWithM orderedListItemToOrg markers' items
src/Text/Pandoc/Writers/Powerpoint/Output.hs+21−21
@@ -475,15 +475,16 @@ registerLink link = do
475475 linkReg <- gets stLinkIds
476476 mediaReg <- gets stMediaIds
477477 hasSpeakerNotes <- curSlideHasSpeakerNotes
478− let maxLinkId = case M.lookup curSlideId linkReg of
479− Just mp -> case M.keys mp of
480− [] -> if hasSpeakerNotes then 2 else 1
481− ks -> maximum ks
482− Nothing -> if hasSpeakerNotes then 2 else 1
483− maxMediaId = case M.lookup curSlideId mediaReg of
484− Just [] -> if hasSpeakerNotes then 2 else 1
485− Just mInfos -> maximum $ map mInfoLocalId mInfos
486− Nothing -> if hasSpeakerNotes then 2 else 1
478+ let maxLinkId = case M.lookup curSlideId linkReg >>= nonEmpty . M.keys of
479+ Just xs -> maximum xs
480+ Nothing
481+ | hasSpeakerNotes -> 2
482+ | otherwise -> 1
483+ maxMediaId = case M.lookup curSlideId mediaReg >>= nonEmpty of
484+ Just mInfos -> maximum $ fmap mInfoLocalId mInfos
485+ Nothing
486+ | hasSpeakerNotes -> 2
487+ | otherwise -> 1
487488 maxId = max maxLinkId maxMediaId
488489 slideLinks = case M.lookup curSlideId linkReg of
489490 Just mp -> M.insert (maxId + 1) link mp
@@ -498,20 +499,19 @@ registerMedia fp caption = do
498499 mediaReg <- gets stMediaIds
499500 globalIds <- gets stMediaGlobalIds
500501 hasSpeakerNotes <- curSlideHasSpeakerNotes
501− let maxLinkId = case M.lookup curSlideId linkReg of
502− Just mp -> case M.keys mp of
503− [] -> if hasSpeakerNotes then 2 else 1
504− ks -> maximum ks
505− Nothing -> if hasSpeakerNotes then 2 else 1
506− maxMediaId = case M.lookup curSlideId mediaReg of
507− Just [] -> if hasSpeakerNotes then 2 else 1
508− Just mInfos -> maximum $ map mInfoLocalId mInfos
509− Nothing -> if hasSpeakerNotes then 2 else 1
502+ let maxLinkId = case M.lookup curSlideId linkReg >>= nonEmpty . M.keys of
503+ Just ks -> maximum ks
504+ Nothing
505+ | hasSpeakerNotes -> 2
506+ | otherwise -> 1
507+ maxMediaId = case M.lookup curSlideId mediaReg >>= nonEmpty of
508+ Just mInfos -> maximum $ fmap mInfoLocalId mInfos
509+ Nothing
510+ | hasSpeakerNotes -> 2
511+ | otherwise -> 1
510512 maxLocalId = max maxLinkId maxMediaId
511513
512− maxGlobalId = case M.elems globalIds of
513− [] -> 0
514− ids -> maximum ids
514+ maxGlobalId = maybe 0 maximum $ nonEmpty $ M.elems globalIds
515515
516516 (imgBytes, mbMt) <- P.fetchItem $ T.pack fp
517517 let imgExt = (mbMt >>= extensionFromMimeType >>= (\x -> return $ "." <> x))
src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+2−3
@@ -45,6 +45,7 @@ module Text.Pandoc.Writers.Powerpoint.Presentation ( documentToPresentation
4545import Control.Monad.Reader
4646import Control.Monad.State
4747import Data.List (intercalate)
48+import Data.List.NonEmpty (nonEmpty)
4849import Data.Default
4950import Text.Pandoc.Definition
5051import Text.Pandoc.ImageSize
@@ -363,9 +364,7 @@ inlineToParElems (Note blks) = do
363364 then return []
364365 else do
365366 notes <- gets stNoteIds
366− let maxNoteId = case M.keys notes of
367− [] -> 0
368− lst -> maximum lst
367+ let maxNoteId = maybe 0 maximum $ nonEmpty $ M.keys notes
369368 curNoteId = maxNoteId + 1
370369 modify $ \st -> st { stNoteIds = M.insert curNoteId blks notes }
371370 local (\env -> env{envRunProps = (envRunProps env){rLink = Just $ InternalTarget endNotesSlideId}}) $
src/Text/Pandoc/Writers/RST.hs+3−3
@@ -17,6 +17,7 @@ module Text.Pandoc.Writers.RST ( writeRST, flatten ) where
1717import Control.Monad.State.Strict
1818import Data.Char (isSpace)
1919import Data.List (transpose, intersperse, foldl')
20+import Data.List.NonEmpty (nonEmpty)
2021import Data.Maybe (fromMaybe)
2122import qualified Data.Text as T
2223import Data.Text (Text)
@@ -335,7 +336,7 @@ blockToRST (OrderedList (start, style', delim) items) = do
335336 then replicate (length items) "#."
336337 else take (length items) $ orderedListMarkers
337338 (start, style', delim)
338− let maxMarkerLength = maximum $ map T.length markers
339+ let maxMarkerLength = maybe 0 maximum $ nonEmpty $ map T.length markers
339340 let markers' = map (\m -> let s = maxMarkerLength - T.length m
340341 in m <> T.replicate s " ") markers
341342 contents <- zipWithM orderedListItemToRST markers' items
@@ -761,8 +762,7 @@ simpleTable opts blocksToDoc headers rows = do
761762 then return []
762763 else fixEmpties <$> mapM (blocksToDoc opts) headers
763764 rowDocs <- mapM (fmap fixEmpties . mapM (blocksToDoc opts)) rows
764− let numChars [] = 0
765− numChars xs = maximum . map offset $ xs
765+ let numChars = maybe 0 maximum . nonEmpty . map offset
766766 let colWidths = map numChars $ transpose (headerDocs : rowDocs)
767767 let toRow = mconcat . intersperse (lblock 1 " ") . zipWith lblock colWidths
768768 let hline = nowrap $ hsep (map (\n -> literal (T.replicate n "=")) colWidths)
src/Text/Pandoc/Writers/Shared.hs+3−3
@@ -44,6 +44,7 @@ import Control.Monad (zipWithM)
4444import Data.Aeson (ToJSON (..), encode)
4545import Data.Char (chr, ord, isSpace)
4646import Data.List (groupBy, intersperse, transpose, foldl')
47+import Data.List.NonEmpty (NonEmpty(..), nonEmpty)
4748import Data.Text.Conversions (FromText(..))
4849import qualified Data.Map as M
4950import qualified Data.Text as T
@@ -224,7 +225,7 @@ gridTable :: (Monad m, HasChars a)
224225 -> m (Doc a)
225226gridTable opts blocksToDoc headless aligns widths headers rows = do
226227 -- the number of columns will be used in case of even widths
227− let numcols = maximum (length aligns : length widths :
228+ let numcols = maximum (length aligns :| length widths :
228229 map length (headers:rows))
229230 let officialWidthsInChars widths' = map (
230231 (\x -> if x < 1 then 1 else x) .
@@ -253,8 +254,7 @@ gridTable opts blocksToDoc headless aligns widths headers rows = do
253254 let handleFullWidths widths' = do
254255 rawHeaders' <- mapM (blocksToDoc opts) headers
255256 rawRows' <- mapM (mapM (blocksToDoc opts)) rows
256− let numChars [] = 0
257− numChars xs = maximum . map offset $ xs
257+ let numChars = maybe 0 maximum . nonEmpty . map offset
258258 let minWidthsInChars =
259259 map numChars $ transpose (rawHeaders' : rawRows')
260260 let widthsInChars' = zipWith max
src/Text/Pandoc/Writers/Texinfo.hs+7−2
@@ -16,6 +16,7 @@ import Control.Monad.Except (throwError)
1616import Control.Monad.State.Strict
1717import Data.Char (chr, ord)
1818import Data.List (maximumBy, transpose, foldl')
19+import Data.List.NonEmpty (nonEmpty)
1920import Data.Ord (comparing)
2021import qualified Data.Set as Set
2122import Data.Text (Text)
@@ -238,9 +239,13 @@ blockToTexinfo (Table _ blkCapt specs thead tbody tfoot) = do
238239 colDescriptors <-
239240 if all (== 0) widths
240241 then do -- use longest entry instead of column widths
241− cols <- mapM (mapM (liftM (T.unpack . render Nothing . hcat) . mapM blockToTexinfo)) $
242+ cols <- mapM (mapM (fmap (T.unpack . render Nothing . hcat) .
243+ mapM blockToTexinfo)) $
242244 transpose $ heads : rows
243− return $ concatMap ((\x -> "{"++x++"} ") . maximumBy (comparing length)) cols
245+ return $ concatMap
246+ ((\x -> "{"++x++"} ") .
247+ maybe "" (maximumBy (comparing length)) . nonEmpty)
248+ cols
244249 else return $ "@columnfractions " ++ concatMap (printf "%.2f ") widths
245250 let tableBody = text ("@multitable " ++ colDescriptors) $$
246251 headers $$
src/Text/Pandoc/Writers/ZimWiki.hs+3−1
@@ -20,6 +20,7 @@ import Control.Monad (zipWithM)
2020import Control.Monad.State.Strict (StateT, evalStateT, gets, modify)
2121import Data.Default (Default (..))
2222import Data.List (transpose)
23+import Data.List.NonEmpty (nonEmpty)
2324import qualified Data.Map as Map
2425import Text.DocLayout (render, literal)
2526import Data.Maybe (fromMaybe)
@@ -143,7 +144,8 @@ blockToZimWiki opts (Table _ blkCapt specs thead tbody tfoot) = do
143144 then zipWithM (tableItemToZimWiki opts) aligns (head rows)
144145 else mapM (inlineListToZimWiki opts . removeFormatting)headers -- emphasis, links etc. are not allowed in table headers
145146 rows' <- mapM (zipWithM (tableItemToZimWiki opts) aligns) rows
146− let widths = map (maximum . map T.length) $ transpose (headers':rows')
147+ let widths = map (maybe 0 maximum . nonEmpty . map T.length) $
148+ transpose (headers':rows')
147149 let padTo (width, al) s =
148150 case width - T.length s of
149151 x | x > 0 ->