git.iko.soy/typeable/pandoc
on master help sign in
MediaWiki reader: Add automatic header identifiers.
0fd2176John MacFarlane
src/Text/Pandoc/Readers/MediaWiki.hs+20−2
@@ -1,4 +1,5 @@
1+{-# LANGUAGE RelaxedPolyRec, FlexibleInstances, TypeSynonymInstances #-}
1−{-# LANGUAGE RelaxedPolyRec #-} -- needed for inlinesBetween on GHC < 7
2+-- RelaxedPolyRec needed for inlinesBetween on GHC < 7
2{-
3{-
3 Copyright (C) 2012 John MacFarlane <jgm@berkeley.edu>
4 Copyright (C) 2012 John MacFarlane <jgm@berkeley.edu>
4
5
@@ -51,6 +52,7 @@ import Data.List (intersperse, intercalate, isPrefixOf )
51import Text.HTML.TagSoup
52import Text.HTML.TagSoup
52import Data.Sequence (viewl, ViewL(..), (<|))
53import Data.Sequence (viewl, ViewL(..), (<|))
53import qualified Data.Foldable as F
54import qualified Data.Foldable as F
55+import qualified Data.Map as M
54import Data.Char (isDigit, isSpace)
56import Data.Char (isDigit, isSpace)
55
57
56-- | Read mediawiki from an input string and return a Pandoc document.
58-- | Read mediawiki from an input string and return a Pandoc document.
@@ -62,6 +64,8 @@ readMediaWiki opts s =
62 , mwMaxNestingLevel = 4
64 , mwMaxNestingLevel = 4
63 , mwNextLinkNumber = 1
65 , mwNextLinkNumber = 1
64 , mwCategoryLinks = []
66 , mwCategoryLinks = []
67+ , mwHeaderMap = M.empty
68+ , mwIdentifierList = []
65 }
69 }
66 "source" (s ++ "\n") of
70 "source" (s ++ "\n") of
67 Left err' -> error $ "\nError:\n" ++ show err'
71 Left err' -> error $ "\nError:\n" ++ show err'
@@ -71,10 +75,23 @@ data MWState = MWState { mwOptions :: ReaderOptions
71 , mwMaxNestingLevel :: Int
75 , mwMaxNestingLevel :: Int
72 , mwNextLinkNumber :: Int
76 , mwNextLinkNumber :: Int
73 , mwCategoryLinks :: [Inlines]
77 , mwCategoryLinks :: [Inlines]
78+ , mwHeaderMap :: M.Map Inlines String
79+ , mwIdentifierList :: [String]
74 }
80 }
75
81
76type MWParser = Parser [Char] MWState
82type MWParser = Parser [Char] MWState
77
83
84+instance HasReaderOptions MWParser where
85+ askReaderOption f = (f . mwOptions) `fmap` getState
86+
87+instance HasHeaderMap MWParser where
88+ getHeaderMap = fmap mwHeaderMap getState
89+ putHeaderMap hm = updateState $ \st -> st{ mwHeaderMap = hm }
90+
91+instance HasIdentifierList MWParser where
92+ getIdentifierList = fmap mwIdentifierList getState
93+ putIdentifierList l = updateState $ \st -> st{ mwIdentifierList = l }
94+
78--
95--
79-- auxiliary functions
96-- auxiliary functions
80--
97--
@@ -351,7 +368,8 @@ header = try $ do
351 let lev = length eqs
368 let lev = length eqs
352 guard $ lev <= 6
369 guard $ lev <= 6
353 contents <- trimInlines . mconcat <$> manyTill inline (count lev $ char '=')
370 contents <- trimInlines . mconcat <$> manyTill inline (count lev $ char '=')
371+ attr <- registerHeader nullAttr contents
354− return $ B.header lev contents
372+ return $ B.headerWith attr lev contents
355
373
356bulletList :: MWParser Blocks
374bulletList :: MWParser Blocks
357bulletList = B.bulletList <$>
375bulletList = B.bulletList <$>
tests/mediawiki-reader.native+29−29
@@ -1,39 +1,39 @@
1Pandoc (Meta {unMeta = fromList []})
1Pandoc (Meta {unMeta = fromList []})
2−[Header 1 ("",[],[]) [Str "header"]
2+[Header 1 ("header",[],[]) [Str "header"]
3−,Header 2 ("",[],[]) [Str "header",Space,Str "level",Space,Str "two"]
3+,Header 2 ("header-level-two",[],[]) [Str "header",Space,Str "level",Space,Str "two"]
4−,Header 3 ("",[],[]) [Str "header",Space,Str "level",Space,Str "3"]
4+,Header 3 ("header-level-3",[],[]) [Str "header",Space,Str "level",Space,Str "3"]
5−,Header 4 ("",[],[]) [Str "header",Space,Emph [Str "level"],Space,Str "four"]
5+,Header 4 ("header-level-four",[],[]) [Str "header",Space,Emph [Str "level"],Space,Str "four"]
6−,Header 5 ("",[],[]) [Str "header",Space,Str "level",Space,Str "5"]
6+,Header 5 ("header-level-5",[],[]) [Str "header",Space,Str "level",Space,Str "5"]
7−,Header 6 ("",[],[]) [Str "header",Space,Str "level",Space,Str "6"]
7+,Header 6 ("header-level-6",[],[]) [Str "header",Space,Str "level",Space,Str "6"]
8,Para [Str "=======",Space,Str "not",Space,Str "a",Space,Str "header",Space,Str "========"]
8,Para [Str "=======",Space,Str "not",Space,Str "a",Space,Str "header",Space,Str "========"]
9,Para [Code ("",[],[]) "==\160not\160a\160header\160=="]
9,Para [Code ("",[],[]) "==\160not\160a\160header\160=="]
10−,Header 2 ("",[],[]) [Str "emph",Space,Str "and",Space,Str "strong"]
10+,Header 2 ("emph-and-strong",[],[]) [Str "emph",Space,Str "and",Space,Str "strong"]
11,Para [Emph [Str "emph"],Space,Strong [Str "strong"]]
11,Para [Emph [Str "emph"],Space,Strong [Str "strong"]]
12,Para [Strong [Emph [Str "strong",Space,Str "and",Space,Str "emph"]]]
12,Para [Strong [Emph [Str "strong",Space,Str "and",Space,Str "emph"]]]
13,Para [Strong [Emph [Str "emph",Space,Str "inside"],Space,Str "strong"]]
13,Para [Strong [Emph [Str "emph",Space,Str "inside"],Space,Str "strong"]]
14,Para [Strong [Str "strong",Space,Str "with",Space,Emph [Str "emph"]]]
14,Para [Strong [Str "strong",Space,Str "with",Space,Emph [Str "emph"]]]
15,Para [Emph [Strong [Str "strong",Space,Str "inside"],Space,Str "emph"]]
15,Para [Emph [Strong [Str "strong",Space,Str "inside"],Space,Str "emph"]]
16−,Header 2 ("",[],[]) [Str "horizontal",Space,Str "rule"]
16+,Header 2 ("horizontal-rule",[],[]) [Str "horizontal",Space,Str "rule"]
17,Para [Str "top"]
17,Para [Str "top"]
18,HorizontalRule
18,HorizontalRule
19,Para [Str "bottom"]
19,Para [Str "bottom"]
20,HorizontalRule
20,HorizontalRule
21−,Header 2 ("",[],[]) [Str "nowiki"]
21+,Header 2 ("nowiki",[],[]) [Str "nowiki"]
22,Para [Str "''not",Space,Str "emph''"]
22,Para [Str "''not",Space,Str "emph''"]
23−,Header 2 ("",[],[]) [Str "strikeout"]
23+,Header 2 ("strikeout",[],[]) [Str "strikeout"]
24,Para [Strikeout [Str "This",Space,Str "is",Space,Emph [Str "struck",Space,Str "out"]]]
24,Para [Strikeout [Str "This",Space,Str "is",Space,Emph [Str "struck",Space,Str "out"]]]
25−,Header 2 ("",[],[]) [Str "entities"]
25+,Header 2 ("entities",[],[]) [Str "entities"]
26,Para [Str "hi",Space,Str "&",Space,Str "low"]
26,Para [Str "hi",Space,Str "&",Space,Str "low"]
27,Para [Str "hi",Space,Str "&",Space,Str "low"]
27,Para [Str "hi",Space,Str "&",Space,Str "low"]
28,Para [Str "G\246del"]
28,Para [Str "G\246del"]
29,Para [Str "\777\2730"]
29,Para [Str "\777\2730"]
30−,Header 2 ("",[],[]) [Str "comments"]
30+,Header 2 ("comments",[],[]) [Str "comments"]
31,Para [Str "inline",Space,Str "comment"]
31,Para [Str "inline",Space,Str "comment"]
32,Para [Str "between",Space,Str "blocks"]
32,Para [Str "between",Space,Str "blocks"]
33−,Header 2 ("",[],[]) [Str "linebreaks"]
33+,Header 2 ("linebreaks",[],[]) [Str "linebreaks"]
34,Para [Str "hi",LineBreak,Str "there"]
34,Para [Str "hi",LineBreak,Str "there"]
35,Para [Str "hi",LineBreak,Str "there"]
35,Para [Str "hi",LineBreak,Str "there"]
36−,Header 2 ("",[],[]) [Str ":",Space,Str "indents"]
36+,Header 2 ("indents",[],[]) [Str ":",Space,Str "indents"]
37,Para [Str "hi"]
37,Para [Str "hi"]
38,DefinitionList
38,DefinitionList
39 [([],
39 [([],
@@ -46,36 +46,36 @@ Pandoc (Meta {unMeta = fromList []})
46 [([],
46 [([],
47 [[Plain [Str "there"]]])]]])]
47 [[Plain [Str "there"]]])]]])]
48,Para [Str "bud"]
48,Para [Str "bud"]
49−,Header 2 ("",[],[]) [Str "p",Space,Str "tags"]
49+,Header 2 ("p-tags",[],[]) [Str "p",Space,Str "tags"]
50,Para [Str "hi",Space,Str "there"]
50,Para [Str "hi",Space,Str "there"]
51,Para [Str "bud"]
51,Para [Str "bud"]
52,Para [Str "another"]
52,Para [Str "another"]
53−,Header 2 ("",[],[]) [Str "raw",Space,Str "html"]
53+,Header 2 ("raw-html",[],[]) [Str "raw",Space,Str "html"]
54,Para [Str "hi",Space,RawInline (Format "html") "<span style=\"color:red\">",Emph [Str "there"],RawInline (Format "html") "</span>",Str "."]
54,Para [Str "hi",Space,RawInline (Format "html") "<span style=\"color:red\">",Emph [Str "there"],RawInline (Format "html") "</span>",Str "."]
55,Para [RawInline (Format "html") "<ins>",Str "inserted",RawInline (Format "html") "</ins>"]
55,Para [RawInline (Format "html") "<ins>",Str "inserted",RawInline (Format "html") "</ins>"]
56,RawBlock (Format "html") "<div class=\"special\">"
56,RawBlock (Format "html") "<div class=\"special\">"
57,Para [Str "hi",Space,Emph [Str "there"]]
57,Para [Str "hi",Space,Emph [Str "there"]]
58,RawBlock (Format "html") "</div>"
58,RawBlock (Format "html") "</div>"
59−,Header 2 ("",[],[]) [Str "sup,",Space,Str "sub,",Space,Str "del"]
59+,Header 2 ("sup-sub-del",[],[]) [Str "sup,",Space,Str "sub,",Space,Str "del"]
60,Para [Str "H",Subscript [Str "2"],Str "O",Space,Str "base",Superscript [Emph [Str "exponent"]],Space,Strikeout [Str "hello"]]
60,Para [Str "H",Subscript [Str "2"],Str "O",Space,Str "base",Superscript [Emph [Str "exponent"]],Space,Strikeout [Str "hello"]]
61−,Header 2 ("",[],[]) [Str "inline",Space,Str "code"]
61+,Header 2 ("inline-code",[],[]) [Str "inline",Space,Str "code"]
62,Para [Code ("",[],[]) "*\8594*",Space,Code ("",[],[]) "typed",Space,Code ("",["haskell"],[]) ">>="]
62,Para [Code ("",[],[]) "*\8594*",Space,Code ("",[],[]) "typed",Space,Code ("",["haskell"],[]) ">>="]
63−,Header 2 ("",[],[]) [Str "code",Space,Str "blocks"]
63+,Header 2 ("code-blocks",[],[]) [Str "code",Space,Str "blocks"]
64,CodeBlock ("",[],[]) "case xs of\n (_:_) -> reverse xs\n [] -> ['*']"
64,CodeBlock ("",[],[]) "case xs of\n (_:_) -> reverse xs\n [] -> ['*']"
65,CodeBlock ("",["haskell"],[]) "case xs of\n (_:_) -> reverse xs\n [] -> ['*']"
65,CodeBlock ("",["haskell"],[]) "case xs of\n (_:_) -> reverse xs\n [] -> ['*']"
66,CodeBlock ("",["ruby","numberLines"],[("startFrom","100")]) "widgets.each do |w|\n print w.price\nend"
66,CodeBlock ("",["ruby","numberLines"],[("startFrom","100")]) "widgets.each do |w|\n print w.price\nend"
67−,Header 2 ("",[],[]) [Str "block",Space,Str "quotes"]
67+,Header 2 ("block-quotes",[],[]) [Str "block",Space,Str "quotes"]
68,Para [Str "Regular",Space,Str "paragraph"]
68,Para [Str "Regular",Space,Str "paragraph"]
69,BlockQuote
69,BlockQuote
70 [Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "block",Space,Str "quote."]
70 [Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "block",Space,Str "quote."]
71 ,Para [Str "With",Space,Str "two",Space,Str "paragraphs."]]
71 ,Para [Str "With",Space,Str "two",Space,Str "paragraphs."]]
72,Para [Str "Nother",Space,Str "paragraph."]
72,Para [Str "Nother",Space,Str "paragraph."]
73−,Header 2 ("",[],[]) [Str "external",Space,Str "links"]
73+,Header 2 ("external-links",[],[]) [Str "external",Space,Str "links"]
74,Para [Link [Emph [Str "Google"],Space,Str "search",Space,Str "engine"] ("http://google.com","")]
74,Para [Link [Emph [Str "Google"],Space,Str "search",Space,Str "engine"] ("http://google.com","")]
75,Para [Link [Str "http://johnmacfarlane.net/pandoc/"] ("http://johnmacfarlane.net/pandoc/","")]
75,Para [Link [Str "http://johnmacfarlane.net/pandoc/"] ("http://johnmacfarlane.net/pandoc/","")]
76,Para [Link [Str "1"] ("http://google.com",""),Space,Link [Str "2"] ("http://yahoo.com","")]
76,Para [Link [Str "1"] ("http://google.com",""),Space,Link [Str "2"] ("http://yahoo.com","")]
77,Para [Link [Str "email",Space,Str "me"] ("mailto:info@example.org","")]
77,Para [Link [Str "email",Space,Str "me"] ("mailto:info@example.org","")]
78−,Header 2 ("",[],[]) [Str "internal",Space,Str "links"]
78+,Header 2 ("internal-links",[],[]) [Str "internal",Space,Str "links"]
79,Para [Link [Str "Help"] ("Help","wikilink")]
79,Para [Link [Str "Help"] ("Help","wikilink")]
80,Para [Link [Str "the",Space,Str "help",Space,Str "page"] ("Help","wikilink")]
80,Para [Link [Str "the",Space,Str "help",Space,Str "page"] ("Help","wikilink")]
81,Para [Link [Str "Helpers"] ("Help","wikilink")]
81,Para [Link [Str "Helpers"] ("Help","wikilink")]
@@ -83,12 +83,12 @@ Pandoc (Meta {unMeta = fromList []})
83,Para [Link [Str "Contents"] ("Help:Contents","wikilink")]
83,Para [Link [Str "Contents"] ("Help:Contents","wikilink")]
84,Para [Link [Str "#My",Space,Str "anchor"] ("#My_anchor","wikilink")]
84,Para [Link [Str "#My",Space,Str "anchor"] ("#My_anchor","wikilink")]
85,Para [Link [Str "and",Space,Str "text"] ("Page#with_anchor","wikilink")]
85,Para [Link [Str "and",Space,Str "text"] ("Page#with_anchor","wikilink")]
86−,Header 2 ("",[],[]) [Str "images"]
86+,Header 2 ("images",[],[]) [Str "images"]
87,Para [Image [Str "caption"] ("example.jpg","fig:caption")]
87,Para [Image [Str "caption"] ("example.jpg","fig:caption")]
88,Para [Image [Str "the",Space,Emph [Str "caption"],Space,Str "with",Space,Link [Str "external",Space,Str "link"] ("http://google.com","")] ("example.jpg","fig:the caption with external link")]
88,Para [Image [Str "the",Space,Emph [Str "caption"],Space,Str "with",Space,Link [Str "external",Space,Str "link"] ("http://google.com","")] ("example.jpg","fig:the caption with external link")]
89,Para [Image [Str "caption"] ("example.jpg","fig:caption")]
89,Para [Image [Str "caption"] ("example.jpg","fig:caption")]
90,Para [Image [Str "example.jpg"] ("example.jpg","fig:example.jpg")]
90,Para [Image [Str "example.jpg"] ("example.jpg","fig:example.jpg")]
91−,Header 2 ("",[],[]) [Str "lists"]
91+,Header 2 ("lists",[],[]) [Str "lists"]
92,BulletList
92,BulletList
93 [[Plain [Str "Start",Space,Str "each",Space,Str "line"]]
93 [[Plain [Str "Start",Space,Str "each",Space,Str "line"]]
94 ,[Plain [Str "with",Space,Str "an",Space,Str "asterisk",Space,Str "(*)."]
94 ,[Plain [Str "with",Space,Str "an",Space,Str "asterisk",Space,Str "(*)."]
@@ -161,10 +161,10 @@ Pandoc (Meta {unMeta = fromList []})
161 [[Plain [Str "Amsterdam"]]
161 [[Plain [Str "Amsterdam"]]
162 ,[Plain [Str "Rotterdam"]]
162 ,[Plain [Str "Rotterdam"]]
163 ,[Plain [Str "The",Space,Str "Hague"]]]
163 ,[Plain [Str "The",Space,Str "Hague"]]]
164−,Header 2 ("",[],[]) [Str "math"]
164+,Header 2 ("math",[],[]) [Str "math"]
165,Para [Str "Here",Space,Str "is",Space,Str "some",Space,Math InlineMath "x=\\frac{y^\\pi}{z}",Str "."]
165,Para [Str "Here",Space,Str "is",Space,Str "some",Space,Math InlineMath "x=\\frac{y^\\pi}{z}",Str "."]
166,Para [Str "With",Space,Str "spaces:",Space,Math InlineMath "x=\\frac{y^\\pi}{z}",Str "."]
166,Para [Str "With",Space,Str "spaces:",Space,Math InlineMath "x=\\frac{y^\\pi}{z}",Str "."]
167−,Header 2 ("",[],[]) [Str "preformatted",Space,Str "blocks"]
167+,Header 2 ("preformatted-blocks",[],[]) [Str "preformatted",Space,Str "blocks"]
168,Para [Code ("",[],[]) "Start\160each\160line\160with\160a\160space.",LineBreak,Code ("",[],[]) "Text\160is\160",Strong [Code ("",[],[]) "preformatted"],Code ("",[],[]) "\160and",LineBreak,Emph [Code ("",[],[]) "markups"],Code ("",[],[]) "\160",Strong [Emph [Code ("",[],[]) "can"]],Code ("",[],[]) "\160be\160done."]
168,Para [Code ("",[],[]) "Start\160each\160line\160with\160a\160space.",LineBreak,Code ("",[],[]) "Text\160is\160",Strong [Code ("",[],[]) "preformatted"],Code ("",[],[]) "\160and",LineBreak,Emph [Code ("",[],[]) "markups"],Code ("",[],[]) "\160",Strong [Emph [Code ("",[],[]) "can"]],Code ("",[],[]) "\160be\160done."]
169,Para [Code ("",[],[]) "\160hell\160\160\160\160\160\160yeah"]
169,Para [Code ("",[],[]) "\160hell\160\160\160\160\160\160yeah"]
170,Para [Code ("",[],[]) "Start\160with\160a\160space\160in\160the\160first\160column,",LineBreak,Code ("",[],[]) "(before\160the\160<nowiki>).",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "Then\160your\160block\160format\160will\160be",LineBreak,Code ("",[],[]) "\160\160\160\160maintained.",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "This\160is\160good\160for\160copying\160in\160code\160blocks:",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "def\160function():",LineBreak,Code ("",[],[]) "\160\160\160\160\"\"\"documentation\160string\"\"\"",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "\160\160\160\160if\160True:",LineBreak,Code ("",[],[]) "\160\160\160\160\160\160\160\160print\160True",LineBreak,Code ("",[],[]) "\160\160\160\160else:",LineBreak,Code ("",[],[]) "\160\160\160\160\160\160\160\160print\160False"]
170,Para [Code ("",[],[]) "Start\160with\160a\160space\160in\160the\160first\160column,",LineBreak,Code ("",[],[]) "(before\160the\160<nowiki>).",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "Then\160your\160block\160format\160will\160be",LineBreak,Code ("",[],[]) "\160\160\160\160maintained.",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "This\160is\160good\160for\160copying\160in\160code\160blocks:",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "def\160function():",LineBreak,Code ("",[],[]) "\160\160\160\160\"\"\"documentation\160string\"\"\"",LineBreak,Code ("",[],[]) "",LineBreak,Code ("",[],[]) "\160\160\160\160if\160True:",LineBreak,Code ("",[],[]) "\160\160\160\160\160\160\160\160print\160True",LineBreak,Code ("",[],[]) "\160\160\160\160else:",LineBreak,Code ("",[],[]) "\160\160\160\160\160\160\160\160print\160False"]
@@ -174,12 +174,12 @@ Pandoc (Meta {unMeta = fromList []})
174,Para [Str "Don't",Space,Str "need"]
174,Para [Str "Don't",Space,Str "need"]
175,Para [Code ("",[],[]) "a\160blank\160line"]
175,Para [Code ("",[],[]) "a\160blank\160line"]
176,Para [Str "around",Space,Str "a",Space,Str "preformatted",Space,Str "block."]
176,Para [Str "around",Space,Str "a",Space,Str "preformatted",Space,Str "block."]
177−,Header 2 ("",[],[]) [Str "templates"]
177+,Header 2 ("templates",[],[]) [Str "templates"]
178,RawBlock (Format "mediawiki") "{{Welcome}}"
178,RawBlock (Format "mediawiki") "{{Welcome}}"
179,RawBlock (Format "mediawiki") "{{Foo:Bar}}"
179,RawBlock (Format "mediawiki") "{{Foo:Bar}}"
180,RawBlock (Format "mediawiki") "{{Thankyou|all your effort|Me}}"
180,RawBlock (Format "mediawiki") "{{Thankyou|all your effort|Me}}"
181,Para [Str "Written",Space,RawInline (Format "mediawiki") "{{{date}}}",Space,Str "by",Space,RawInline (Format "mediawiki") "{{{name}}}",Str "."]
181,Para [Str "Written",Space,RawInline (Format "mediawiki") "{{{date}}}",Space,Str "by",Space,RawInline (Format "mediawiki") "{{{name}}}",Str "."]
182−,Header 2 ("",[],[]) [Str "tables"]
182+,Header 2 ("tables",[],[]) [Str "tables"]
183,Table [] [AlignDefault,AlignDefault] [0.0,0.0]
183,Table [] [AlignDefault,AlignDefault] [0.0,0.0]
184 [[]
184 [[]
185 ,[]]
185 ,[]]
@@ -245,6 +245,6 @@ Pandoc (Meta {unMeta = fromList []})
245 [[]]
245 [[]]
246 [[[Para [Str "Orange"]]]]
246 [[[Para [Str "Orange"]]]]
247,Para [Str "Paragraph",Space,Str "after",Space,Str "the",Space,Str "table."]
247,Para [Str "Paragraph",Space,Str "after",Space,Str "the",Space,Str "table."]
248−,Header 2 ("",[],[]) [Str "notes"]
248+,Header 2 ("notes",[],[]) [Str "notes"]
249,Para [Str "My",Space,Str "note!",Note [Plain [Str "This."]]]
249,Para [Str "My",Space,Str "note!",Note [Plain [Str "This."]]]
250,Para [Str "URL",Space,Str "note.",Note [Plain [Link [Str "http://docs.python.org/library/functions.html#range"] ("http://docs.python.org/library/functions.html#range","")]]]]
250,Para [Str "URL",Space,Str "note.",Note [Plain [Link [Str "http://docs.python.org/library/functions.html#range"] ("http://docs.python.org/library/functions.html#range","")]]]]