module Text.Pandoc.Readers.Org.BlockStarts
( exampleLineStart
, hline
, noteMarker
, tableStart
, drawerStart
, headerStart
, metaLineStart
, latexEnvStart
, commentLineStart
, bulletListStart
, orderedListStart
, endOfBlock
) where
import Control.Monad ( void )
import Text.Pandoc.Readers.Org.Parsing
hline :: OrgParser ()
hline = try $ do
skipSpaces
string "-----"
many (char '-')
skipSpaces
newline
return ()
headerStart :: OrgParser Int
headerStart = try $
(length <$> many1 (char '*')) <* many1 (char ' ') <* updateLastPreCharPos
tableStart :: OrgParser Char
tableStart = try $ skipSpaces *> char '|'
latexEnvStart :: OrgParser String
latexEnvStart = try $ do
skipSpaces *> string "\\begin{"
*> latexEnvName
<* string "}"
<* blankline
where
latexEnvName :: OrgParser String
latexEnvName = try $ mappend <$> many1 alphaNum <*> option "" (string "*")
bulletListStart :: OrgParser ()
bulletListStart = try $
choice
[ () <$ skipSpaces <* oneOf "+-" <* skipSpaces1
, () <$ skipSpaces1 <* char '*' <* skipSpaces1
]
genericListStart :: OrgParser String
-> OrgParser Int
genericListStart listMarker = try $
(+) <$> (length <$> many spaceChar)
<*> (length <$> listMarker <* many1 spaceChar)
orderedListStart :: OrgParser Int
orderedListStart = genericListStart orderedListMarker
where orderedListMarker = mappend <$> many1 digit <*> (pure <$> oneOf ".)")
drawerStart :: OrgParser String
drawerStart = try $
skipSpaces *> drawerName <* skipSpaces <* newline
where drawerName = char ':' *> manyTill nonspaceChar (char ':')
metaLineStart :: OrgParser ()
metaLineStart = try $ skipSpaces <* string "#+"
commentLineStart :: OrgParser ()
commentLineStart = try $ skipSpaces <* string "# "
exampleLineStart :: OrgParser ()
exampleLineStart = () <$ try (skipSpaces *> string ": ")
noteMarker :: OrgParser String
noteMarker = try $ do
char '['
choice [ many1Till digit (char ']')
, (++) <$> string "fn:"
<*> many1Till (noneOf "\n\r\t ") (char ']')
]
endOfBlock :: OrgParser ()
endOfBlock = lookAhead . try $ do
void blankline <|> anyBlockStart
where
anyBlockStart :: OrgParser ()
anyBlockStart = try . choice $
[ exampleLineStart
, hline
, metaLineStart
, commentLineStart
, void noteMarker
, void tableStart
, void drawerStart
, void headerStart
, void latexEnvStart
, void bulletListStart
, void orderedListStart
]