diff options
| author | Lucas Viana <l240191@dac.unicamp.br> | 2022-01-06 16:30:20 -0300 |
|---|---|---|
| committer | John MacFarlane <jgm@berkeley.edu> | 2022-01-09 09:39:27 -0800 |
| commit | fb91a916154b70696fc7e533a7db83e847218715 (patch) | |
| tree | f49172ba2eef9e7a3fbec5eccf7c6f8e3698153e /src/Text | |
| parent | 66636c89b03e75c76ed17904b9adc0a1772f419b (diff) | |
Org reader: support alphabetical (fancy) lists
This adds support for alphabetical lists in org by enabling the
extension Ext_fancy_lists, mimicking the behaviour of Org Mode when
org-list-allow-alphabetical is enabled.
Enabling Ext_fancy_lists will also make Pandoc differentiate between the
delimiters of ordered lists (periods or closing parentheses). Org does
this differentiation by default when exporting to some formats (e.g.
plain text) but does not in others (e.g. html and latex), so I decided
to copy Pandoc's markdown reader behaviour.
Diffstat (limited to 'src/Text')
| -rw-r--r-- | src/Text/Pandoc/Extensions.hs | 1 | ||||
| -rw-r--r-- | src/Text/Pandoc/Readers/Org/BlockStarts.hs | 26 | ||||
| -rw-r--r-- | src/Text/Pandoc/Readers/Org/Blocks.hs | 5 |
3 files changed, 22 insertions, 10 deletions
diff --git a/src/Text/Pandoc/Extensions.hs b/src/Text/Pandoc/Extensions.hs index 4da0df278..f82ac631b 100644 --- a/src/Text/Pandoc/Extensions.hs +++ b/src/Text/Pandoc/Extensions.hs @@ -536,6 +536,7 @@ getAllExtensions f = universalExtensions <> getAll f extensionsFromList [ Ext_citations , Ext_smart + , Ext_fancy_lists , Ext_task_lists ] getAll "html" = autoIdExtensions <> diff --git a/src/Text/Pandoc/Readers/Org/BlockStarts.hs b/src/Text/Pandoc/Readers/Org/BlockStarts.hs index eee13834e..e5b2f7041 100644 --- a/src/Text/Pandoc/Readers/Org/BlockStarts.hs +++ b/src/Text/Pandoc/Readers/Org/BlockStarts.hs @@ -28,7 +28,8 @@ import Data.Text (Text) import Text.Pandoc.Readers.Org.Parsing import Text.Pandoc.Definition as Pandoc import Text.Pandoc.Shared (safeRead) -import Data.Char (toLower) +import Text.Pandoc.Parsing (lowerAlpha, upperAlpha) +import Data.Functor (($>)) -- | Horizontal Line (five -- dashes or more) hline :: Monad m => OrgParser m () @@ -65,13 +66,12 @@ latexEnvStart = try $ listCounterCookie :: Monad m => OrgParser m Int listCounterCookie = try $ string "[@" - *> ((many1Char digit >>= safeRead) <|> numFromAlph <$> oneOf asciiAlph) + *> parseNum <* char ']' <* (skipSpaces <|> lookAhead eol) - where - asciiAlph = ['a'..'z'] ++ ['A'..'Z'] - -- The number makes sense because char is always in asciiAlph - numFromAlph c = fromEnum (toLower c) - fromEnum 'a' + 1 + where parseNum = (safeRead =<< many1Char digit) + <|> snd <$> lowerAlpha + <|> snd <$> upperAlpha bulletListStart :: Monad m => OrgParser m Int bulletListStart = try $ do @@ -88,12 +88,20 @@ eol = void (char '\n') orderedListStart :: Monad m => OrgParser m (Int, ListAttributes) orderedListStart = try $ do ind <- length <$> many spaceChar - orderedListMarker + style <- choice styles + delim <- choice delims skipSpaces1 <|> lookAhead eol start <- option 1 listCounterCookie - return (ind + 1, (start, DefaultStyle, DefaultDelim)) + return (ind + 1, (start, style, delim)) -- Ordered list markers allowed in org-mode - where orderedListMarker = many1Char digit *> oneOf ".)" + where + styles = [ many1Char digit $> Decimal + , fst <$> lowerAlpha + , fst <$> upperAlpha + ] + delims = [ char '.' $> Period + , char ')' $> OneParen + ] drawerStart :: Monad m => OrgParser m Text drawerStart = try $ skipSpaces *> drawerName <* skipSpaces <* newline diff --git a/src/Text/Pandoc/Readers/Org/Blocks.hs b/src/Text/Pandoc/Readers/Org/Blocks.hs index 957bf6f8d..6b759901a 100644 --- a/src/Text/Pandoc/Readers/Org/Blocks.hs +++ b/src/Text/Pandoc/Readers/Org/Blocks.hs @@ -835,8 +835,11 @@ indented indentedMarker minIndent = try $ do orderedList :: PandocMonad m => OrgParser m (F Blocks) orderedList = try $ do (indent, attr) <- lookAhead orderedListStart - fmap (B.orderedListWith attr . compactify) . sequence + attr' <- option (fst3 attr, DefaultStyle, DefaultDelim) $ + guardEnabled Ext_fancy_lists $> attr + fmap (B.orderedListWith attr' . compactify) . sequence <$> many1 (listItem ((fst <$> orderedListStart) `indented` indent)) + where fst3 (x,_,_) = x definitionListItem :: PandocMonad m => OrgParser m Int |
