git.iko.soy/typeable/pandoc
on master help sign in
custom ordered lists
commitc2ae72aa6cee5aebb85228b5cc6fe6a620cf42f7 authorYan Pas <yanp.bugz@gmail.com> dateSun 27 May 2018, 14:09 (8 years ago) parent9030c5a
1 file changed+26−16
src/Text/Pandoc/Readers/Man.hs+26−16
src/Text/Pandoc/Readers/Man.hs+26−16
@@ -39,7 +39,7 @@ import Control.Monad.Except (throwError)
3939import Data.Char (isDigit, isUpper, isLower)
4040import Data.Default (Default)
4141import Data.Map (insert)
42−import Data.Maybe (catMaybes)
42+import Data.Maybe (catMaybes, fromMaybe, isNothing)
4343import Data.List (intersperse, intercalate)
4444import qualified Data.Text as T
4545
@@ -153,7 +153,7 @@ lexMan = many (lexMacro <|> lexLine <|> lexEmptyLine)
153153
154154parseMan :: PandocMonad m => ManParser m Pandoc
155155parseMan = do
156− let parsers = [ try parseBulletList, parseTitle, parsePara, parseSkippedContent
156+ let parsers = [ try parseList, parseTitle, parsePara, parseSkippedContent
157157 , parseCodeBlock, parseHeader, parseSkipMacro]
158158 blocks <- many $ choice parsers
159159 parserst <- getState
@@ -210,7 +210,7 @@ escapeLexer = do
210210 letterFont = choice [
211211 char 'B' >> return Bold
212212 , char 'I' >> return Italic
213− , char 'P' >> return Regular
213+ , (char 'P' <|> char 'R') >> return Regular
214214 ]
215215
216216currentFont :: PandocMonad m => ManLexer m FontKind
@@ -248,6 +248,7 @@ lexMacro = do
248248
249249 where
250250
251+ -- TODO rework args
251252 lexArgs :: PandocMonad m => ManLexer m [RoffStr]
252253 lexArgs = do
253254 args <- many oneArg
@@ -478,38 +479,47 @@ parseHeader = do
478479 (MHeader lvl ss) <- mheader
479480 return $ Header lvl nullAttr $ intersperse Space $ strToInline <$> ss
480481
481−parseBulletList :: PandocMonad m => ManParser m Block
482−parseBulletList = BulletList <$> many1 paras where
482+type ListBuilder = [[Block]] -> Block
483+
484+parseList :: PandocMonad m => ManParser m Block
485+parseList = do
486+ xx <- many1 paras
487+ let bls = map snd xx
488+ let bldr = fst $ head xx
489+ return $ bldr bls
490+
491+ where
483492
484493 macroIPInl :: [RoffStr] -> [Inline]
485494 macroIPInl (x:_:[]) = [strToInline x, Space]
486495 macroIPInl _ = []
487496
488− listKind :: [RoffStr] -> Maybe ([[Block]] -> Block)
497+ listKind :: [RoffStr] -> Maybe ListBuilder
489498 listKind (((c:_), _):_:[]) =
490499 let params style = OrderedList (1, style, DefaultDelim)
491− in Just $ case c of
492− _ | isDigit c -> params Decimal
493− _ | isUpper c -> params UpperAlpha
494− _ | isLower c -> params LowerAlpha
495− _ -> BulletList
500+ in case c of
501+ _ | isDigit c -> Just $ params Decimal
502+ _ | isUpper c -> Just $ params UpperAlpha
503+ _ | isLower c -> Just $ params LowerAlpha
504+ _ -> Nothing
496505
497506 listKind _ = Nothing
498507
499− paras :: PandocMonad m => ManParser m [Block]
508+ paras :: PandocMonad m => ManParser m (ListBuilder, [Block])
500509 paras = do
501510 (MMacro _ args) <- mmacro KTab
502− let lk = listKind args
511+ let lbuilderOpt = listKind args
512+ let lbuilder = fromMaybe BulletList lbuilderOpt
503513 inls <- parseInlines
504514 let macroinl = macroIPInl args
505− let para = Plain $ macroinl ++ inls
515+ let parainls = if isNothing lbuilderOpt then macroinl ++ inls else inls
506516 subls <- many sublist
507− return $ para : subls
517+ return $ (lbuilder, (Plain parainls) : subls)
508518
509519 sublist :: PandocMonad m => ManParser m Block
510520 sublist = do
511521 mmacro KSubTab
512− bl <- parseBulletList
522+ bl <- parseList
513523 mmacro KTabEnd
514524 return bl
515525