module Text.Jira.Parser.Core
(
JiraParser
, ParserState (..)
, defaultState
, parseJira
, withStateFlag
, updateLastStrPos
, updateLastSpcPos
, notAfterString
, afterString
, afterSpace
, endOfPara
, notFollowedBy'
, many1Till
, blankline
, skipSpaces
, blockNames
, parameters
) where
import Control.Monad (join, void)
import Data.Text (Text, pack)
import Text.Jira.Markup
import Text.Parsec
type JiraParser = Parsec Text ParserState
data ParserState = ParserState
{ ParserState -> Bool
stateInLink :: Bool
, ParserState -> Bool
stateInList :: Bool
, ParserState -> Bool
stateInMarkup :: Bool
, ParserState -> Bool
stateInTable :: Bool
, ParserState -> Maybe SourcePos
stateLastSpcPos :: Maybe SourcePos
, ParserState -> Maybe SourcePos
stateLastStrPos :: Maybe SourcePos
}
defaultState :: ParserState
defaultState :: ParserState
defaultState = ParserState :: Bool
-> Bool
-> Bool
-> Bool
-> Maybe SourcePos
-> Maybe SourcePos
-> ParserState
ParserState
{ stateInLink :: Bool
stateInLink = Bool
False
, stateInList :: Bool
stateInList = Bool
False
, stateInMarkup :: Bool
stateInMarkup = Bool
False
, stateInTable :: Bool
stateInTable = Bool
False
, stateLastSpcPos :: Maybe SourcePos
stateLastSpcPos = Maybe SourcePos
forall a. Maybe a
Nothing
, stateLastStrPos :: Maybe SourcePos
stateLastStrPos = Maybe SourcePos
forall a. Maybe a
Nothing
}
withStateFlag :: (Bool -> ParserState -> ParserState)
-> JiraParser a
-> JiraParser a
withStateFlag :: (Bool -> ParserState -> ParserState)
-> JiraParser a -> JiraParser a
withStateFlag Bool -> ParserState -> ParserState
flagSetter JiraParser a
parser = JiraParser a -> JiraParser a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (JiraParser a -> JiraParser a) -> JiraParser a -> JiraParser a
forall a b. (a -> b) -> a -> b
$
let setFlag :: Bool -> ParsecT s ParserState Identity ()
setFlag = (ParserState -> ParserState) -> ParsecT s ParserState Identity ()
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
modifyState ((ParserState -> ParserState) -> ParsecT s ParserState Identity ())
-> (Bool -> ParserState -> ParserState)
-> Bool
-> ParsecT s ParserState Identity ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> ParserState -> ParserState
flagSetter
in Bool -> ParsecT Text ParserState Identity ()
forall s. Bool -> ParsecT s ParserState Identity ()
setFlag Bool
True ParsecT Text ParserState Identity ()
-> JiraParser a -> JiraParser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> JiraParser a
parser JiraParser a
-> ParsecT Text ParserState Identity () -> JiraParser a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Bool -> ParsecT Text ParserState Identity ()
forall s. Bool -> ParsecT s ParserState Identity ()
setFlag Bool
False
updateLastStrPos :: JiraParser ()
updateLastStrPos :: ParsecT Text ParserState Identity ()
updateLastStrPos = do
SourcePos
pos <- ParsecT Text ParserState Identity SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(ParserState -> ParserState)
-> ParsecT Text ParserState Identity ()
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
modifyState ((ParserState -> ParserState)
-> ParsecT Text ParserState Identity ())
-> (ParserState -> ParserState)
-> ParsecT Text ParserState Identity ()
forall a b. (a -> b) -> a -> b
$ \ParserState
st -> ParserState
st { stateLastStrPos :: Maybe SourcePos
stateLastStrPos = SourcePos -> Maybe SourcePos
forall a. a -> Maybe a
Just SourcePos
pos }
updateLastSpcPos :: JiraParser ()
updateLastSpcPos :: ParsecT Text ParserState Identity ()
updateLastSpcPos = do
SourcePos
pos <- ParsecT Text ParserState Identity SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
(ParserState -> ParserState)
-> ParsecT Text ParserState Identity ()
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
modifyState ((ParserState -> ParserState)
-> ParsecT Text ParserState Identity ())
-> (ParserState -> ParserState)
-> ParsecT Text ParserState Identity ()
forall a b. (a -> b) -> a -> b
$ \ParserState
st -> ParserState
st { stateLastSpcPos :: Maybe SourcePos
stateLastSpcPos = SourcePos -> Maybe SourcePos
forall a. a -> Maybe a
Just SourcePos
pos }
afterString :: JiraParser Bool
afterString :: JiraParser Bool
afterString = do
SourcePos
curPos <- ParsecT Text ParserState Identity SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Maybe SourcePos
prevPos <- ParserState -> Maybe SourcePos
stateLastStrPos (ParserState -> Maybe SourcePos)
-> ParsecT Text ParserState Identity ParserState
-> ParsecT Text ParserState Identity (Maybe SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text ParserState Identity ParserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
Bool -> JiraParser Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (SourcePos -> Maybe SourcePos
forall a. a -> Maybe a
Just SourcePos
curPos Maybe SourcePos -> Maybe SourcePos -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe SourcePos
prevPos)
notAfterString :: JiraParser Bool
notAfterString :: JiraParser Bool
notAfterString = Bool -> Bool
not (Bool -> Bool) -> JiraParser Bool -> JiraParser Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JiraParser Bool
afterString
afterSpace :: JiraParser Bool
afterSpace :: JiraParser Bool
afterSpace = do
SourcePos
curPos <- ParsecT Text ParserState Identity SourcePos
forall (m :: * -> *) s u. Monad m => ParsecT s u m SourcePos
getPosition
Maybe SourcePos
lastSpacePos <- ParserState -> Maybe SourcePos
stateLastSpcPos (ParserState -> Maybe SourcePos)
-> ParsecT Text ParserState Identity ParserState
-> ParsecT Text ParserState Identity (Maybe SourcePos)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text ParserState Identity ParserState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
Bool -> JiraParser Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (SourcePos -> Maybe SourcePos
forall a. a -> Maybe a
Just SourcePos
curPos Maybe SourcePos -> Maybe SourcePos -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe SourcePos
lastSpacePos)
parseJira :: JiraParser a -> Text -> Either ParseError a
parseJira :: JiraParser a -> Text -> Either ParseError a
parseJira JiraParser a
parser = JiraParser a
-> ParserState -> SourceName -> Text -> Either ParseError a
forall s t u a.
Stream s Identity t =>
Parsec s u a -> u -> SourceName -> s -> Either ParseError a
runParser JiraParser a
parser ParserState
defaultState SourceName
""
skipSpaces :: JiraParser ()
skipSpaces :: ParsecT Text ParserState Identity ()
skipSpaces = ParsecT Text ParserState Identity Char
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m ()
skipMany (Char -> ParsecT Text ParserState Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
' ')
blankline :: JiraParser ()
blankline :: ParsecT Text ParserState Identity ()
blankline = ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ())
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall a b. (a -> b) -> a -> b
$ ParsecT Text ParserState Identity ()
skipSpaces ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text ParserState Identity Char
-> ParsecT Text ParserState Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT Text ParserState Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
newline
parameters :: JiraParser (Maybe Text, [Parameter])
parameters :: JiraParser (Maybe Text, [Parameter])
parameters = (Maybe Text, [Parameter])
-> JiraParser (Maybe Text, [Parameter])
-> JiraParser (Maybe Text, [Parameter])
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option (Maybe Text
forall a. Maybe a
Nothing, []) (JiraParser (Maybe Text, [Parameter])
-> JiraParser (Maybe Text, [Parameter]))
-> JiraParser (Maybe Text, [Parameter])
-> JiraParser (Maybe Text, [Parameter])
forall a b. (a -> b) -> a -> b
$ do
Char
_ <- Char -> ParsecT Text ParserState Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':'
Maybe Text
lang <- ParsecT Text ParserState Identity Text
-> ParsecT Text ParserState Identity (Maybe Text)
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m (Maybe a)
optionMaybe (ParsecT Text ParserState Identity Text
-> ParsecT Text ParserState Identity Text
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try ParsecT Text ParserState Identity Text
forall u. ParsecT Text u Identity Text
language)
[Parameter]
params <- ParsecT Text ParserState Identity Parameter
-> ParsecT Text ParserState Identity Parameter
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (Text -> Text -> Parameter
Parameter (Text -> Text -> Parameter)
-> ParsecT Text ParserState Identity Text
-> ParsecT Text ParserState Identity (Text -> Parameter)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text ParserState Identity Text
forall u. ParsecT Text u Identity Text
key ParsecT Text ParserState Identity (Text -> Parameter)
-> ParsecT Text ParserState Identity Text
-> ParsecT Text ParserState Identity Parameter
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Char -> ParsecT Text ParserState Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'=' ParsecT Text ParserState Identity Char
-> ParsecT Text ParserState Identity Text
-> ParsecT Text ParserState Identity Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text ParserState Identity Text
forall u. ParsecT Text u Identity Text
value)) ParsecT Text ParserState Identity Parameter
-> ParsecT Text ParserState Identity Char
-> ParsecT Text ParserState Identity [Parameter]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
`sepBy` ParsecT Text ParserState Identity Char
forall u. ParsecT Text u Identity Char
pipe
(Maybe Text, [Parameter]) -> JiraParser (Maybe Text, [Parameter])
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Text
lang, [Parameter]
params)
where
pipe :: ParsecT Text u Identity Char
pipe = Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'|'
key :: ParsecT Text u Identity Text
key = SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (SourceName -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
noneOf SourceName
"\"'\t\n\r |{}=")
value :: ParsecT Text u Identity Text
value = SourceName -> Text
pack (SourceName -> Text)
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT Text u Identity Char -> ParsecT Text u Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (SourceName -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
noneOf SourceName
"\"'\n\r|{}=")
language :: ParsecT Text u Identity Text
language = ParsecT Text u Identity Text
forall u. ParsecT Text u Identity Text
key ParsecT Text u Identity Text
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Text
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* (ParsecT Text u Identity Char
forall u. ParsecT Text u Identity Char
pipe ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead (Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'}'))
many1Till :: (Show end)
=> JiraParser a
-> JiraParser end
-> JiraParser [a]
many1Till :: JiraParser a -> JiraParser end -> JiraParser [a]
many1Till JiraParser a
p JiraParser end
end = do
JiraParser end -> ParsecT Text ParserState Identity ()
forall a.
Show a =>
JiraParser a -> ParsecT Text ParserState Identity ()
notFollowedBy' JiraParser end
end
a
first <- JiraParser a
p
[a]
rest <- JiraParser a -> JiraParser end -> JiraParser [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
manyTill JiraParser a
p JiraParser end
end
[a] -> JiraParser [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (a
firsta -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
rest)
endOfPara :: JiraParser ()
endOfPara :: ParsecT Text ParserState Identity ()
endOfPara = ParsecT Text ParserState Identity ()
forall s (m :: * -> *) t u.
(Stream s m t, Show t) =>
ParsecT s u m ()
eof
ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT Text ParserState Identity ()
blankline
ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT Text ParserState Identity ()
forall u. ParsecT Text u Identity ()
headerStart
ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT Text ParserState Identity ()
forall u. ParsecT Text u Identity ()
quoteStart
ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT Text ParserState Identity ()
horizontalRule
ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT Text ParserState Identity ()
listItemStart
ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT Text ParserState Identity ()
tableStart
ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m a
lookAhead ParsecT Text ParserState Identity ()
forall u. ParsecT Text u Identity ()
panelStart
where
headerStart :: ParsecT Text u Identity ()
headerStart = ParsecT Text u Identity Char -> ParsecT Text u Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT Text u Identity Char -> ParsecT Text u Identity ())
-> ParsecT Text u Identity Char -> ParsecT Text u Identity ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'h' ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> SourceName -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf SourceName
"123456" ParsecT Text u Identity Char
-> ParsecT Text u Identity Char -> ParsecT Text u Identity Char
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'.'
quoteStart :: ParsecT Text u Identity ()
quoteStart = ParsecT Text u Identity SourceName -> ParsecT Text u Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT Text u Identity SourceName -> ParsecT Text u Identity ())
-> ParsecT Text u Identity SourceName -> ParsecT Text u Identity ()
forall a b. (a -> b) -> a -> b
$ SourceName -> ParsecT Text u Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"bq."
listItemStart :: ParsecT Text ParserState Identity ()
listItemStart = ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity ())
-> ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity ()
forall a b. (a -> b) -> a -> b
$ ParsecT Text ParserState Identity ()
skipSpaces ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity SourceName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text ParserState Identity Char
-> ParsecT Text ParserState Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (SourceName -> ParsecT Text ParserState Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m Char
oneOf SourceName
"#*-") ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity Char
-> ParsecT Text ParserState Identity SourceName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> ParsecT Text ParserState Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
' '
tableStart :: ParsecT Text ParserState Identity ()
tableStart = ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity ())
-> ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity ()
forall a b. (a -> b) -> a -> b
$ ParsecT Text ParserState Identity ()
skipSpaces ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity SourceName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text ParserState Identity Char
-> ParsecT Text ParserState Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (Char -> ParsecT Text ParserState Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'|')
panelStart :: ParsecT Text u Identity ()
panelStart = ParsecT Text u Identity SourceName -> ParsecT Text u Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT Text u Identity SourceName -> ParsecT Text u Identity ())
-> ParsecT Text u Identity SourceName -> ParsecT Text u Identity ()
forall a b. (a -> b) -> a -> b
$ Char -> ParsecT Text u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'{' ParsecT Text u Identity Char
-> ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> [ParsecT Text u Identity SourceName]
-> ParsecT Text u Identity SourceName
forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice ((SourceName -> ParsecT Text u Identity SourceName)
-> [SourceName] -> [ParsecT Text u Identity SourceName]
forall a b. (a -> b) -> [a] -> [b]
map (ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text u Identity SourceName
-> ParsecT Text u Identity SourceName)
-> (SourceName -> ParsecT Text u Identity SourceName)
-> SourceName
-> ParsecT Text u Identity SourceName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceName -> ParsecT Text u Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string) [SourceName]
blockNames)
horizontalRule :: ParsecT Text ParserState Identity ()
horizontalRule = ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ())
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall a b. (a -> b) -> a -> b
$ ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity SourceName
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (SourceName -> ParsecT Text ParserState Identity SourceName
forall s (m :: * -> *) u.
Stream s m Char =>
SourceName -> ParsecT s u m SourceName
string SourceName
"----") ParsecT Text ParserState Identity SourceName
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT Text ParserState Identity ()
blankline
blockNames :: [String]
blockNames :: [SourceName]
blockNames = [SourceName
"code", SourceName
"color", SourceName
"noformat", SourceName
"panel", SourceName
"quote"]
notFollowedBy' :: Show a => JiraParser a -> JiraParser ()
notFollowedBy' :: JiraParser a -> ParsecT Text ParserState Identity ()
notFollowedBy' JiraParser a
p =
let failIfSucceeds :: ParsecT Text ParserState Identity (ParsecT Text u Identity a)
failIfSucceeds = SourceName -> ParsecT Text u Identity a
forall s (m :: * -> *) t u a.
Stream s m t =>
SourceName -> ParsecT s u m a
unexpected (SourceName -> ParsecT Text u Identity a)
-> (a -> SourceName) -> a -> ParsecT Text u Identity a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> SourceName
forall a. Show a => a -> SourceName
show (a -> ParsecT Text u Identity a)
-> JiraParser a
-> ParsecT Text ParserState Identity (ParsecT Text u Identity a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> JiraParser a -> JiraParser a
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try JiraParser a
p
unitParser :: ParsecT
Text ParserState Identity (ParsecT Text ParserState Identity ())
unitParser = ParsecT Text ParserState Identity ()
-> ParsecT
Text ParserState Identity (ParsecT Text ParserState Identity ())
forall (m :: * -> *) a. Monad m => a -> m a
return (() -> ParsecT Text ParserState Identity ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
in ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ())
-> ParsecT Text ParserState Identity ()
-> ParsecT Text ParserState Identity ()
forall a b. (a -> b) -> a -> b
$ ParsecT
Text ParserState Identity (ParsecT Text ParserState Identity ())
-> ParsecT Text ParserState Identity ()
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (ParsecT
Text ParserState Identity (ParsecT Text ParserState Identity ())
forall u a.
ParsecT Text ParserState Identity (ParsecT Text u Identity a)
failIfSucceeds ParsecT
Text ParserState Identity (ParsecT Text ParserState Identity ())
-> ParsecT
Text ParserState Identity (ParsecT Text ParserState Identity ())
-> ParsecT
Text ParserState Identity (ParsecT Text ParserState Identity ())
forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> ParsecT
Text ParserState Identity (ParsecT Text ParserState Identity ())
unitParser)