git.iko.soy/typeable/pandoc
on master help sign in
Merge pull request #1805 from bergey/rst
a864e9aJohn MacFarlane
src/Text/Pandoc.hs+12−13
@@ -201,19 +201,18 @@ parseFormatSpec = parse formatSpec ""
201 '-' -> Set.delete ext
201 '-' -> Set.delete ext
202 _ -> Set.insert ext
202 _ -> Set.insert ext
203
203
204−-- auxiliary function for readers:
205−markdown :: ReaderOptions -> String -> IO Pandoc
206−markdown o s = do
207− let (doc, warnings) = readMarkdownWithWarnings o s
208− mapM_ warn warnings
209− return doc
210−
211data Reader = StringReader (ReaderOptions -> String -> IO Pandoc)
204data Reader = StringReader (ReaderOptions -> String -> IO Pandoc)
212 | ByteStringReader (ReaderOptions -> BL.ByteString -> IO (Pandoc, MediaBag))
205 | ByteStringReader (ReaderOptions -> BL.ByteString -> IO (Pandoc, MediaBag))
213
206
214mkStringReader :: (ReaderOptions -> String -> Pandoc) -> Reader
207mkStringReader :: (ReaderOptions -> String -> Pandoc) -> Reader
215mkStringReader r = StringReader (\o s -> return $ r o s)
208mkStringReader r = StringReader (\o s -> return $ r o s)
216
209
210+mkStringReaderWithWarnings :: (ReaderOptions -> String -> (Pandoc, [String])) -> Reader
211+mkStringReaderWithWarnings r = StringReader $ \o s -> do
212+ let (doc, warnings) = r o s
213+ mapM_ warn warnings
214+ return doc
215+
217mkBSReader :: (ReaderOptions -> BL.ByteString -> (Pandoc, MediaBag)) -> Reader
216mkBSReader :: (ReaderOptions -> BL.ByteString -> (Pandoc, MediaBag)) -> Reader
218mkBSReader r = ByteStringReader (\o s -> return $ r o s)
217mkBSReader r = ByteStringReader (\o s -> return $ r o s)
219
218
@@ -221,12 +220,12 @@ mkBSReader r = ByteStringReader (\o s -> return $ r o s)
221readers :: [(String, Reader)]
220readers :: [(String, Reader)]
222readers = [ ("native" , StringReader $ \_ s -> return $ readNative s)
221readers = [ ("native" , StringReader $ \_ s -> return $ readNative s)
223 ,("json" , mkStringReader readJSON )
222 ,("json" , mkStringReader readJSON )
224− ,("markdown" , StringReader markdown)
223+ ,("markdown" , mkStringReaderWithWarnings readMarkdownWithWarnings)
225− ,("markdown_strict" , StringReader markdown)
224+ ,("markdown_strict" , mkStringReaderWithWarnings readMarkdownWithWarnings)
226− ,("markdown_phpextra" , StringReader markdown)
225+ ,("markdown_phpextra" , mkStringReaderWithWarnings readMarkdownWithWarnings)
227− ,("markdown_github" , StringReader markdown)
226+ ,("markdown_github" , mkStringReaderWithWarnings readMarkdownWithWarnings)
228− ,("markdown_mmd", StringReader markdown)
227+ ,("markdown_mmd", mkStringReaderWithWarnings readMarkdownWithWarnings)
229− ,("rst" , mkStringReader readRST )
228+ ,("rst" , mkStringReaderWithWarnings readRSTWithWarnings )
230 ,("mediawiki" , mkStringReader readMediaWiki)
229 ,("mediawiki" , mkStringReader readMediaWiki)
231 ,("docbook" , mkStringReader readDocBook)
230 ,("docbook" , mkStringReader readDocBook)
232 ,("opml" , mkStringReader readOPML)
231 ,("opml" , mkStringReader readOPML)
src/Text/Pandoc/Parsing.hs+20−3
@@ -65,6 +65,7 @@ module Text.Pandoc.Parsing ( anyLine,
65 widthsFromIndices,
65 widthsFromIndices,
66 gridTableWith,
66 gridTableWith,
67 readWith,
67 readWith,
68+ readWithWarnings,
68 readWithM,
69 readWithM,
69 testStringWith,
70 testStringWith,
70 guardEnabled,
71 guardEnabled,
@@ -162,6 +163,7 @@ module Text.Pandoc.Parsing ( anyLine,
162 setSourceColumn,
163 setSourceColumn,
163 setSourceLine,
164 setSourceLine,
164 newPos,
165 newPos,
166+ addWarning
165 )
167 )
166where
168where
167
169
@@ -880,6 +882,15 @@ readWith :: Parser [Char] st a
880 -> a
882 -> a
881readWith p t inp = runIdentity $ readWithM p t inp
883readWith p t inp = runIdentity $ readWithM p t inp
882
884
885+readWithWarnings :: Parser [Char] ParserState a
886+ -> ParserState
887+ -> String
888+ -> (a, [String])
889+readWithWarnings p = readWith $ do
890+ doc <- p
891+ warnings <- stateWarnings <$> getState
892+ return (doc, warnings)
893+
883-- | Parse a string with @parser@ (for testing).
894-- | Parse a string with @parser@ (for testing).
884testStringWith :: (Show a, Stream [Char] Identity Char)
895testStringWith :: (Show a, Stream [Char] Identity Char)
885 => ParserT [Char] ParserState Identity a
896 => ParserT [Char] ParserState Identity a
@@ -910,10 +921,9 @@ data ParserState = ParserState
910 stateHasChapters :: Bool, -- ^ True if \chapter encountered
921 stateHasChapters :: Bool, -- ^ True if \chapter encountered
911 stateMacros :: [Macro], -- ^ List of macros defined so far
922 stateMacros :: [Macro], -- ^ List of macros defined so far
912 stateRstDefaultRole :: String, -- ^ Current rST default interpreted text role
923 stateRstDefaultRole :: String, -- ^ Current rST default interpreted text role
913− stateRstCustomRoles :: M.Map String (String, Maybe String, Attr -> (String, Attr)), -- ^ Current rST custom text roles
924+ stateRstCustomRoles :: M.Map String (String, Maybe String, Attr), -- ^ Current rST custom text roles
914 -- Triple represents: 1) Base role, 2) Optional format (only for :raw:
925 -- Triple represents: 1) Base role, 2) Optional format (only for :raw:
915− -- roles), 3) Source language annotation for code (could be used to
926+ -- roles), 3) Additional classes (rest of Attr is unused)).
916− -- annotate role classes too).
917 stateCaption :: Maybe Inlines, -- ^ Caption in current environment
927 stateCaption :: Maybe Inlines, -- ^ Caption in current environment
918 stateInHtmlBlock :: Maybe String, -- ^ Tag type of HTML block being parsed
928 stateInHtmlBlock :: Maybe String, -- ^ Tag type of HTML block being parsed
919 stateMarkdownAttribute :: Bool, -- ^ True if in markdown=1 context
929 stateMarkdownAttribute :: Bool, -- ^ True if in markdown=1 context
@@ -1245,3 +1255,10 @@ applyMacros' target = do
1245 then do macros <- extractMacros <$> getState
1255 then do macros <- extractMacros <$> getState
1246 return $ applyMacros macros target
1256 return $ applyMacros macros target
1247 else return target
1257 else return target
1258+
1259+-- | Append a warning to the log.
1260+addWarning :: Maybe SourcePos -> String -> Parser [Char] ParserState ()
1261+addWarning mbpos msg =
1262+ updateState $ \st -> st{
1263+ stateWarnings = (msg ++ maybe "" (\pos -> " " ++ show pos) mbpos) :
1264+ stateWarnings st }
src/Text/Pandoc/Readers/Markdown.hs+1−11
@@ -79,11 +79,7 @@ readMarkdownWithWarnings :: ReaderOptions -- ^ Reader options
79 -> String -- ^ String to parse (assuming @'\n'@ line endings)
79 -> String -- ^ String to parse (assuming @'\n'@ line endings)
80 -> (Pandoc, [String])
80 -> (Pandoc, [String])
81readMarkdownWithWarnings opts s =
81readMarkdownWithWarnings opts s =
82− (readWith parseMarkdownWithWarnings) def{ stateOptions = opts } (s ++ "\n\n")
82+ (readWithWarnings parseMarkdown) def{ stateOptions = opts } (s ++ "\n\n")
83− where parseMarkdownWithWarnings = do
84− doc <- parseMarkdown
85− warnings <- stateWarnings <$> getState
86− return (doc, warnings)
87
83
88trimInlinesF :: F Inlines -> F Inlines
84trimInlinesF :: F Inlines -> F Inlines
89trimInlinesF = liftM trimInlines
85trimInlinesF = liftM trimInlines
@@ -343,12 +339,6 @@ parseMarkdown = do
343 let Pandoc _ bs = B.doc $ runF blocks st
339 let Pandoc _ bs = B.doc $ runF blocks st
344 return $ Pandoc meta bs
340 return $ Pandoc meta bs
345
341
346−addWarning :: Maybe SourcePos -> String -> MarkdownParser ()
347−addWarning mbpos msg =
348− updateState $ \st -> st{
349− stateWarnings = (msg ++ maybe "" (\pos -> " " ++ show pos) mbpos) :
350− stateWarnings st }
351−
352referenceKey :: MarkdownParser (F Blocks)
342referenceKey :: MarkdownParser (F Blocks)
353referenceKey = try $ do
343referenceKey = try $ do
354 pos <- getPosition
344 pos <- getPosition
src/Text/Pandoc/Readers/RST.hs+62−29
@@ -29,20 +29,21 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29Conversion from reStructuredText to 'Pandoc' document.
29Conversion from reStructuredText to 'Pandoc' document.
30-}
30-}
31module Text.Pandoc.Readers.RST (
31module Text.Pandoc.Readers.RST (
32− readRST
32+ readRST,
33+ readRSTWithWarnings
33 ) where
34 ) where
34import Text.Pandoc.Definition
35import Text.Pandoc.Definition
35import Text.Pandoc.Builder (setMeta, fromList)
36import Text.Pandoc.Builder (setMeta, fromList)
36import Text.Pandoc.Shared
37import Text.Pandoc.Shared
37import Text.Pandoc.Parsing
38import Text.Pandoc.Parsing
38import Text.Pandoc.Options
39import Text.Pandoc.Options
39−import Control.Monad ( when, liftM, guard, mzero, mplus )
40+import Control.Monad ( when, liftM, guard, mzero )
40import Data.List ( findIndex, intersperse, intercalate,
41import Data.List ( findIndex, intersperse, intercalate,
41− transpose, sort, deleteFirstsBy, isSuffixOf )
42+ transpose, sort, deleteFirstsBy, isSuffixOf , nub, union)
42import Data.Maybe (fromMaybe)
43import Data.Maybe (fromMaybe)
43import qualified Data.Map as M
44import qualified Data.Map as M
44import Text.Printf ( printf )
45import Text.Printf ( printf )
45−import Control.Applicative ((<$>), (<$), (<*), (*>), (<*>))
46+import Control.Applicative ((<$>), (<$), (<*), (*>), (<*>), pure)
46import Text.Pandoc.Builder (Inlines, Blocks, trimInlines, (<>))
47import Text.Pandoc.Builder (Inlines, Blocks, trimInlines, (<>))
47import qualified Text.Pandoc.Builder as B
48import qualified Text.Pandoc.Builder as B
48import Data.Monoid (mconcat, mempty)
49import Data.Monoid (mconcat, mempty)
@@ -55,6 +56,9 @@ readRST :: ReaderOptions -- ^ Reader options
55 -> Pandoc
56 -> Pandoc
56readRST opts s = (readWith parseRST) def{ stateOptions = opts } (s ++ "\n\n")
57readRST opts s = (readWith parseRST) def{ stateOptions = opts } (s ++ "\n\n")
57
58
59+readRSTWithWarnings :: ReaderOptions -> String -> (Pandoc, [String])
60+readRSTWithWarnings opts s = (readWithWarnings parseRST) def{ stateOptions = opts } (s ++ "\n\n")
61+
58type RSTParser = Parser [Char] ParserState
62type RSTParser = Parser [Char] ParserState
59
63
60--
64--
@@ -608,38 +612,62 @@ directive' = do
608 "" -> block
612 "" -> block
609 _ -> parseFromString parseBlocks body'
613 _ -> parseFromString parseBlocks body'
610 return $ B.divWith attrs children
614 return $ B.divWith attrs children
615+ other -> do
616+ pos <- getPosition
617+ addWarning (Just pos) $ "ignoring unknown directive: " ++ other
611− _ -> return mempty
618+ return mempty
612
619
613-- TODO:
620-- TODO:
614-- - Silently ignores illegal fields
621-- - Silently ignores illegal fields
615−-- - Silently drops classes
616-- - Only supports :format: fields with a single format for :raw: roles,
622-- - Only supports :format: fields with a single format for :raw: roles,
617-- change Text.Pandoc.Definition.Format to fix
623-- change Text.Pandoc.Definition.Format to fix
618addNewRole :: String -> [(String, String)] -> RSTParser Blocks
624addNewRole :: String -> [(String, String)] -> RSTParser Blocks
619addNewRole roleString fields = do
625addNewRole roleString fields = do
620 (role, parentRole) <- parseFromString inheritedRole roleString
626 (role, parentRole) <- parseFromString inheritedRole roleString
621 customRoles <- stateRstCustomRoles <$> getState
627 customRoles <- stateRstCustomRoles <$> getState
628+ let (baseRole, baseFmt, baseAttr) =
629+ maybe (parentRole, Nothing, nullAttr) id $
622− baseRole <- case M.lookup parentRole customRoles of
630+ M.lookup parentRole customRoles
623− Just (base, _, _) -> return base
624− Nothing -> return parentRole
625−
626− let fmt = if baseRole == "raw" then lookup "format" fields else Nothing
631+ fmt = if parentRole == "raw" then lookup "format" fields else baseFmt
627− annotate = maybe id addLanguage $
632+ annotate :: [String] -> [String]
633+ annotate = maybe id (:) $
628− if baseRole == "code"
634+ if parentRole == "code"
629 then lookup "language" fields
635 then lookup "language" fields
630 else Nothing
636 else Nothing
637+ attr = let (ident, classes, keyValues) = baseAttr
638+ -- nub in case role name & language class are the same
639+ in (ident, nub . (role :) . annotate $ classes, keyValues)
640+
641+ -- warn about syntax we ignore
642+ flip mapM_ fields $ \(key, _) -> case key of
643+ "language" -> when (parentRole /= "code") $ addWarning Nothing $
644+ "ignoring :language: field because the parent of role :" ++
645+ role ++ ": is :" ++ parentRole ++ ": not :code:"
646+ "format" -> when (parentRole /= "raw") $ addWarning Nothing $
647+ "ignoring :format: field because the parent of role :" ++
648+ role ++ ": is :" ++ parentRole ++ ": not :raw:"
649+ _ -> addWarning Nothing $ "ignoring unknown field :" ++ key ++
650+ ": in definition of role :" ++ role ++ ": in"
651+ when (parentRole == "raw" && countKeys "format" > 1) $
652+ addWarning Nothing $
653+ "ignoring :format: fields after the first in the definition of role :"
654+ ++ role ++": in"
655+ when (parentRole == "code" && countKeys "language" > 1) $
656+ addWarning Nothing $
657+ "ignoring :language: fields after the first in the definition of role :"
658+ ++ role ++": in"
631
659
632 updateState $ \s -> s {
660 updateState $ \s -> s {
633 stateRstCustomRoles =
661 stateRstCustomRoles =
634− M.insert role (baseRole, fmt, (,) parentRole . annotate) customRoles
662+ M.insert role (baseRole, fmt, attr) customRoles
635 }
663 }
636
664
637 return $ B.singleton Null
665 return $ B.singleton Null
638 where
666 where
639− addLanguage lang (ident, classes, keyValues) =
667+ countKeys k = length . filter (== k) . map fst $ fields
640− (ident, "sourceCode" : lang : classes, keyValues)
641 inheritedRole =
668 inheritedRole =
642− (,) <$> roleNameEndingIn (char '(') <*> roleNameEndingIn (char ')')
669+ (,) <$> roleName <*> ((char '(' *> roleName <* char ')') <|> pure "span")
670+
643
671
644-- Can contain character codes as decimal numbers or
672-- Can contain character codes as decimal numbers or
645-- hexadecimal numbers, prefixed by 0x, x, \x, U+, u, or \u
673-- hexadecimal numbers, prefixed by 0x, x, \x, U+, u, or \u
@@ -999,21 +1027,23 @@ renderRole contents fmt role attr = case role of
999 "RFC" -> return $ rfcLink contents
1027 "RFC" -> return $ rfcLink contents
1000 "pep-reference" -> return $ pepLink contents
1028 "pep-reference" -> return $ pepLink contents
1001 "PEP" -> return $ pepLink contents
1029 "PEP" -> return $ pepLink contents
1002− "literal" -> return $ B.str contents
1030+ "literal" -> return $ B.codeWith attr contents
1003 "math" -> return $ B.math contents
1031 "math" -> return $ B.math contents
1004 "title-reference" -> titleRef contents
1032 "title-reference" -> titleRef contents
1005 "title" -> titleRef contents
1033 "title" -> titleRef contents
1006 "t" -> titleRef contents
1034 "t" -> titleRef contents
1007− "code" -> return $ B.codeWith attr contents
1035+ "code" -> return $ B.codeWith (addClass "sourceCode" attr) contents
1036+ "span" -> return $ B.spanWith attr $ B.str contents
1008 "raw" -> return $ B.rawInline (fromMaybe "" fmt) contents
1037 "raw" -> return $ B.rawInline (fromMaybe "" fmt) contents
1009 custom -> do
1038 custom -> do
1010− customRole <- stateRstCustomRoles <$> getState
1039+ customRoles <- stateRstCustomRoles <$> getState
1011− case M.lookup custom customRole of
1040+ case M.lookup custom customRoles of
1012− Just (_, newFmt, inherit) -> let
1041+ Just (newRole, newFmt, newAttr) ->
1013− fmtStr = fmt `mplus` newFmt
1014− (newRole, newAttr) = inherit attr
1015− in renderRole contents fmtStr newRole newAttr
1042+ renderRole contents newFmt newRole newAttr
1043+ Nothing -> do
1044+ pos <- getPosition
1045+ addWarning (Just pos) $ "ignoring unknown role :" ++ custom ++ ": in"
1016− Nothing -> return $ B.str contents -- Undefined role
1046+ return $ B.str contents -- Undefined role
1017 where
1047 where
1018 titleRef ref = return $ B.str ref -- FIXME: Not a sensible behaviour
1048 titleRef ref = return $ B.str ref -- FIXME: Not a sensible behaviour
1019 rfcLink rfcNo = B.link rfcUrl ("RFC " ++ rfcNo) $ B.str ("RFC " ++ rfcNo)
1049 rfcLink rfcNo = B.link rfcUrl ("RFC " ++ rfcNo) $ B.str ("RFC " ++ rfcNo)
@@ -1022,11 +1052,14 @@ renderRole contents fmt role attr = case role of
1022 where padNo = replicate (4 - length pepNo) '0' ++ pepNo
1052 where padNo = replicate (4 - length pepNo) '0' ++ pepNo
1023 pepUrl = "http://www.python.org/dev/peps/pep-" ++ padNo ++ "/"
1053 pepUrl = "http://www.python.org/dev/peps/pep-" ++ padNo ++ "/"
1024
1054
1055+addClass :: String -> Attr -> Attr
1056+addClass c (ident, classes, keyValues) = (ident, union classes [c], keyValues)
1057+
1025−roleNameEndingIn :: RSTParser Char -> RSTParser String
1058+roleName :: RSTParser String
1026−roleNameEndingIn end = many1Till (letter <|> char '-') end
1059+roleName = many1 (letter <|> char '-')
1027
1060
1028roleMarker :: RSTParser String
1061roleMarker :: RSTParser String
1029−roleMarker = char ':' *> roleNameEndingIn (char ':')
1062+roleMarker = char ':' *> roleName <* char ':'
1030
1063
1031roleBefore :: RSTParser (String,String)
1064roleBefore :: RSTParser (String,String)
1032roleBefore = try $ do
1065roleBefore = try $ do
tests/Tests/Readers/RST.hs+37−18
@@ -67,26 +67,45 @@ tests = [ "line block with blank line" =:
67 link "http://foo.bar.baz" "" "http://foo.bar.baz" <> ". " <>
67 link "http://foo.bar.baz" "" "http://foo.bar.baz" <> ". " <>
68 link "http://foo.bar/baz_(bam)" "" "http://foo.bar/baz_(bam)"
68 link "http://foo.bar/baz_(bam)" "" "http://foo.bar/baz_(bam)"
69 <> " (" <> link "http://foo.bar" "" "http://foo.bar" <> ")")
69 <> " (" <> link "http://foo.bar" "" "http://foo.bar" <> ")")
70+ , testGroup "literal / line / code blocks"
70− , "indented literal block" =: unlines
71+ [ "indented literal block" =: unlines
71− [ "::"
72+ [ "::"
72− , ""
73+ , ""
73− , " block quotes"
74+ , " block quotes"
74− , ""
75+ , ""
75− , " can go on for many lines"
76+ , " can go on for many lines"
76− , "but must stop here"]
77+ , "but must stop here"]
77− =?> (doc $
78+ =?> (doc $
78− codeBlock "block quotes\n\ncan go on for many lines" <>
79+ codeBlock "block quotes\n\ncan go on for many lines" <>
79− para "but must stop here")
80+ para "but must stop here")
80− , "line block with 3 lines" =: "| a\n| b\n| c"
81+ , "line block with 3 lines" =: "| a\n| b\n| c"
81− =?> para ("a" <> linebreak <> "b" <> linebreak <> "c")
82+ =?> para ("a" <> linebreak <> "b" <> linebreak <> "c")
82 , "quoted literal block using >" =: "::\n\n> quoted\n> block\n\nOrdinary paragraph"
83 , "quoted literal block using >" =: "::\n\n> quoted\n> block\n\nOrdinary paragraph"
83 =?> codeBlock "> quoted\n> block" <> para "Ordinary paragraph"
84 =?> codeBlock "> quoted\n> block" <> para "Ordinary paragraph"
84 , "quoted literal block using | (not a line block)" =: "::\n\n| quoted\n| block\n\nOrdinary paragraph"
85 , "quoted literal block using | (not a line block)" =: "::\n\n| quoted\n| block\n\nOrdinary paragraph"
85 =?> codeBlock "| quoted\n| block" <> para "Ordinary paragraph"
86 =?> codeBlock "| quoted\n| block" <> para "Ordinary paragraph"
86− , "class directive with single paragraph" =: ".. class:: special\n\nThis is a \"special\" paragraph."
87+ , "class directive with single paragraph" =: ".. class:: special\n\nThis is a \"special\" paragraph."
87− =?> divWith ("", ["special"], []) (para "This is a \"special\" paragraph.")
88+ =?> divWith ("", ["special"], []) (para "This is a \"special\" paragraph.")
88− , "class directive with two paragraphs" =: ".. class:: exceptional remarkable\n\n First paragraph.\n\n Second paragraph."
89+ , "class directive with two paragraphs" =: ".. class:: exceptional remarkable\n\n First paragraph.\n\n Second paragraph."
89− =?> divWith ("", ["exceptional", "remarkable"], []) (para "First paragraph." <> para "Second paragraph.")
90+ =?> divWith ("", ["exceptional", "remarkable"], []) (para "First paragraph." <> para "Second paragraph.")
90− , "class directive around literal block" =: ".. class:: classy\n\n::\n\n a\n b"
91+ , "class directive around literal block" =: ".. class:: classy\n\n::\n\n a\n b"
91− =?> divWith ("", ["classy"], []) (codeBlock "a\nb")
92+ =?> divWith ("", ["classy"], []) (codeBlock "a\nb")]
93+ , testGroup "interpreted text roles"
94+ [ "literal role prefix" =: ":literal:`a`" =?> para (code "a")
95+ , "literal role postfix" =: "`a`:literal:" =?> para (code "a")
96+ , "literal text" =: "``text``" =?> para (code "text")
97+ , "code role" =: ":code:`a`" =?> para (codeWith ("", ["sourceCode"], []) "a")
98+ , "inherited code role" =: ".. role:: codeLike(code)\n\n:codeLike:`a`"
99+ =?> para (codeWith ("", ["codeLike", "sourceCode"], []) "a")
100+ , "custom code role with language field"
101+ =: ".. role:: lhs(code)\n :language: haskell\n\n:lhs:`a`"
102+ =?> para (codeWith ("", ["lhs", "haskell","sourceCode"], []) "a")
103+ , "custom role with unspecified parent role"
104+ =: ".. role:: classy\n\n:classy:`text`"
105+ =?> para (spanWith ("", ["classy"], []) "text")
106+ , "role with recursive inheritance"
107+ =: ".. role:: haskell(code)\n.. role:: lhs(haskell)\n\n:lhs:`text`"
108+ =?> para (codeWith ("", ["lhs", "haskell", "sourceCode"], []) "text")
109+ , "unknown role" =: ":unknown:`text`" =?> para (str "text")
110+ ]
92 ]
111 ]
tests/rst-reader.native+3−3
@@ -322,12 +322,12 @@ Pandoc (Meta {unMeta = fromList [("author",MetaList [MetaInlines [Str "John",Spa
322,Null
322,Null
323,Para [Str "And",Space,Str "now",Space,Str "with",Space,RawInline (Format "html") "<b>inline</b> <span id=\"test\">HTML</span>",Str "."]
323,Para [Str "And",Space,Str "now",Space,Str "with",Space,RawInline (Format "html") "<b>inline</b> <span id=\"test\">HTML</span>",Str "."]
324,Null
324,Null
325−,Para [Str "And",Space,Str "some",Space,Str "inline",Space,Str "haskell",Space,Code ("",["sourceCode","haskell"],[]) "fmap id [1,2..10]",Str "."]
325+,Para [Str "And",Space,Str "some",Space,Str "inline",Space,Str "haskell",Space,Code ("",["haskell","sourceCode"],[]) "fmap id [1,2..10]",Str "."]
326,Null
326,Null
327,Null
327,Null
328−,Para [Str "Indirect",Space,Str "python",Space,Str "role",Space,Code ("",["sourceCode","python"],[]) "[x*x for x in [1,2,3,4,5]]",Str "."]
328+,Para [Str "Indirect",Space,Str "python",Space,Str "role",Space,Code ("",["python","indirect","sourceCode"],[]) "[x*x for x in [1,2,3,4,5]]",Str "."]
329,Null
329,Null
330,Null
330,Null
331−,Para [Str "Different",Space,Str "indirect",Space,Str "C",Space,Code ("",["sourceCode","c"],[]) "int x = 15;",Str "."]
331+,Para [Str "Different",Space,Str "indirect",Space,Str "C",Space,Code ("",["c","different-indirect","sourceCode"],[]) "int x = 15;",Str "."]
332,Header 2 ("literal-symbols",[],[]) [Str "Literal",Space,Str "symbols"]
332,Header 2 ("literal-symbols",[],[]) [Str "Literal",Space,Str "symbols"]
333,Para [Str "2*2",Space,Str "=",Space,Str "4*1"]]
333,Para [Str "2*2",Space,Str "=",Space,Str "4*1"]]