{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternGuards #-}
module Text.Pandoc.Writers.Jira ( writeJira ) where
import Control.Monad.Reader (ReaderT, ask, asks, runReaderT)
import Control.Monad.State.Strict (StateT, evalStateT, gets, modify)
import Data.Foldable (find)
import Data.Text (Text)
import Text.Jira.Parser (plainText)
import Text.Jira.Printer (prettyBlocks, prettyInlines)
import Text.Pandoc.Class.PandocMonad (PandocMonad)
import Text.Pandoc.Definition
import Text.Pandoc.Options (WriterOptions (writerTemplate, writerWrapText),
WrapOption (..))
import Text.Pandoc.Shared (linesToPara, stringify)
import Text.Pandoc.Templates (renderTemplate)
import Text.Pandoc.Writers.Math (texMathToInlines)
import Text.Pandoc.Writers.Shared (defField, metaToContext, toLegacyTable)
import Text.DocLayout (literal, render)
import qualified Data.Text as T
import qualified Text.Jira.Markup as Jira
writeJira :: PandocMonad m => WriterOptions -> Pandoc -> m Text
writeJira :: WriterOptions -> Pandoc -> m Text
writeJira opts :: WriterOptions
opts = WrapOption -> (Pandoc -> JiraConverter m Text) -> Pandoc -> m Text
forall (m :: * -> *) a.
PandocMonad m =>
WrapOption -> (a -> JiraConverter m Text) -> a -> m Text
runDefaultConverter (WriterOptions -> WrapOption
writerWrapText WriterOptions
opts) (WriterOptions -> Pandoc -> JiraConverter m Text
forall (m :: * -> *).
PandocMonad m =>
WriterOptions -> Pandoc -> JiraConverter m Text
pandocToJira WriterOptions
opts)
data ConverterState = ConverterState
{ ConverterState -> [Text]
stNotes :: [Text]
, ConverterState -> Bool
stInPanel :: Bool
}
startState :: ConverterState
startState :: ConverterState
startState = ConverterState :: [Text] -> Bool -> ConverterState
ConverterState
{ stNotes :: [Text]
stNotes = []
, stInPanel :: Bool
stInPanel = Bool
False
}
type JiraConverter m = ReaderT WrapOption (StateT ConverterState m)
runDefaultConverter :: PandocMonad m
=> WrapOption
-> (a -> JiraConverter m Text)
-> a
-> m Text
runDefaultConverter :: WrapOption -> (a -> JiraConverter m Text) -> a -> m Text
runDefaultConverter wrap :: WrapOption
wrap c :: a -> JiraConverter m Text
c x :: a
x = StateT ConverterState m Text -> ConverterState -> m Text
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (JiraConverter m Text -> WrapOption -> StateT ConverterState m Text
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (a -> JiraConverter m Text
c a
x) WrapOption
wrap) ConverterState
startState
pandocToJira :: PandocMonad m
=> WriterOptions -> Pandoc -> JiraConverter m Text
pandocToJira :: WriterOptions -> Pandoc -> JiraConverter m Text
pandocToJira opts :: WriterOptions
opts (Pandoc meta :: Meta
meta blocks :: [Block]
blocks) = do
WrapOption
wrap <- ReaderT WrapOption (StateT ConverterState m) WrapOption
forall r (m :: * -> *). MonadReader r m => m r
ask
Context Text
metadata <- WriterOptions
-> ([Block]
-> ReaderT WrapOption (StateT ConverterState m) (Doc Text))
-> ([Inline]
-> ReaderT WrapOption (StateT ConverterState m) (Doc Text))
-> Meta
-> ReaderT WrapOption (StateT ConverterState m) (Context Text)
forall (m :: * -> *) a.
(Monad m, TemplateTarget a) =>
WriterOptions
-> ([Block] -> m (Doc a))
-> ([Inline] -> m (Doc a))
-> Meta
-> m (Context a)
metaToContext WriterOptions
opts
((Text -> Doc Text)
-> JiraConverter m Text
-> ReaderT WrapOption (StateT ConverterState m) (Doc Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Doc Text
forall a. HasChars a => a -> Doc a
literal (JiraConverter m Text
-> ReaderT WrapOption (StateT ConverterState m) (Doc Text))
-> ([Block] -> JiraConverter m Text)
-> [Block]
-> ReaderT WrapOption (StateT ConverterState m) (Doc Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WrapOption
-> ([Block]
-> JiraConverter
(ReaderT WrapOption (StateT ConverterState m)) Text)
-> [Block]
-> JiraConverter m Text
forall (m :: * -> *) a.
PandocMonad m =>
WrapOption -> (a -> JiraConverter m Text) -> a -> m Text
runDefaultConverter WrapOption
wrap [Block]
-> JiraConverter
(ReaderT WrapOption (StateT ConverterState m)) Text
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m Text
blockListToJira)
((Text -> Doc Text)
-> JiraConverter m Text
-> ReaderT WrapOption (StateT ConverterState m) (Doc Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Doc Text
forall a. HasChars a => a -> Doc a
literal (JiraConverter m Text
-> ReaderT WrapOption (StateT ConverterState m) (Doc Text))
-> ([Inline] -> JiraConverter m Text)
-> [Inline]
-> ReaderT WrapOption (StateT ConverterState m) (Doc Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WrapOption
-> ([Inline]
-> JiraConverter
(ReaderT WrapOption (StateT ConverterState m)) Text)
-> [Inline]
-> JiraConverter m Text
forall (m :: * -> *) a.
PandocMonad m =>
WrapOption -> (a -> JiraConverter m Text) -> a -> m Text
runDefaultConverter WrapOption
wrap [Inline]
-> JiraConverter
(ReaderT WrapOption (StateT ConverterState m)) Text
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m Text
inlineListToJira) Meta
meta
Text
body <- [Block] -> JiraConverter m Text
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m Text
blockListToJira [Block]
blocks
Text
notes <- (ConverterState -> Text) -> JiraConverter m Text
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets ((ConverterState -> Text) -> JiraConverter m Text)
-> (ConverterState -> Text) -> JiraConverter m Text
forall a b. (a -> b) -> a -> b
$ Text -> [Text] -> Text
T.intercalate "\n" ([Text] -> Text)
-> (ConverterState -> [Text]) -> ConverterState -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> [Text]
forall a. [a] -> [a]
reverse ([Text] -> [Text])
-> (ConverterState -> [Text]) -> ConverterState -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConverterState -> [Text]
stNotes
let main :: Text
main = Text
body Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> if Text -> Bool
T.null Text
notes then Text
forall a. Monoid a => a
mempty else "\n\n" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
notes
let context :: Context Text
context = Text -> Text -> Context Text -> Context Text
forall a b. ToContext a b => Text -> b -> Context a -> Context a
defField "body" Text
main Context Text
metadata
Text -> JiraConverter m Text
forall (m :: * -> *) a. Monad m => a -> m a
return (Text -> JiraConverter m Text) -> Text -> JiraConverter m Text
forall a b. (a -> b) -> a -> b
$
case WriterOptions -> Maybe (Template Text)
writerTemplate WriterOptions
opts of
Nothing -> Text
main
Just tpl :: Template Text
tpl -> Maybe Int -> Doc Text -> Text
forall a. HasChars a => Maybe Int -> Doc a -> a
render Maybe Int
forall a. Maybe a
Nothing (Doc Text -> Text) -> Doc Text -> Text
forall a b. (a -> b) -> a -> b
$ Template Text -> Context Text -> Doc Text
forall a b.
(TemplateTarget a, ToContext a b) =>
Template a -> b -> Doc a
renderTemplate Template Text
tpl Context Text
context
blockListToJira :: PandocMonad m => [Block] -> JiraConverter m Text
blockListToJira :: [Block] -> JiraConverter m Text
blockListToJira = ([Block] -> Text)
-> ReaderT WrapOption (StateT ConverterState m) [Block]
-> JiraConverter m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Block] -> Text
prettyBlocks (ReaderT WrapOption (StateT ConverterState m) [Block]
-> JiraConverter m Text)
-> ([Block]
-> ReaderT WrapOption (StateT ConverterState m) [Block])
-> [Block]
-> JiraConverter m Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Block] -> ReaderT WrapOption (StateT ConverterState m) [Block]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Block]
toJiraBlocks
inlineListToJira :: PandocMonad m => [Inline] -> JiraConverter m Text
inlineListToJira :: [Inline] -> JiraConverter m Text
inlineListToJira = ([Inline] -> Text)
-> ReaderT WrapOption (StateT ConverterState m) [Inline]
-> JiraConverter m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Inline] -> Text
prettyInlines (ReaderT WrapOption (StateT ConverterState m) [Inline]
-> JiraConverter m Text)
-> ([Inline]
-> ReaderT WrapOption (StateT ConverterState m) [Inline])
-> [Inline]
-> JiraConverter m Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Inline] -> ReaderT WrapOption (StateT ConverterState m) [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines
toJiraBlocks :: PandocMonad m => [Block] -> JiraConverter m [Jira.Block]
toJiraBlocks :: [Block] -> JiraConverter m [Block]
toJiraBlocks blocks :: [Block]
blocks = do
let convert :: Block -> JiraConverter m [Block]
convert = \case
BlockQuote bs :: [Block]
bs -> Block -> [Block]
forall a. a -> [a]
singleton (Block -> [Block]) -> ([Block] -> Block) -> [Block] -> [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Block] -> Block
Jira.BlockQuote
([Block] -> [Block])
-> JiraConverter m [Block] -> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Block] -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Block]
toJiraBlocks [Block]
bs
BulletList items :: [[Block]]
items -> Block -> [Block]
forall a. a -> [a]
singleton (Block -> [Block]) -> ([[Block]] -> Block) -> [[Block]] -> [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ListStyle -> [[Block]] -> Block
Jira.List ListStyle
Jira.CircleBullets
([[Block]] -> [Block])
-> ReaderT WrapOption (StateT ConverterState m) [[Block]]
-> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[Block]] -> ReaderT WrapOption (StateT ConverterState m) [[Block]]
forall (m :: * -> *).
PandocMonad m =>
[[Block]] -> JiraConverter m [[Block]]
toJiraItems [[Block]]
items
CodeBlock attr :: Attr
attr cs :: Text
cs -> Attr -> Text -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
Attr -> Text -> JiraConverter m [Block]
toJiraCode Attr
attr Text
cs
DefinitionList items :: [([Inline], [[Block]])]
items -> [([Inline], [[Block]])] -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
[([Inline], [[Block]])] -> JiraConverter m [Block]
toJiraDefinitionList [([Inline], [[Block]])]
items
Div attr :: Attr
attr bs :: [Block]
bs -> Attr -> [Block] -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
Attr -> [Block] -> JiraConverter m [Block]
toJiraPanel Attr
attr [Block]
bs
Header lvl :: Int
lvl attr :: Attr
attr xs :: [Inline]
xs -> Int -> Attr -> [Inline] -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
Int -> Attr -> [Inline] -> JiraConverter m [Block]
toJiraHeader Int
lvl Attr
attr [Inline]
xs
HorizontalRule -> [Block] -> JiraConverter m [Block]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Block] -> JiraConverter m [Block])
-> (Block -> [Block]) -> Block -> JiraConverter m [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Block -> [Block]
forall a. a -> [a]
singleton (Block -> JiraConverter m [Block])
-> Block -> JiraConverter m [Block]
forall a b. (a -> b) -> a -> b
$ Block
Jira.HorizontalRule
LineBlock xs :: [[Inline]]
xs -> [Block] -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Block]
toJiraBlocks [[[Inline]] -> Block
linesToPara [[Inline]]
xs]
OrderedList _ items :: [[Block]]
items -> Block -> [Block]
forall a. a -> [a]
singleton (Block -> [Block]) -> ([[Block]] -> Block) -> [[Block]] -> [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ListStyle -> [[Block]] -> Block
Jira.List ListStyle
Jira.Enumeration
([[Block]] -> [Block])
-> ReaderT WrapOption (StateT ConverterState m) [[Block]]
-> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[Block]] -> ReaderT WrapOption (StateT ConverterState m) [[Block]]
forall (m :: * -> *).
PandocMonad m =>
[[Block]] -> JiraConverter m [[Block]]
toJiraItems [[Block]]
items
Para xs :: [Inline]
xs -> Block -> [Block]
forall a. a -> [a]
singleton (Block -> [Block]) -> ([Inline] -> Block) -> [Inline] -> [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Inline] -> Block
Jira.Para ([Inline] -> [Block])
-> ReaderT WrapOption (StateT ConverterState m) [Inline]
-> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Inline] -> ReaderT WrapOption (StateT ConverterState m) [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines [Inline]
xs
Plain xs :: [Inline]
xs -> Block -> [Block]
forall a. a -> [a]
singleton (Block -> [Block]) -> ([Inline] -> Block) -> [Inline] -> [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Inline] -> Block
Jira.Para ([Inline] -> [Block])
-> ReaderT WrapOption (StateT ConverterState m) [Inline]
-> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Inline] -> ReaderT WrapOption (StateT ConverterState m) [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines [Inline]
xs
RawBlock fmt :: Format
fmt cs :: Text
cs -> Format -> Text -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
Format -> Text -> JiraConverter m [Block]
rawBlockToJira Format
fmt Text
cs
Null -> [Block] -> JiraConverter m [Block]
forall (m :: * -> *) a. Monad m => a -> m a
return [Block]
forall a. Monoid a => a
mempty
Table _ blkCapt :: Caption
blkCapt specs :: [ColSpec]
specs thead :: TableHead
thead tbody :: [TableBody]
tbody tfoot :: TableFoot
tfoot -> Block -> [Block]
forall a. a -> [a]
singleton (Block -> [Block])
-> ReaderT WrapOption (StateT ConverterState m) Block
-> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
let (_, _, _, hd :: [[Block]]
hd, body :: [[[Block]]]
body) = Caption
-> [ColSpec]
-> TableHead
-> [TableBody]
-> TableFoot
-> ([Inline], [Alignment], [Double], [[Block]], [[[Block]]])
toLegacyTable Caption
blkCapt [ColSpec]
specs TableHead
thead [TableBody]
tbody TableFoot
tfoot
Maybe Row
headerRow <- if ([Block] -> Bool) -> [[Block]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all [Block] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Block]]
hd
then Maybe Row
-> ReaderT WrapOption (StateT ConverterState m) (Maybe Row)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Row
forall a. Maybe a
Nothing
else Row -> Maybe Row
forall a. a -> Maybe a
Just (Row -> Maybe Row)
-> ReaderT WrapOption (StateT ConverterState m) Row
-> ReaderT WrapOption (StateT ConverterState m) (Maybe Row)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([Block] -> Cell)
-> [[Block]] -> ReaderT WrapOption (StateT ConverterState m) Row
forall (m :: * -> *).
PandocMonad m =>
([Block] -> Cell) -> [[Block]] -> JiraConverter m Row
toRow [Block] -> Cell
Jira.HeaderCell [[Block]]
hd
[Row]
bodyRows <- ([[Block]] -> ReaderT WrapOption (StateT ConverterState m) Row)
-> [[[Block]]]
-> ReaderT WrapOption (StateT ConverterState m) [Row]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (([Block] -> Cell)
-> [[Block]] -> ReaderT WrapOption (StateT ConverterState m) Row
forall (m :: * -> *).
PandocMonad m =>
([Block] -> Cell) -> [[Block]] -> JiraConverter m Row
toRow [Block] -> Cell
Jira.BodyCell) [[[Block]]]
body
let rows :: [Row]
rows = case Maybe Row
headerRow of
Just header :: Row
header -> Row
header Row -> [Row] -> [Row]
forall a. a -> [a] -> [a]
: [Row]
bodyRows
Nothing -> [Row]
bodyRows
Block -> ReaderT WrapOption (StateT ConverterState m) Block
forall (m :: * -> *) a. Monad m => a -> m a
return (Block -> ReaderT WrapOption (StateT ConverterState m) Block)
-> Block -> ReaderT WrapOption (StateT ConverterState m) Block
forall a b. (a -> b) -> a -> b
$ [Row] -> Block
Jira.Table [Row]
rows
[[Block]]
jiraBlocks <- (Block -> JiraConverter m [Block])
-> [Block]
-> ReaderT WrapOption (StateT ConverterState m) [[Block]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Block -> JiraConverter m [Block]
convert [Block]
blocks
[Block] -> JiraConverter m [Block]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Block] -> JiraConverter m [Block])
-> [Block] -> JiraConverter m [Block]
forall a b. (a -> b) -> a -> b
$ [[Block]] -> [Block]
forall a. Monoid a => [a] -> a
mconcat [[Block]]
jiraBlocks
toRow :: PandocMonad m
=> ([Jira.Block] -> Jira.Cell)
-> [[Block]]
-> JiraConverter m Jira.Row
toRow :: ([Block] -> Cell) -> [[Block]] -> JiraConverter m Row
toRow mkCell :: [Block] -> Cell
mkCell cells :: [[Block]]
cells = [Cell] -> Row
Jira.Row ([Cell] -> Row)
-> ReaderT WrapOption (StateT ConverterState m) [Cell]
-> JiraConverter m Row
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
([Block] -> ReaderT WrapOption (StateT ConverterState m) Cell)
-> [[Block]] -> ReaderT WrapOption (StateT ConverterState m) [Cell]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (([Block] -> Cell)
-> ReaderT WrapOption (StateT ConverterState m) [Block]
-> ReaderT WrapOption (StateT ConverterState m) Cell
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Block] -> Cell
mkCell (ReaderT WrapOption (StateT ConverterState m) [Block]
-> ReaderT WrapOption (StateT ConverterState m) Cell)
-> ([Block]
-> ReaderT WrapOption (StateT ConverterState m) [Block])
-> [Block]
-> ReaderT WrapOption (StateT ConverterState m) Cell
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Block] -> ReaderT WrapOption (StateT ConverterState m) [Block]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Block]
toJiraBlocks) [[Block]]
cells
toJiraItems :: PandocMonad m => [[Block]] -> JiraConverter m [[Jira.Block]]
toJiraItems :: [[Block]] -> JiraConverter m [[Block]]
toJiraItems = ([Block] -> ReaderT WrapOption (StateT ConverterState m) [Block])
-> [[Block]] -> JiraConverter m [[Block]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM [Block] -> ReaderT WrapOption (StateT ConverterState m) [Block]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Block]
toJiraBlocks
toJiraCode :: PandocMonad m
=> Attr
-> Text
-> JiraConverter m [Jira.Block]
toJiraCode :: Attr -> Text -> JiraConverter m [Block]
toJiraCode (ident :: Text
ident, classes :: [Text]
classes, _attribs :: [(Text, Text)]
_attribs) code :: Text
code = do
[Block] -> JiraConverter m [Block]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Block] -> JiraConverter m [Block])
-> (Block -> [Block]) -> Block -> JiraConverter m [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Block] -> [Block]
addAnchor Text
ident ([Block] -> [Block]) -> (Block -> [Block]) -> Block -> [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Block -> [Block]
forall a. a -> [a]
singleton (Block -> JiraConverter m [Block])
-> Block -> JiraConverter m [Block]
forall a b. (a -> b) -> a -> b
$
case (Text -> Bool) -> [Text] -> Maybe Text
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\c :: Text
c -> Text -> Text
T.toLower Text
c Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
knownLanguages) [Text]
classes of
Nothing -> [Parameter] -> Text -> Block
Jira.NoFormat [Parameter]
forall a. Monoid a => a
mempty Text
code
Just l :: Text
l -> Language -> [Parameter] -> Text -> Block
Jira.Code (Text -> Language
Jira.Language Text
l) [Parameter]
forall a. Monoid a => a
mempty Text
code
addAnchor :: Text -> [Jira.Block] -> [Jira.Block]
addAnchor :: Text -> [Block] -> [Block]
addAnchor ident :: Text
ident =
if Text -> Bool
T.null Text
ident
then [Block] -> [Block]
forall a. a -> a
id
else \case
Jira.Para xs :: [Inline]
xs : bs :: [Block]
bs -> ([Inline] -> Block
Jira.Para (Text -> Inline
Jira.Anchor Text
ident Inline -> [Inline] -> [Inline]
forall a. a -> [a] -> [a]
: [Inline]
xs) Block -> [Block] -> [Block]
forall a. a -> [a] -> [a]
: [Block]
bs)
bs :: [Block]
bs -> ([Inline] -> Block
Jira.Para (Inline -> [Inline]
forall a. a -> [a]
singleton (Text -> Inline
Jira.Anchor Text
ident)) Block -> [Block] -> [Block]
forall a. a -> [a] -> [a]
: [Block]
bs)
toJiraDefinitionList :: PandocMonad m
=> [([Inline], [[Block]])]
-> JiraConverter m [Jira.Block]
toJiraDefinitionList :: [([Inline], [[Block]])] -> JiraConverter m [Block]
toJiraDefinitionList defItems :: [([Inline], [[Block]])]
defItems = do
let convertDefItem :: ([Inline], [[Block]])
-> ReaderT WrapOption (StateT ConverterState m) [Block]
convertDefItem (term :: [Inline]
term, defs :: [[Block]]
defs) = do
Block
jiraTerm <- [Inline] -> Block
Jira.Para ([Inline] -> Block)
-> ReaderT WrapOption (StateT ConverterState m) [Inline]
-> ReaderT WrapOption (StateT ConverterState m) Block
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> InlineStyle
-> [Inline]
-> ReaderT WrapOption (StateT ConverterState m) [Inline]
forall (m :: * -> *).
PandocMonad m =>
InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled InlineStyle
Jira.Strong [Inline]
term
[Block]
jiraDefs <- [[Block]] -> [Block]
forall a. Monoid a => [a] -> a
mconcat ([[Block]] -> [Block])
-> ReaderT WrapOption (StateT ConverterState m) [[Block]]
-> ReaderT WrapOption (StateT ConverterState m) [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([Block] -> ReaderT WrapOption (StateT ConverterState m) [Block])
-> [[Block]]
-> ReaderT WrapOption (StateT ConverterState m) [[Block]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM [Block] -> ReaderT WrapOption (StateT ConverterState m) [Block]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Block]
toJiraBlocks [[Block]]
defs
[Block] -> ReaderT WrapOption (StateT ConverterState m) [Block]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Block] -> ReaderT WrapOption (StateT ConverterState m) [Block])
-> [Block] -> ReaderT WrapOption (StateT ConverterState m) [Block]
forall a b. (a -> b) -> a -> b
$ Block
jiraTerm Block -> [Block] -> [Block]
forall a. a -> [a] -> [a]
: [Block]
jiraDefs
Block -> [Block]
forall a. a -> [a]
singleton (Block -> [Block]) -> ([[Block]] -> Block) -> [[Block]] -> [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ListStyle -> [[Block]] -> Block
Jira.List ListStyle
Jira.CircleBullets ([[Block]] -> [Block])
-> ReaderT WrapOption (StateT ConverterState m) [[Block]]
-> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (([Inline], [[Block]]) -> JiraConverter m [Block])
-> [([Inline], [[Block]])]
-> ReaderT WrapOption (StateT ConverterState m) [[Block]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ([Inline], [[Block]]) -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
([Inline], [[Block]])
-> ReaderT WrapOption (StateT ConverterState m) [Block]
convertDefItem [([Inline], [[Block]])]
defItems
toJiraPanel :: PandocMonad m
=> Attr -> [Block]
-> JiraConverter m [Jira.Block]
toJiraPanel :: Attr -> [Block] -> JiraConverter m [Block]
toJiraPanel (ident :: Text
ident, classes :: [Text]
classes, attribs :: [(Text, Text)]
attribs) blocks :: [Block]
blocks = do
Bool
inPanel <- (ConverterState -> Bool)
-> ReaderT WrapOption (StateT ConverterState m) Bool
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets ConverterState -> Bool
stInPanel
if Bool
inPanel Bool -> Bool -> Bool
|| ("panel" Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Text]
classes Bool -> Bool -> Bool
&& [(Text, Text)] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [(Text, Text)]
attribs)
then Text -> [Block] -> [Block]
addAnchor Text
ident ([Block] -> [Block])
-> JiraConverter m [Block] -> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Block] -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Block]
toJiraBlocks [Block]
blocks
else do
(ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ())
-> (ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ()
forall a b. (a -> b) -> a -> b
$ \st :: ConverterState
st -> ConverterState
st{ stInPanel :: Bool
stInPanel = Bool
True }
[Block]
jiraBlocks <- [Block] -> JiraConverter m [Block]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Block]
toJiraBlocks [Block]
blocks
(ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ())
-> (ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ()
forall a b. (a -> b) -> a -> b
$ \st :: ConverterState
st -> ConverterState
st{ stInPanel :: Bool
stInPanel = Bool
inPanel }
let params :: [Parameter]
params = ((Text, Text) -> Parameter) -> [(Text, Text)] -> [Parameter]
forall a b. (a -> b) -> [a] -> [b]
map ((Text -> Text -> Parameter) -> (Text, Text) -> Parameter
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Text -> Text -> Parameter
Jira.Parameter) [(Text, Text)]
attribs
[Block] -> JiraConverter m [Block]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Block] -> JiraConverter m [Block])
-> [Block] -> JiraConverter m [Block]
forall a b. (a -> b) -> a -> b
$ Block -> [Block]
forall a. a -> [a]
singleton ([Parameter] -> [Block] -> Block
Jira.Panel [Parameter]
params ([Block] -> Block) -> [Block] -> Block
forall a b. (a -> b) -> a -> b
$ Text -> [Block] -> [Block]
addAnchor Text
ident [Block]
jiraBlocks)
toJiraHeader :: PandocMonad m
=> Int -> Attr -> [Inline]
-> JiraConverter m [Jira.Block]
lvl :: Int
lvl (ident :: Text
ident, _, _) inlines :: [Inline]
inlines =
let anchor :: Inline
anchor = Text -> Inline
Jira.Anchor Text
ident
in Block -> [Block]
forall a. a -> [a]
singleton (Block -> [Block]) -> ([Inline] -> Block) -> [Inline] -> [Block]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [Inline] -> Block
Jira.Header Int
lvl ([Inline] -> Block) -> ([Inline] -> [Inline]) -> [Inline] -> Block
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Inline
anchor Inline -> [Inline] -> [Inline]
forall a. a -> [a] -> [a]
:) ([Inline] -> [Block])
-> ReaderT WrapOption (StateT ConverterState m) [Inline]
-> JiraConverter m [Block]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Inline] -> ReaderT WrapOption (StateT ConverterState m) [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines [Inline]
inlines
rawBlockToJira :: PandocMonad m
=> Format -> Text
-> JiraConverter m [Jira.Block]
rawBlockToJira :: Format -> Text -> JiraConverter m [Block]
rawBlockToJira fmt :: Format
fmt cs :: Text
cs = do
[Inline]
rawInlines <- Format -> Text -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
Format -> Text -> JiraConverter m [Inline]
toJiraRaw Format
fmt Text
cs
[Block] -> JiraConverter m [Block]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Block] -> JiraConverter m [Block])
-> [Block] -> JiraConverter m [Block]
forall a b. (a -> b) -> a -> b
$
if [Inline] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Inline]
rawInlines
then [Block]
forall a. Monoid a => a
mempty
else Block -> [Block]
forall a. a -> [a]
singleton ([Inline] -> Block
Jira.Para [Inline]
rawInlines)
toJiraRaw :: PandocMonad m
=> Format -> Text -> JiraConverter m [Jira.Inline]
toJiraRaw :: Format -> Text -> JiraConverter m [Inline]
toJiraRaw fmt :: Format
fmt cs :: Text
cs = case Format
fmt of
Format "jira" -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Inline] -> JiraConverter m [Inline])
-> (Inline -> [Inline]) -> Inline -> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> JiraConverter m [Inline])
-> Inline -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$ Text -> Inline
Jira.Str Text
cs
_ -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *) a. Monad m => a -> m a
return [Inline]
forall a. Monoid a => a
mempty
toJiraInlines :: PandocMonad m => [Inline] -> JiraConverter m [Jira.Inline]
toJiraInlines :: [Inline] -> JiraConverter m [Inline]
toJiraInlines inlines :: [Inline]
inlines = do
let convert :: Inline -> JiraConverter m [Inline]
convert = \case
Cite _ xs :: [Inline]
xs -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines [Inline]
xs
Code _ cs :: Text
cs -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Inline] -> JiraConverter m [Inline])
-> (Inline -> [Inline]) -> Inline -> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> JiraConverter m [Inline])
-> Inline -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$
[Inline] -> Inline
Jira.Monospaced (Text -> [Inline]
escapeSpecialChars Text
cs)
Emph xs :: [Inline]
xs -> InlineStyle -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled InlineStyle
Jira.Emphasis [Inline]
xs
Underline xs :: [Inline]
xs -> InlineStyle -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled InlineStyle
Jira.Insert [Inline]
xs
Image attr :: Attr
attr cap :: [Inline]
cap tgt :: (Text, Text)
tgt -> (Text -> Text -> JiraConverter m [Inline])
-> (Text, Text) -> JiraConverter m [Inline]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (Attr -> [Inline] -> Text -> Text -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
Attr -> [Inline] -> Text -> Text -> JiraConverter m [Inline]
imageToJira Attr
attr [Inline]
cap) (Text, Text)
tgt
LineBreak -> [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Inline] -> JiraConverter m [Inline])
-> (Inline -> [Inline]) -> Inline -> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> JiraConverter m [Inline])
-> Inline -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$ Inline
Jira.Linebreak
Link attr :: Attr
attr xs :: [Inline]
xs tgt :: (Text, Text)
tgt -> Attr -> (Text, Text) -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
Attr -> (Text, Text) -> [Inline] -> JiraConverter m [Inline]
toJiraLink Attr
attr (Text, Text)
tgt [Inline]
xs
Math mtype :: MathType
mtype cs :: Text
cs -> MathType -> Text -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
MathType -> Text -> JiraConverter m [Inline]
mathToJira MathType
mtype Text
cs
Note bs :: [Block]
bs -> [Block] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m [Inline]
registerNotes [Block]
bs
Quoted qt :: QuoteType
qt xs :: [Inline]
xs -> QuoteType -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
QuoteType -> [Inline] -> JiraConverter m [Inline]
quotedToJira QuoteType
qt [Inline]
xs
RawInline fmt :: Format
fmt cs :: Text
cs -> Format -> Text -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
Format -> Text -> JiraConverter m [Inline]
toJiraRaw Format
fmt Text
cs
SmallCaps xs :: [Inline]
xs -> InlineStyle -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled InlineStyle
Jira.Strong [Inline]
xs
SoftBreak -> do
Bool
preserveBreak <- (WrapOption -> Bool)
-> ReaderT WrapOption (StateT ConverterState m) Bool
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks (WrapOption -> WrapOption -> Bool
forall a. Eq a => a -> a -> Bool
== WrapOption
WrapPreserve)
[Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Inline] -> JiraConverter m [Inline])
-> (Inline -> [Inline]) -> Inline -> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> JiraConverter m [Inline])
-> Inline -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$ if Bool
preserveBreak
then Inline
Jira.Linebreak
else Inline
Jira.Space
Space -> [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Inline] -> JiraConverter m [Inline])
-> (Inline -> [Inline]) -> Inline -> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> JiraConverter m [Inline])
-> Inline -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$ Inline
Jira.Space
Span attr :: Attr
attr xs :: [Inline]
xs -> Attr -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
Attr -> [Inline] -> JiraConverter m [Inline]
spanToJira Attr
attr [Inline]
xs
Str s :: Text
s -> [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Inline] -> JiraConverter m [Inline])
-> [Inline] -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$ Text -> [Inline]
escapeSpecialChars Text
s
Strikeout xs :: [Inline]
xs -> InlineStyle -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled InlineStyle
Jira.Strikeout [Inline]
xs
Strong xs :: [Inline]
xs -> InlineStyle -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled InlineStyle
Jira.Strong [Inline]
xs
Subscript xs :: [Inline]
xs -> InlineStyle -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled InlineStyle
Jira.Subscript [Inline]
xs
Superscript xs :: [Inline]
xs -> InlineStyle -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled InlineStyle
Jira.Superscript [Inline]
xs
[[Inline]]
jiraInlines <- (Inline -> JiraConverter m [Inline])
-> [Inline]
-> ReaderT WrapOption (StateT ConverterState m) [[Inline]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Inline -> JiraConverter m [Inline]
convert [Inline]
inlines
[Inline] -> JiraConverter m [Inline]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Inline] -> JiraConverter m [Inline])
-> [Inline] -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$ [[Inline]] -> [Inline]
forall a. Monoid a => [a] -> a
mconcat [[Inline]]
jiraInlines
singleton :: a -> [a]
singleton :: a -> [a]
singleton = (a -> [a] -> [a]
forall a. a -> [a] -> [a]
:[])
styled :: PandocMonad m
=> Jira.InlineStyle -> [Inline]
-> JiraConverter m [Jira.Inline]
styled :: InlineStyle -> [Inline] -> JiraConverter m [Inline]
styled s :: InlineStyle
s = ([Inline] -> [Inline])
-> JiraConverter m [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> [Inline])
-> ([Inline] -> Inline) -> [Inline] -> [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InlineStyle -> [Inline] -> Inline
Jira.Styled InlineStyle
s) (JiraConverter m [Inline] -> JiraConverter m [Inline])
-> ([Inline] -> JiraConverter m [Inline])
-> [Inline]
-> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines
escapeSpecialChars :: Text -> [Jira.Inline]
escapeSpecialChars :: Text -> [Inline]
escapeSpecialChars t :: Text
t = case Text -> Either ParseError [Inline]
plainText Text
t of
Right xs :: [Inline]
xs -> [Inline]
xs
Left _ -> Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> [Inline]) -> Inline -> [Inline]
forall a b. (a -> b) -> a -> b
$ Text -> Inline
Jira.Str Text
t
imageToJira :: PandocMonad m
=> Attr -> [Inline] -> Text -> Text
-> JiraConverter m [Jira.Inline]
imageToJira :: Attr -> [Inline] -> Text -> Text -> JiraConverter m [Inline]
imageToJira (_, classes :: [Text]
classes, kvs :: [(Text, Text)]
kvs) caption :: [Inline]
caption src :: Text
src title :: Text
title =
let imageWithParams :: [Parameter] -> Inline
imageWithParams ps :: [Parameter]
ps = [Parameter] -> URL -> Inline
Jira.Image [Parameter]
ps (Text -> URL
Jira.URL Text
src)
alt :: Text
alt = [Inline] -> Text
forall a. Walkable Inline a => a -> Text
stringify [Inline]
caption
in [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Inline] -> JiraConverter m [Inline])
-> ([Parameter] -> [Inline])
-> [Parameter]
-> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> [Inline])
-> ([Parameter] -> Inline) -> [Parameter] -> [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Parameter] -> Inline
imageWithParams ([Parameter] -> JiraConverter m [Inline])
-> [Parameter] -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$
if "thumbnail" Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
classes
then [Text -> Text -> Parameter
Jira.Parameter "thumbnail" ""]
else ((Text, Text) -> Parameter) -> [(Text, Text)] -> [Parameter]
forall a b. (a -> b) -> [a] -> [b]
map ((Text -> Text -> Parameter) -> (Text, Text) -> Parameter
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Text -> Text -> Parameter
Jira.Parameter)
([(Text, Text)] -> [Parameter])
-> ([(Text, Text)] -> [(Text, Text)])
-> [(Text, Text)]
-> [Parameter]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if Text -> Bool
T.null Text
title then [(Text, Text)] -> [(Text, Text)]
forall a. a -> a
id else (("title", Text
title)(Text, Text) -> [(Text, Text)] -> [(Text, Text)]
forall a. a -> [a] -> [a]
:))
([(Text, Text)] -> [(Text, Text)])
-> ([(Text, Text)] -> [(Text, Text)])
-> [(Text, Text)]
-> [(Text, Text)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if Text -> Bool
T.null Text
alt then [(Text, Text)] -> [(Text, Text)]
forall a. a -> a
id else (("alt", Text
alt)(Text, Text) -> [(Text, Text)] -> [(Text, Text)]
forall a. a -> [a] -> [a]
:))
([(Text, Text)] -> [Parameter]) -> [(Text, Text)] -> [Parameter]
forall a b. (a -> b) -> a -> b
$ [(Text, Text)]
kvs
toJiraLink :: PandocMonad m
=> Attr
-> Target
-> [Inline]
-> JiraConverter m [Jira.Inline]
toJiraLink :: Attr -> (Text, Text) -> [Inline] -> JiraConverter m [Inline]
toJiraLink (_, classes :: [Text]
classes, _) (url :: Text
url, _) alias :: [Inline]
alias = do
let (linkType :: LinkType
linkType, url' :: Text
url') = Text -> (LinkType, Text)
toLinkType Text
url
[Inline]
description <- if Text
url Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [[Inline] -> Text
forall a. Walkable Inline a => a -> Text
stringify [Inline]
alias, "mailto:" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Inline] -> Text
forall a. Walkable Inline a => a -> Text
stringify [Inline]
alias]
then [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Inline]
forall a. Monoid a => a
mempty
else [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines [Inline]
alias
[Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Inline] -> JiraConverter m [Inline])
-> (Inline -> [Inline]) -> Inline -> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> JiraConverter m [Inline])
-> Inline -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$ LinkType -> [Inline] -> URL -> Inline
Jira.Link LinkType
linkType [Inline]
description (Text -> URL
Jira.URL Text
url')
where
toLinkType :: Text -> (LinkType, Text)
toLinkType url' :: Text
url'
| Just email :: Text
email <- Text -> Text -> Maybe Text
T.stripPrefix "mailto:" Text
url' = (LinkType
Jira.Email, Text
email)
| "user-account" Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
classes = (LinkType
Jira.User, Text -> Text
dropTilde Text
url)
| "attachment" Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
classes = (LinkType
Jira.Attachment, Text
url)
| "smart-card" Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
classes = (LinkType
Jira.SmartCard, Text
url)
| "smart-link" Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
classes = (LinkType
Jira.SmartLink, Text
url)
| Bool
otherwise = (LinkType
Jira.External, Text
url)
dropTilde :: Text -> Text
dropTilde txt :: Text
txt = case Text -> Maybe (Char, Text)
T.uncons Text
txt of
Just ('~', username :: Text
username) -> Text
username
_ -> Text
txt
mathToJira :: PandocMonad m
=> MathType
-> Text
-> JiraConverter m [Jira.Inline]
mathToJira :: MathType -> Text -> JiraConverter m [Inline]
mathToJira mtype :: MathType
mtype cs :: Text
cs = do
[Inline]
mathInlines <- [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines ([Inline] -> JiraConverter m [Inline])
-> ReaderT WrapOption (StateT ConverterState m) [Inline]
-> JiraConverter m [Inline]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MathType
-> Text -> ReaderT WrapOption (StateT ConverterState m) [Inline]
forall (m :: * -> *).
PandocMonad m =>
MathType -> Text -> m [Inline]
texMathToInlines MathType
mtype Text
cs
[Inline] -> JiraConverter m [Inline]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Inline] -> JiraConverter m [Inline])
-> [Inline] -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$ case MathType
mtype of
InlineMath -> [Inline]
mathInlines
DisplayMath -> Inline
Jira.Linebreak Inline -> [Inline] -> [Inline]
forall a. a -> [a] -> [a]
: [Inline]
mathInlines [Inline] -> [Inline] -> [Inline]
forall a. [a] -> [a] -> [a]
++ [Inline
Jira.Linebreak]
quotedToJira :: PandocMonad m
=> QuoteType
-> [Inline]
-> JiraConverter m [Jira.Inline]
quotedToJira :: QuoteType -> [Inline] -> JiraConverter m [Inline]
quotedToJira qtype :: QuoteType
qtype xs :: [Inline]
xs = do
let quoteChar :: Text
quoteChar = case QuoteType
qtype of
DoubleQuote -> "\""
SingleQuote -> "'"
let surroundWithQuotes :: [Inline] -> [Inline]
surroundWithQuotes = (Text -> Inline
Jira.Str Text
quoteChar Inline -> [Inline] -> [Inline]
forall a. a -> [a] -> [a]
:) ([Inline] -> [Inline])
-> ([Inline] -> [Inline]) -> [Inline] -> [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Inline] -> [Inline] -> [Inline]
forall a. [a] -> [a] -> [a]
++ [Text -> Inline
Jira.Str Text
quoteChar])
[Inline] -> [Inline]
surroundWithQuotes ([Inline] -> [Inline])
-> JiraConverter m [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines [Inline]
xs
spanToJira :: PandocMonad m
=> Attr -> [Inline]
-> JiraConverter m [Jira.Inline]
spanToJira :: Attr -> [Inline] -> JiraConverter m [Inline]
spanToJira (ident :: Text
ident, _classes :: [Text]
_classes, attribs :: [(Text, Text)]
attribs) inls :: [Inline]
inls =
let wrap :: [Inline] -> [Inline]
wrap = case Text -> [(Text, Text)] -> Maybe Text
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup "color" [(Text, Text)]
attribs of
Nothing -> [Inline] -> [Inline]
forall a. a -> a
id
Just color :: Text
color -> Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> [Inline])
-> ([Inline] -> Inline) -> [Inline] -> [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ColorName -> [Inline] -> Inline
Jira.ColorInline (Text -> ColorName
Jira.ColorName Text
color)
in [Inline] -> [Inline]
wrap ([Inline] -> [Inline])
-> JiraConverter m [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> case Text
ident of
"" -> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines [Inline]
inls
_ -> (Text -> Inline
Jira.Anchor Text
ident Inline -> [Inline] -> [Inline]
forall a. a -> [a] -> [a]
:) ([Inline] -> [Inline])
-> JiraConverter m [Inline] -> JiraConverter m [Inline]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Inline] -> JiraConverter m [Inline]
forall (m :: * -> *).
PandocMonad m =>
[Inline] -> JiraConverter m [Inline]
toJiraInlines [Inline]
inls
registerNotes :: PandocMonad m => [Block] -> JiraConverter m [Jira.Inline]
registerNotes :: [Block] -> JiraConverter m [Inline]
registerNotes contents :: [Block]
contents = do
[Text]
curNotes <- (ConverterState -> [Text])
-> ReaderT WrapOption (StateT ConverterState m) [Text]
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets ConverterState -> [Text]
stNotes
let newnum :: Int
newnum = [Text] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Text]
curNotes Int -> Int -> Int
forall a. Num a => a -> a -> a
+ 1
Text
contents' <- [Block] -> JiraConverter m Text
forall (m :: * -> *).
PandocMonad m =>
[Block] -> JiraConverter m Text
blockListToJira [Block]
contents
let thisnote :: Text
thisnote = "\\[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show Int
newnum) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> "] " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
contents' Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> "\n"
(ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ())
-> (ConverterState -> ConverterState)
-> ReaderT WrapOption (StateT ConverterState m) ()
forall a b. (a -> b) -> a -> b
$ \s :: ConverterState
s -> ConverterState
s { stNotes :: [Text]
stNotes = Text
thisnote Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: [Text]
curNotes }
[Inline] -> JiraConverter m [Inline]
forall (m :: * -> *) a. Monad m => a -> m a
return ([Inline] -> JiraConverter m [Inline])
-> (Text -> [Inline]) -> Text -> JiraConverter m [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inline -> [Inline]
forall a. a -> [a]
singleton (Inline -> [Inline]) -> (Text -> Inline) -> Text -> [Inline]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Inline
Jira.Str (Text -> JiraConverter m [Inline])
-> Text -> JiraConverter m [Inline]
forall a b. (a -> b) -> a -> b
$
"[" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show Int
newnum) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> "]"
knownLanguages :: [Text]
knownLanguages :: [Text]
knownLanguages =
[ "actionscript", "ada", "applescript", "bash", "c", "c#", "c++"
, "css", "erlang", "go", "groovy", "haskell", "html", "java", "javascript"
, "json", "lua", "nyan", "objc", "perl", "php", "python", "r", "ruby"
, "scala", "sql", "swift", "visualbasic", "xml", "yaml"
]