git.iko.soy/typeable/pandoc
on master help sign in
Added Vimwiki reader (#3705).

* New module Text.Pandoc.Readers.Vimwiki, exporting readVimwiki [API change]. * New input format `vimwiki`. * New data file, `data/vimwiki.css`, for displaying the HTML produced by this reader and pandoc's HTML writer in the style of vimwiki's own HTML export.

commit564c77964ddbbdc5541086726b9109091119e140 authorYuchen Pei <ycpei@users.noreply.github.com> dateMon 19 Jun 2017, 16:15 (9 years ago) parentb3041de
8 files changed+1467−2
MANUAL.txt+2−2 data/vimwiki.css+82 pandoc.cabal+2 src/Text/Pandoc/Readers.hs+3 src/Text/Pandoc/Readers/Vimwiki.hs+655 test/Tests/Old.hs+4 test/vimwiki-reader.native+305 test/vimwiki-reader.wiki+414
MANUAL.txt+2−2
@@ -16,8 +16,8 @@ another, and a command-line tool that uses this library. It can read
1616Markdown], [MultiMarkdown], and (subsets of) [Textile],
1717[reStructuredText], [HTML], [LaTeX], [MediaWiki markup], [TWiki markup],
1818[Haddock markup], [OPML], [Emacs Org mode], [DocBook], [Muse], [txt2tags],
19−[EPUB], [ODT] and [Word docx]; and it can write plain text, [Markdown],
20−[CommonMark], [PHP Markdown Extra], [GitHub-Flavored Markdown],
19+[EPUB], [ODT], [Vimwiki] and [Word docx]; and it can write plain text,
20+[Markdown], [CommonMark], [PHP Markdown Extra], [GitHub-Flavored Markdown],
2121[MultiMarkdown], [reStructuredText], [XHTML], [HTML5], [LaTeX]
2222\(including [`beamer`] slide shows\), [ConTeXt], [RTF], [OPML],
2323[DocBook], [OpenDocument], [ODT], [Word docx], [GNU Texinfo], [MediaWiki
data/vimwiki.cssnew file+82
@@ -0,0 +1,82 @@
1+pre{
2+ font-size: 1.5em
3+}
4+
5+img {vertical-align: middle}
6+
7+body {font-family: Tahoma, Geneva, sans-serif; margin: 1em 2em 1em 2em; font-size: 120%; line-height: 130%;}
8+h1, h2, h3, h4, h5, h6 {font-family: Trebuchet MS, Helvetica, sans-serif; font-weight: bold; line-height:100%; margin-top: 1.5em; margin-bottom: 0.5em;}
9+h1 {font-size: 2.6em; color: #000000;}
10+h2 {font-size: 2.2em; color: #404040;}
11+h3 {font-size: 1.8em; color: #707070;}
12+h4 {font-size: 1.4em; color: #909090;}
13+h5 {font-size: 1.3em; color: #989898;}
14+h6 {font-size: 1.2em; color: #9c9c9c;}
15+p, pre, blockquote, table, ul, ol, dl {margin-top: 1em; margin-bottom: 1em;}
16+ul ul, ul ol, ol ol, ol ul {margin-top: 0.5em; margin-bottom: 0.5em;}
17+li {margin: 0.3em auto;}
18+ul {margin-left: 2em; padding-left: 0.5em;}
19+dt {font-weight: bold;}
20+img {border: none;}
21+pre {border-left: 1px solid #ccc; margin-left: 2em; padding-left: 0.5em;}
22+blockquote {padding: 0.4em; background-color: #f6f5eb;}
23+th, td {border: 1px solid #ccc; padding: 0.3em;}
24+th {background-color: #f0f0f0;}
25+hr {border: none; border-top: 1px solid #ccc; width: 100%;}
26+del {text-decoration: line-through; color: #777777;}
27+.toc li {list-style-type: none;}
28+.todo {font-weight: bold; background-color: #f0ece8; color: #a03020;}
29+.justleft {text-align: left;}
30+.justright {text-align: right;}
31+.justcenter {text-align: center;}
32+.center {margin-left: auto; margin-right: auto;}
33+div.center > table {margin-left: auto; margin-right: auto;}
34+.tag {background-color: #eeeeee; font-family: monospace; padding: 2px;}
35+
36+/* classes for items of todo lists */
37+.done0 {
38+ /* list-style: none; */
39+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAA7SURBVCiR7dMxEgAgCANBI3yVRzF5KxNbW6wsuH7LQ2YKQK1mkswBVERYF5Os3UV3gwd/jF2SkXy66gAZkxS6BniubAAAAABJRU5ErkJggg==);
40+ background-repeat: no-repeat;
41+ background-position: 0 .2em;
42+ padding-left: 1.5em;
43+}
44+.done1 {
45+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABtSURBVCiR1ZO7DYAwDER9BDmTeZQMFXmUbGYpOjrEryA0wOvO8itOslFrJYAug5BMM4BeSkmjsrv3aVTa8p48Xw1JSkSsWVUFwD05IqS1tmYzk5zzae9jnVVVzGyXb8sALjse+euRkEzu/uirFomVIdDGOLjuAAAAAElFTkSuQmCC);
46+ background-repeat: no-repeat;
47+ background-position: 0 .15em;
48+ padding-left: 1.5em;
49+}
50+.done2 {
51+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAB1SURBVCiRzdO5DcAgDAVQGxjAYgTvxlDIu1FTIRYAp8qlFISkSH7l5kk+ZIwxKiI2mIyqWoeILYRgZ7GINDOLjnmF3VqklKCUMgTee2DmM661Qs55iI3Zm/1u5h9sm4ig9z4ERHTFzLyd4G4+nFlVrYg8+qoF/c0kdpeMsmcAAAAASUVORK5CYII=);
52+ background-repeat: no-repeat;
53+ background-position: 0 .15em;
54+ padding-left: 1.5em;
55+}
56+.done3 {
57+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABoSURBVCiR7dOxDcAgDATA/0DtUdiKoZC3YhLkHjkVKF3idJHiztKfvrHZWnOSE8Fx95RJzlprimJVnXktvXeY2S0SEZRSAAAbmxnGGKH2I5T+8VfxPhIReQSuuY3XyYWa3T2p6quvOgGrvSFGlewuUAAAAABJRU5ErkJggg==);
58+ background-repeat: no-repeat;
59+ background-position: 0 .15em;
60+ padding-left: 1.5em;
61+}
62+.done4 {
63+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAzgAAAM4BlP6ToAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIISURBVDiNnZQ9SFtRFMd/773kpTaGJoQk1im4VDpWQcTNODhkFBcVTCNCF0NWyeDiIIiCm82QoIMIUkHUxcFBg1SEQoZszSat6cdTn1qNue92CMbEr9Sey+XC/Z/zu+f8h6ukUil3sVg0+M+4cFxk42/jH2wAqqqKSCSiPQdwcHHAnDHH9s/tN1h8V28ETdP+eU8fT9Nt62ancYdIPvJNtsu87bmjrJlrTDVM4RROJs1JrHPrD4Bar7A6cpc54iKOaTdJXCUI2UMVrQZ0Js7YPN18ECKkYNQcJe/OE/4dZsw7VqNXQMvHy3QZXQypQ6ycrtwDjf8aJ+PNEDSCzLpn7+m2pD8ZKHlKarYhy6XjEoCYGcN95qansQeA3fNdki+SaJZGTMQIOoL3W/Z89rxv+tokubNajlvk/vm+LFpF2XnUKZHI0I+QrI7Dw0OZTqdzUkpsM7mZTyfy5OPGyw1tK7AFSvmB/Ks8w8YwbUYbe6/3QEKv0vugfxWPnMLJun+d/kI/WLdizpNjMbAIKrhMF4OuwadBALqqs+RfInwUvuNi+fBd+wjogfogAFVRmffO02q01mZZ0HHdgXIzdz0QQLPezIQygX6llxNKKgOFARYCC49CqhoHIUTlss/Vx2phlYwjw8j1CAlfAiwQiJpiy7o1VHnsG5FISkoJu7Q/2YmmaV+i0ei7v38L2CBguSi5AAAAAElFTkSuQmCC);
64+ background-repeat: no-repeat;
65+ background-position: 0 .15em;
66+ padding-left: 1.5em;
67+}
68+
69+*:not(pre) > code {
70+ font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
71+ -webkit-border-radius: 1px;
72+ -moz-border-radius: 1px;
73+ border-radius: 1px;
74+ -moz-background-clip: padding;
75+ -webkit-background-clip: padding-box;
76+ background-clip: padding-box;
77+ padding: 0px 3px;
78+ display: inline-block;
79+ color: #52595d;
80+ border: 1px solid #ccc;
81+ background-color: #f9f9f9;
82+}
pandoc.cabal+2
@@ -162,6 +162,7 @@ Extra-Source-Files:
162162 test/markdown-citations.txt
163163 test/textile-reader.textile
164164 test/mediawiki-reader.wiki
165+ test/vimwiki-reader.wiki
165166 test/rst-reader.rst
166167 test/s5-basic.html
167168 test/s5-fancy.html
@@ -368,6 +369,7 @@ Library
368369 Text.Pandoc.Readers.Markdown,
369370 Text.Pandoc.Readers.CommonMark,
370371 Text.Pandoc.Readers.MediaWiki,
372+ Text.Pandoc.Readers.Vimwiki,
371373 Text.Pandoc.Readers.RST,
372374 Text.Pandoc.Readers.Org,
373375 Text.Pandoc.Readers.DocBook,
src/Text/Pandoc/Readers.hs+3
@@ -46,6 +46,7 @@ module Text.Pandoc.Readers
4646 , readMarkdown
4747 , readCommonMark
4848 , readMediaWiki
49+ , readVimwiki
4950 , readRST
5051 , readOrg
5152 , readLaTeX
@@ -82,6 +83,7 @@ import Text.Pandoc.Readers.HTML
8283import Text.Pandoc.Readers.LaTeX
8384import Text.Pandoc.Readers.Markdown
8485import Text.Pandoc.Readers.MediaWiki
86+import Text.Pandoc.Readers.Vimwiki
8587import Text.Pandoc.Readers.Muse
8688import Text.Pandoc.Readers.Native
8789import Text.Pandoc.Readers.Odt
@@ -115,6 +117,7 @@ readers = [ ("native" , TextReader readNative)
115117 ,("commonmark" , TextReader readCommonMark)
116118 ,("rst" , TextReader readRST)
117119 ,("mediawiki" , TextReader readMediaWiki)
120+ ,("vimwiki" , TextReader readVimwiki)
118121 ,("docbook" , TextReader readDocBook)
119122 ,("opml" , TextReader readOPML)
120123 ,("org" , TextReader readOrg)
src/Text/Pandoc/Readers/Vimwiki.hsnew file+655
@@ -0,0 +1,655 @@
1+{-
2+ Copyright (C) 2017 Yuchen Pei <me@ypei.me>
3+
4+This program is free software; you can redistribute it and/or modify
5+it under the terms of the GNU General Public License as published by
6+the Free Software Foundation; either version 2 of the License, or
7+(at your option) any later version.
8+
9+This program is distributed in the hope that it will be useful,
10+but WITHOUT ANY WARRANTY; without even the implied warranty of
11+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+GNU General Public License for more details.
13+
14+You should have received a copy of the GNU General Public License
15+along with this program; if not, write to the Free Software
16+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17+-}
18+
19+{- |
20+ Module : Text.Pandoc.Readers.Vimwiki
21+ Copyright : Copyright (C) 2017 Yuchen Pei
22+ License : GNU GPL, version 2 or above
23+
24+ Maintainer : Yuchen Pei <me@ypei.me>
25+ Stability : alpha
26+ Portability : portable
27+
28+Conversion of vimwiki text to 'Pandoc' document.
29+-}
30+{--
31+ progress:
32+* block parsers:
33+ * [X] header
34+ * [X] hrule
35+ * [X] comment
36+ * [X] blockquote
37+ * [X] preformatted
38+ * [X] displaymath
39+ * [X] bulletlist / orderedlist
40+ * [X] orderedlist with 1., i., a) etc identification.
41+ * [X] todo lists -- not list builder with attributes? using span.
42+ * [X] table
43+ * [X] centered table -- using div
44+ * [O] colspan and rowspan -- pandoc limitation, see issue #1024
45+ * [X] paragraph
46+ * [X] definition list
47+* inline parsers:
48+ * [X] bareURL
49+ * [X] strong
50+ * [X] emph
51+ * [X] strikeout
52+ * [X] code
53+ * [X] link
54+ * [X] image
55+ * [X] inline math
56+ * [X] tag
57+ * [X] sub- and super-scripts
58+* misc:
59+ * [X] `TODO:` mark
60+ * [X] metadata placeholders: %title and %date
61+ * [O] control placeholders: %template and %nohtml -- %template added to
62+ meta, %nohtml ignored
63+--}
64+
65+module Text.Pandoc.Readers.Vimwiki ( readVimwiki
66+ ) where
67+import Control.Monad.Except (throwError)
68+import Control.Monad (guard)
69+import Data.Default
70+import Data.Maybe
71+import Data.Monoid ((<>))
72+import Data.List (isInfixOf, isPrefixOf)
73+import Data.Text (Text, unpack)
74+import Text.Pandoc.Builder (Blocks, Inlines, trimInlines, fromList, toList)
75+import qualified Text.Pandoc.Builder
76+ as B (headerWith, str, space, strong, emph, strikeout, code, link, image,
77+ spanWith, para, horizontalRule, blockQuote, bulletList, plain,
78+ orderedList, simpleTable, softbreak, codeBlockWith, imageWith, divWith,
79+ setMeta, definitionList, superscript, subscript)
80+import Text.Pandoc.Class (PandocMonad, report)
81+import Text.Pandoc.Definition (Pandoc(..), Inline(Space),
82+ Block(BulletList, OrderedList), Attr, nullMeta, Meta, ListNumberStyle(..),
83+ ListNumberDelim(..))
84+import Text.Pandoc.Logging (LogMessage(ParsingTrace))
85+import Text.Pandoc.Options (ReaderOptions)
86+import Text.Pandoc.Parsing (readWithM, ParserT, stateOptions, ParserState,
87+ stateMeta', blanklines, registerHeader, spaceChar, emailAddress, uri, F, runF,
88+ orderedListMarker, many1Till)
89+import Text.Pandoc.Shared (splitBy, stripFirstAndLast, stringify)
90+import Text.Parsec.Char (spaces, char, anyChar, newline, string, noneOf,
91+ alphaNum)
92+import Text.Parsec.Combinator (eof, choice, many1, manyTill, count, skipMany1,
93+ notFollowedBy, option)
94+import Text.Parsec.Prim (many, getPosition, try, updateState, getState)
95+import Text.Parsec.Char (oneOf, space)
96+import Text.Parsec.Combinator (lookAhead, between)
97+import Text.Parsec.Prim ((<|>))
98+
99+readVimwiki :: PandocMonad m => ReaderOptions -> Text -> m Pandoc
100+readVimwiki opts s = do
101+ res <- readWithM parseVimwiki def{ stateOptions = opts } (unpack s)
102+ case res of
103+ Left e -> throwError e
104+ Right result -> return result
105+
106+type VwParser = ParserT [Char] ParserState
107+
108+
109+-- constants
110+
111+specialChars :: [Char]
112+specialChars = "=*-#[]_~{}`$|:%^,"
113+
114+spaceChars :: [Char]
115+spaceChars = " \t\n"
116+
117+-- main parser
118+
119+parseVimwiki :: PandocMonad m => VwParser m Pandoc
120+parseVimwiki = do
121+ bs <- mconcat <$> many block
122+ spaces
123+ eof
124+ st <- getState
125+ let meta = runF (stateMeta' st) st
126+ return $ Pandoc meta (toList bs)
127+
128+-- block parser
129+
130+block :: PandocMonad m => VwParser m Blocks
131+block = do
132+ pos <- getPosition
133+ res <- choice [ mempty <$ blanklines
134+ , header
135+ , hrule
136+ , mempty <$ comment
137+ , mixedList
138+ , preformatted
139+ , displayMath
140+ , table
141+ , mempty <$ placeholder
142+ , blockQuote
143+ , definitionList
144+ , para
145+ ]
146+ report $ ParsingTrace (take 60 $ show $ toList res) pos
147+ return res
148+
149+blockML :: PandocMonad m => VwParser m Blocks
150+blockML = choice [preformatted, displayMath, table]
151+
152+header :: PandocMonad m => VwParser m Blocks
153+header = try $ do
154+ sp <- many spaceChar
155+ eqs <- many1 (char '=')
156+ spaceChar
157+ let lev = length eqs
158+ guard $ lev <= 6
159+ contents <- trimInlines . mconcat <$> manyTill inline (try $ spaceChar
160+ >> (string eqs) >> many spaceChar >> newline)
161+ attr <- registerHeader (makeId contents,
162+ (if sp == "" then [] else ["justcenter"]), []) contents
163+ return $ B.headerWith attr lev contents
164+
165+para :: PandocMonad m => VwParser m Blocks
166+para = try $ do
167+ contents <- trimInlines . mconcat <$> many1 inline
168+ if all (==Space) (toList contents)
169+ then return mempty
170+ else return $ B.para contents
171+
172+hrule :: PandocMonad m => VwParser m Blocks
173+hrule = try $ B.horizontalRule <$ (string "----" >> many (char '-') >> newline)
174+
175+comment :: PandocMonad m => VwParser m ()
176+comment = try $ do
177+ many spaceChar >> string "%%" >> many (noneOf "\n")
178+ return ()
179+
180+blockQuote :: PandocMonad m => VwParser m Blocks
181+blockQuote = try $ do
182+ string " "
183+ contents <- trimInlines . mconcat <$> many1 inlineBQ
184+ if all (==Space) (toList contents)
185+ then return mempty
186+ else return $ B.blockQuote $ B.plain contents
187+
188+definitionList :: PandocMonad m => VwParser m Blocks
189+definitionList = try $
190+ B.definitionList <$> (many1 (dlItemWithDT <|> dlItemWithoutDT))
191+
192+dlItemWithDT :: PandocMonad m => VwParser m (Inlines, [Blocks])
193+dlItemWithDT = do
194+ dt <- definitionTerm
195+ dds <- many definitionDef
196+ return $ (dt, dds)
197+
198+dlItemWithoutDT :: PandocMonad m => VwParser m (Inlines, [Blocks])
199+dlItemWithoutDT = do
200+ dds <- many1 definitionDef
201+ return $ (mempty, dds)
202+
203+definitionDef :: PandocMonad m => VwParser m Blocks
204+definitionDef = try $
205+ (notFollowedBy definitionTerm) >> many spaceChar
206+ >> (definitionDef1 <|> definitionDef2)
207+
208+definitionDef1 :: PandocMonad m => VwParser m Blocks
209+definitionDef1 = try $ mempty <$ defMarkerE
210+
211+definitionDef2 :: PandocMonad m => VwParser m Blocks
212+definitionDef2 = try $ B.plain <$>
213+ (defMarkerM >> (trimInlines . mconcat <$> many inline') <* newline)
214+
215+
216+definitionTerm :: PandocMonad m => VwParser m Inlines
217+definitionTerm = try $ do
218+ x <- definitionTerm1 <|> definitionTerm2
219+ guard $ (stringify x /= "")
220+ return x
221+
222+definitionTerm1 :: PandocMonad m => VwParser m Inlines
223+definitionTerm1 = try $
224+ trimInlines . mconcat <$> manyTill inline' (try $ defMarkerE)
225+
226+definitionTerm2 :: PandocMonad m => VwParser m Inlines
227+definitionTerm2 = try $ trimInlines . mconcat <$> manyTill inline'
228+ (try $ lookAhead $ (defMarkerM >> notFollowedBy hasDefMarkerM))
229+
230+defMarkerM :: PandocMonad m => VwParser m Char
231+defMarkerM = string "::" >> spaceChar
232+
233+defMarkerE :: PandocMonad m => VwParser m Char
234+defMarkerE = string "::" >> newline
235+
236+hasDefMarkerM :: PandocMonad m => VwParser m String
237+hasDefMarkerM = manyTill (noneOf "\n") (try defMarkerM)
238+
239+preformatted :: PandocMonad m => VwParser m Blocks
240+preformatted = try $ do
241+ many spaceChar >> string "{{{"
242+ attrText <- many (noneOf "\n")
243+ lookAhead newline
244+ contents <- manyTill anyChar (try (char '\n' >> many spaceChar >> string "}}}"
245+ >> many spaceChar >> newline))
246+ if (not $ contents == "") && (head contents == '\n')
247+ then return $ B.codeBlockWith (makeAttr attrText) (tail contents)
248+ else return $ B.codeBlockWith (makeAttr attrText) contents
249+
250+makeAttr :: String -> Attr
251+makeAttr s =
252+ let xs = splitBy (`elem` " \t") s in
253+ ("", [], catMaybes $ map nameValue xs)
254+
255+nameValue :: String -> Maybe (String, String)
256+nameValue s =
257+ let t = splitBy (== '=') s in
258+ if length t /= 2
259+ then Nothing
260+ else let (a, b) = (head t, last t) in
261+ if ((length b) < 2) || ((head b, last b) /= ('"', '"'))
262+ then Nothing
263+ else Just (a, stripFirstAndLast b)
264+
265+
266+displayMath :: PandocMonad m => VwParser m Blocks
267+displayMath = try $ do
268+ many spaceChar >> string "{{$"
269+ mathTag <- option "" mathTagParser
270+ contents <- manyTill anyChar (try (char '\n' >> many spaceChar >> string "}}$"
271+ >> many spaceChar >> newline))
272+ let contentsWithTags
273+ | mathTag == "" = "\\[" ++ contents ++ "\n\\]"
274+ | otherwise = "\\begin{" ++ mathTag ++ "}" ++ contents
275+ ++ "\n\\end{" ++ mathTag ++ "}"
276+ return $ B.plain $ B.str contentsWithTags
277+
278+mixedList :: PandocMonad m => VwParser m Blocks
279+mixedList = try $ do
280+ (bl, _) <- mixedList' (-1)
281+ return $ head bl
282+
283+mixedList' :: PandocMonad m => Int -> VwParser m ([Blocks], Int)
284+mixedList' prevInd = do
285+ (curInd, builder) <- option (-1, "na") (lookAhead listStart)
286+ if curInd < prevInd
287+ then return ([], curInd)
288+ else do
289+ listStart
290+ curLine <- listItemContent
291+ let listBuilder =
292+ if builder == "ul" then B.bulletList else B.orderedList
293+ (subList, lowInd) <- (mixedList' curInd)
294+ if lowInd >= curInd
295+ then do
296+ (sameIndList, endInd) <- (mixedList' lowInd)
297+ let curList = (combineList curLine subList) ++ sameIndList
298+ if curInd > prevInd
299+ then return ([listBuilder curList], endInd)
300+ else return (curList, endInd)
301+ else do
302+ let (curList, endInd) = ((combineList curLine subList),
303+ lowInd)
304+ if curInd > prevInd
305+ then return ([listBuilder curList], endInd)
306+ else return (curList, endInd)
307+
308+plainInlineML' :: PandocMonad m => Inlines -> VwParser m Blocks
309+plainInlineML' w = do
310+ xs <- many inlineML
311+ newline
312+ return $ B.plain $ trimInlines $ mconcat $ w:xs
313+
314+plainInlineML :: PandocMonad m => VwParser m Blocks
315+plainInlineML = (notFollowedBy listStart) >> spaceChar >> plainInlineML' mempty
316+
317+
318+listItemContent :: PandocMonad m => VwParser m Blocks
319+listItemContent = try $ do
320+ w <- option mempty listTodoMarker
321+ x <- plainInlineML' w
322+ y <- many blocksThenInline
323+ z <- many blockML
324+ return $ mconcat $ x:y ++ z
325+
326+blocksThenInline :: PandocMonad m => VwParser m Blocks
327+blocksThenInline = try $ do
328+ y <- many1 blockML
329+ x <- plainInlineML
330+ return $ mconcat $ y ++ [x]
331+
332+listTodoMarker :: PandocMonad m => VwParser m Inlines
333+listTodoMarker = try $ do
334+ x <- between (many spaceChar >> char '[') (char ']' >> spaceChar)
335+ (oneOf " .oOX")
336+ return $ makeListMarkerSpan x
337+
338+makeListMarkerSpan :: Char -> Inlines
339+makeListMarkerSpan x =
340+ let cl = case x of
341+ ' ' -> "done0"
342+ '.' -> "done1"
343+ 'o' -> "done2"
344+ 'O' -> "done3"
345+ 'X' -> "done4"
346+ _ -> ""
347+ in
348+ B.spanWith ("", [cl], []) mempty
349+
350+combineList :: Blocks -> [Blocks] -> [Blocks]
351+combineList x [y] = case toList y of
352+ [BulletList z] -> [fromList $ (toList x)
353+ ++ [BulletList z]]
354+ [OrderedList attr z] -> [fromList $ (toList x)
355+ ++ [OrderedList attr z]]
356+ _ -> x:[y]
357+combineList x xs = x:xs
358+
359+listStart :: PandocMonad m => VwParser m (Int, String)
360+listStart = try $ do
361+ s <- many spaceChar
362+ listType <- bulletListMarkers <|> orderedListMarkers
363+ spaceChar
364+ return (length s, listType)
365+
366+bulletListMarkers :: PandocMonad m => VwParser m String
367+bulletListMarkers = "ul" <$ (char '*' <|> char '-')
368+
369+orderedListMarkers :: PandocMonad m => VwParser m String
370+orderedListMarkers =
371+ ("ol" <$ (choice $ (orderedListMarker Decimal Period):(($OneParen)
372+ <$> orderedListMarker
373+ <$> [Decimal, LowerRoman, UpperRoman, LowerAlpha, UpperAlpha])))
374+ <|> ("ol" <$ char '#')
375+
376+--many need trimInlines
377+table :: PandocMonad m => VwParser m Blocks
378+table = try $ do
379+ indent <- lookAhead (many spaceChar)
380+ (th, trs) <- table1 <|> table2
381+ let tab = B.simpleTable th trs
382+ if indent == ""
383+ then return tab
384+ else return $ B.divWith ("", ["center"], []) tab
385+
386+-- table with header
387+table1 :: PandocMonad m => VwParser m ([Blocks], [[Blocks]])
388+table1 = try $ do
389+ th <- tableRow
390+ many1 tableHeaderSeparator
391+ trs <- many tableRow
392+ return (th, trs)
393+
394+-- headerless table
395+table2 :: PandocMonad m => VwParser m ([Blocks], [[Blocks]])
396+table2 = try $ do
397+ trs <- many1 tableRow
398+ return (take (length $ head trs) $ repeat mempty, trs)
399+
400+tableHeaderSeparator :: PandocMonad m => VwParser m ()
401+tableHeaderSeparator = try $ do
402+ many spaceChar >> char '|' >> many1 ((many1 $ char '-') >> char '|')
403+ >> many spaceChar >> newline
404+ return ()
405+
406+tableRow :: PandocMonad m => VwParser m [Blocks]
407+tableRow = try $ do
408+ many spaceChar >> char '|'
409+ s <- lookAhead $ manyTill anyChar (try (char '|' >> many spaceChar
410+ >> newline))
411+ guard $ not $ "||" `isInfixOf` ("|" ++ s ++ "|")
412+ tr <- many tableCell
413+ many spaceChar >> char '\n'
414+ return tr
415+
416+tableCell :: PandocMonad m => VwParser m Blocks
417+tableCell = try $
418+ B.plain <$> trimInlines . mconcat <$> (manyTill inline' (char '|'))
419+
420+placeholder :: PandocMonad m => VwParser m ()
421+placeholder = try $
422+ (choice (ph <$> ["title", "date"])) <|> noHtmlPh <|> templatePh
423+
424+ph :: PandocMonad m => String -> VwParser m ()
425+ph s = try $ do
426+ many spaceChar >> (string $ '%':s) >> spaceChar
427+ contents <- (trimInlines . mconcat <$> (manyTill inline (lookAhead newline)))
428+ --use lookAhead because of placeholder in the whitespace parser
429+ let meta' = return $ B.setMeta s contents nullMeta :: F Meta
430+ updateState $ \st -> st { stateMeta' = stateMeta' st <> meta' }
431+
432+noHtmlPh :: PandocMonad m => VwParser m ()
433+noHtmlPh = try $
434+ () <$ (many spaceChar >> string "%nohtml" >> many spaceChar
435+ >> (lookAhead newline))
436+
437+templatePh :: PandocMonad m => VwParser m ()
438+templatePh = try $
439+ () <$ (many spaceChar >> string "%template" >> (many $ noneOf "\n")
440+ >> (lookAhead newline))
441+
442+-- inline parser
443+
444+inline :: PandocMonad m => VwParser m Inlines
445+inline = choice $ (whitespace endlineP):inlineList
446+
447+inlineList :: PandocMonad m => [VwParser m Inlines]
448+inlineList = [ bareURL
449+ , todoMark
450+ , str
451+ , strong
452+ , emph
453+ , strikeout
454+ , code
455+ , link
456+ , image
457+ , inlineMath
458+ , tag
459+ , superscript
460+ , subscript
461+ , special
462+ ]
463+
464+-- inline parser without softbreaks or comment breaks
465+inline' :: PandocMonad m => VwParser m Inlines
466+inline' = choice $ whitespace':inlineList
467+
468+-- inline parser for blockquotes
469+inlineBQ :: PandocMonad m => VwParser m Inlines
470+inlineBQ = choice $ (whitespace endlineBQ):inlineList
471+
472+-- inline parser for mixedlists
473+inlineML :: PandocMonad m => VwParser m Inlines
474+inlineML = choice $ (whitespace endlineML):inlineList
475+
476+str :: PandocMonad m => VwParser m Inlines
477+str = B.str <$> (many1 $ noneOf $ spaceChars ++ specialChars)
478+
479+whitespace :: PandocMonad m => VwParser m () -> VwParser m Inlines
480+whitespace endline = B.space <$ (skipMany1 spaceChar <|>
481+ (try (newline >> (comment <|> placeholder))))
482+ <|> B.softbreak <$ endline
483+
484+whitespace' :: PandocMonad m => VwParser m Inlines
485+whitespace' = B.space <$ skipMany1 spaceChar
486+
487+special :: PandocMonad m => VwParser m Inlines
488+special = B.str <$> count 1 (oneOf specialChars)
489+
490+bareURL :: PandocMonad m => VwParser m Inlines
491+bareURL = try $ do
492+ (orig, src) <- uri <|> emailAddress
493+ return $ B.link src "" (B.str orig)
494+
495+strong :: PandocMonad m => VwParser m Inlines
496+strong = try $ do
497+ s <- lookAhead $ between (char '*') (char '*') (many1 $ noneOf "*")
498+ guard $ (not $ (head s) `elem` spaceChars)
499+ && (not $ (last s) `elem` spaceChars)
500+ char '*'
501+ contents <- mconcat <$> (manyTill inline' $ char '*'
502+ >> notFollowedBy alphaNum)
503+ return $ (B.spanWith ((makeId contents), [], []) mempty)
504+ <> (B.strong contents)
505+
506+makeId :: Inlines -> String
507+makeId i = concat (stringify <$> (toList i))
508+
509+emph :: PandocMonad m => VwParser m Inlines
510+emph = try $ do
511+ s <- lookAhead $ between (char '_') (char '_') (many1 $ noneOf "_")
512+ guard $ (not $ (head s) `elem` spaceChars)
513+ && (not $ (last s) `elem` spaceChars)
514+ char '_'
515+ contents <- mconcat <$> (manyTill inline' $ char '_'
516+ >> notFollowedBy alphaNum)
517+ return $ B.emph contents
518+
519+strikeout :: PandocMonad m => VwParser m Inlines
520+strikeout = try $ do
521+ string "~~"
522+ contents <- mconcat <$> (many1Till inline' $ string $ "~~")
523+ return $ B.strikeout contents
524+
525+code :: PandocMonad m => VwParser m Inlines
526+code = try $ do
527+ char '`'
528+ contents <- many1Till (noneOf "\n") (char '`')
529+ return $ B.code contents
530+
531+superscript :: PandocMonad m => VwParser m Inlines
532+superscript = try $
533+ B.superscript <$> mconcat <$> (char '^' >> many1Till inline' (char '^'))
534+
535+subscript :: PandocMonad m => VwParser m Inlines
536+subscript = try $
537+ B.subscript <$> mconcat <$> (string ",,"
538+ >> many1Till inline' (try $ string ",,"))
539+
540+link :: PandocMonad m => VwParser m Inlines
541+link = try $ do
542+ string "[["
543+ contents <- lookAhead $ manyTill anyChar (string "]]")
544+ case '|' `elem` contents of
545+ False -> do
546+ manyTill anyChar (string "]]")
547+-- not using try here because [[hell]o]] is not rendered as a link in vimwiki
548+ return $ B.link (procLink contents) "" (B.str contents)
549+ True -> do
550+ url <- manyTill anyChar $ char '|'
551+ lab <- mconcat <$> (manyTill inline $ string "]]")
552+ return $ B.link (procLink url) "" lab
553+
554+image :: PandocMonad m => VwParser m Inlines
555+image = try $ do
556+ string "{{"
557+ contentText <- lookAhead $ manyTill (noneOf "\n") (try $ string "}}")
558+ images $ length $ filter (== '|') contentText
559+
560+images :: PandocMonad m => Int -> VwParser m Inlines
561+images k
562+ | k == 0 = do
563+ imgurl <- manyTill anyChar (try $ string "}}")
564+ return $ B.image (procImgurl imgurl) "" (B.str "")
565+ | k == 1 = do
566+ imgurl <- manyTill anyChar (char '|')
567+ alt <- mconcat <$> (manyTill inline $ (try $ string "}}"))
568+ return $ B.image (procImgurl imgurl) "" alt
569+ | k == 2 = do
570+ imgurl <- manyTill anyChar (char '|')
571+ alt <- mconcat <$> (manyTill inline $ char '|')
572+ attrText <- manyTill anyChar (try $ string "}}")
573+ return $ B.imageWith (makeAttr attrText) (procImgurl imgurl) "" alt
574+ | otherwise = do
575+ imgurl <- manyTill anyChar (char '|')
576+ alt <- mconcat <$> (manyTill inline $ char '|')
577+ attrText <- manyTill anyChar (char '|')
578+ manyTill anyChar (try $ string "}}")
579+ return $ B.imageWith (makeAttr attrText) (procImgurl imgurl) "" alt
580+
581+procLink' :: String -> String
582+procLink' s
583+ | ((take 6 s) == "local:") = "file" ++ (drop 5 s)
584+ | ((take 6 s) == "diary:") = "diary/" ++ (drop 6 s) ++ ".html"
585+ | or ((`isPrefixOf` s) <$> [ "http:", "https:", "ftp:", "file:", "mailto:",
586+ "news:", "telnet:" ])
587+ = s
588+ | s == "" = ""
589+ | (last s) == '/' = s
590+ | otherwise = s ++ ".html"
591+
592+procLink :: String -> String
593+procLink s = procLink' x ++ y
594+ where (x, y) = break (=='#') s
595+
596+procImgurl :: String -> String
597+procImgurl s = if ((take 6 s) == "local:") then "file" ++ (drop 5 s) else s
598+
599+inlineMath :: PandocMonad m => VwParser m Inlines
600+inlineMath = try $ do
601+ char '$'
602+ contents <- many1Till (noneOf "\n") (char '$')
603+ return $ B.str $ "\\(" ++ contents ++ "\\)"
604+
605+tag :: PandocMonad m => VwParser m Inlines
606+tag = try $ do
607+ char ':'
608+ s <- manyTill (noneOf spaceChars) (try (char ':' >> (lookAhead space)))
609+ guard $ not $ "::" `isInfixOf` (":" ++ s ++ ":")
610+ let ss = splitBy (==':') s
611+ return $ mconcat $ (makeTagSpan' $ head ss):(makeTagSpan <$> (tail ss))
612+
613+todoMark :: PandocMonad m => VwParser m Inlines
614+todoMark = try $ do
615+ string "TODO:"
616+ return $ B.spanWith ("", ["todo"], []) (B.str "TODO:")
617+
618+-- helper functions and parsers
619+endlineP :: PandocMonad m => VwParser m ()
620+endlineP = () <$ try (newline <* nFBTTBSB <* notFollowedBy blockQuote)
621+
622+endlineBQ :: PandocMonad m => VwParser m ()
623+endlineBQ = () <$ try (newline <* nFBTTBSB <* string " ")
624+
625+endlineML :: PandocMonad m => VwParser m ()
626+endlineML = () <$ try (newline <* nFBTTBSB <* many1 spaceChar)
627+
628+--- nFBTTBSB is short for notFollowedByThingsThatBreakSoftBreaks
629+nFBTTBSB :: PandocMonad m => VwParser m ()
630+nFBTTBSB =
631+ notFollowedBy newline <*
632+ notFollowedBy hrule <*
633+ notFollowedBy tableRow <*
634+ notFollowedBy header <*
635+ notFollowedBy listStart <*
636+ notFollowedBy preformatted <*
637+ notFollowedBy displayMath <*
638+ notFollowedBy hasDefMarker
639+
640+hasDefMarker :: PandocMonad m => VwParser m ()
641+hasDefMarker = () <$ (manyTill (noneOf "\n") (string "::" >> oneOf spaceChars))
642+
643+makeTagSpan' :: String -> Inlines
644+makeTagSpan' s = B.spanWith ('-' : s, [], []) (B.str "") <>
645+ B.spanWith (s, ["tag"], []) (B.str s)
646+
647+makeTagSpan :: String -> Inlines
648+makeTagSpan s = (B.space) <> (makeTagSpan' s)
649+
650+mathTagParser :: PandocMonad m => VwParser m String
651+mathTagParser = do
652+ s <- try $ lookAhead (char '%' >> (manyTill (noneOf spaceChars)
653+ (try $ char '%' >> many (noneOf $ '%':spaceChars) >> space)))
654+ char '%' >> string s >> char '%'
655+ return s
test/Tests/Old.hs+4
@@ -99,6 +99,10 @@ tests = [ testGroup "markdown"
9999 , test "reader" ["-r", "mediawiki", "-w", "native", "-s"]
100100 "mediawiki-reader.wiki" "mediawiki-reader.native"
101101 ]
102+ , testGroup "vimwiki"
103+ [ test "reader" ["-r", "vimwiki", "-w", "native", "-s"]
104+ "vimwiki-reader.wiki" "vimwiki-reader.native"
105+ ]
102106 , testGroup "dokuwiki"
103107 [ testGroup "writer" $ writerTests "dokuwiki"
104108 , test "inline_formatting" ["-r", "native", "-w", "dokuwiki", "-s"]
test/vimwiki-reader.nativenew file+305
@@ -0,0 +1,305 @@
1+Pandoc (Meta {unMeta = fromList [("date",MetaInlines [Str "2017-05-01"]),("title",MetaInlines [Str "title"])]})
2+[Header 1 ("implemented",[],[]) [Emph [Span ("implemented",[],[]) [],Strong [Str "implemented"]]]
3+,Header 1 ("header",[],[]) [Str "header"]
4+,Header 2 ("header level two",[],[]) [Str "header",Space,Str "level",Space,Str "two"]
5+,Header 3 ("header level 3",[],[]) [Str "header",Space,Code ("",[],[]) "level",Space,Str "3"]
6+,Header 4 ("header level four",[],[]) [Str "header",Space,Strikeout [Str "level"],Space,Str "four"]
7+,Header 5 ("header level 5",[],[]) [Str "header",Space,Emph [Span ("level",[],[]) [],Strong [Str "level"],Space,Str "5"]]
8+,Header 6 ("header level 6",[],[]) [Str "header",Space,Str "level",Space,Str "6"]
9+,Para [Str "=======",Space,Str "not",Space,Str "a",Space,Str "header",Space,Str "========"]
10+,Para [Str "hi==",Space,Str "not",Space,Str "a",Space,Str "header",Space,Str "=="]
11+,Para [Str "===",Space,Str "not",Space,Str "a",Space,Str "header",Space,Str "=="]
12+,Para [Str "===",Space,Str "not",Space,Str "a",Space,Str "header",Space,Str "===-"]
13+,Para [Str "not",Space,Str "a",Space,Str "header:"]
14+,Para [Str "=n="]
15+,Para [Str "===",Space,Str "not",Space,Str "a",Space,Str "header",Space,Str "===="]
16+,Header 2 ("centred header",["justcenter"],[]) [Str "centred",Space,Str "header"]
17+,Header 2 ("header with some == in between",[],[]) [Str "header",Space,Str "with",Space,Str "some",Space,Code ("",[],[]) "==",Space,Str "in",Space,Str "between"]
18+,Header 2 ("header with some == in between",[],[]) [Str "header",Space,Str "with",Space,Str "some",Space,Str "==",Space,Str "in",Space,Str "between"]
19+,Header 2 ("header with some ==in between",[],[]) [Str "header",Space,Str "with",Space,Str "some",Space,Str "==in",Space,Str "between"]
20+,Header 2 ("emph strong and strikeout",[],[]) [Str "emph",Space,Str "strong",Space,Str "and",Space,Str "strikeout"]
21+,Para [Emph [Str "emph"],Space,Span ("strong",[],[]) [],Strong [Str "strong"]]
22+,Para [Span ("strong and emph",[],[]) [],Strong [Emph [Str "strong",Space,Str "and",Space,Str "emph"]]]
23+,Para [Emph [Span ("emph and strong",[],[]) [],Strong [Str "emph",Space,Str "and",Space,Str "strong"]]]
24+,Para [Span ("emph inside strong",[],[]) [],Strong [Emph [Str "emph",Space,Str "inside"],Space,Str "strong"]]
25+,Para [Span ("strong with emph",[],[]) [],Strong [Str "strong",Space,Str "with",Space,Emph [Str "emph"]]]
26+,Para [Emph [Span ("strong inside",[],[]) [],Strong [Str "strong",Space,Str "inside"],Space,Str "emph"]]
27+,Para [Emph [Strikeout [Str "strikeout"],Space,Str "inside",Space,Str "emph"]]
28+,Para [Strikeout [Str "This",Space,Str "is",Space,Emph [Str "struck",Space,Str "out"],Space,Str "with",Space,Str "emph"]]
29+,Para [Str "*not",SoftBreak,Str "strong*"]
30+,Para [Str "just",Space,Str "two",Space,Str "stars:",Space,Str "**"]
31+,Para [Str "just",Space,Str "two",Space,Str "underscores:",Space,Str "__"]
32+,Para [Str "just",Space,Str "four",Space,Str "~s:",Space,Str "~~~~"]
33+,Para [Str "_not",SoftBreak,Str "emph_"]
34+,Para [Str "~~not",SoftBreak,Str "strikeout~~"]
35+,Header 2 ("horizontal rule",[],[]) [Str "horizontal",Space,Str "rule"]
36+,Para [Str "top"]
37+,HorizontalRule
38+,Para [Str "middle"]
39+,HorizontalRule
40+,Para [Str "not",Space,Str "a",Space,Str "rule-----"]
41+,Para [Str "not",Space,Str "a",Space,Str "rule",Space,Str "(trailing",Space,Str "spaces):",SoftBreak,Str "-----"]
42+,Para [Str "not",Space,Str "a",Space,Str "rule",Space,Str "(leading",Space,Str "spaces):",SoftBreak,Str "----"]
43+,Header 2 ("comments",[],[]) [Str "comments"]
44+,Para [Str "this",SoftBreak,Str "is",Space,Str "%%",Space,Str "not",Space,Str "secret"]
45+,Header 2 ("inline code",[],[]) [Str "inline",Space,Str "code"]
46+,Para [Str "Here",Space,Str "is",Space,Str "some",Space,Code ("",[],[]) "inline code",Str "."]
47+,Para [Str "Just",Space,Str "two",Space,Str "backticks:",Space,Str "``"]
48+,Header 2 ("preformatted text",[],[]) [Str "preformatted",Space,Str "text"]
49+,CodeBlock ("",[],[]) " Tyger! Tyger! burning bright\n In the forests of the night,\n What immortal hand or eye\n Could frame thy fearful symmetry?\n In what distant deeps or skies\n Burnt the fire of thine eyes?\n On what wings dare he aspire?\n What the hand dare sieze the fire?"
50+,Header 3 ("preformatted text with attributes",[],[]) [Str "preformatted",Space,Str "text",Space,Str "with",Space,Str "attributes"]
51+,CodeBlock ("",[],[("class","python"),("style","color:blue")]) " for i in range(1, 5):\n print(i)"
52+,Header 2 ("block quotes",[],[]) [Str "block",Space,Str "quotes"]
53+,BlockQuote
54+ [Plain [Str "(indentation",Space,Str "4",Space,Str "spaces)",Space,Str "This",Space,Str "would",Space,Str "be",Space,Str "a",Space,Str "blockquote",Space,Str "in",Space,Str "Vimwiki.",Space,Str "It",Space,Str "is",Space,Str "not",Space,Span ("highlighted",[],[]) [],Strong [Str "highlighted"],Space,Str "in",Space,Str "Vim",Space,Str "but",SoftBreak,Str "(indentation",Space,Str "1",Space,Str "space",Space,Str "followed",Space,Str "by",Space,Str "1",Space,Str "tab",Space,Str "of",Space,Str "width",Space,Str "4)",Space,Str "could",Space,Str "be",Space,Str "styled",Space,Str "by",Space,Str "CSS",Space,Str "in",Space,Str "HTML.",Space,Str "Blockquotes",Space,Str "are",Space,Str "usually",Space,Str "used",Space,Str "to",Space,Str "quote",Space,Str "a",SoftBreak,Str "(indentation",Space,Str "1",Space,Str "tab",Space,Str "of",Space,Str "width",Space,Str "4)",Space,Str "long",Space,Str "piece",Space,Str "of",Space,Str "text",Space,Str "from",Space,Str "another",Space,Str "source.",Space,Strikeout [Str "blah",Space,Str "blah"],Space,Span ("-blockquote",[],[]) [Str ""],Span ("blockquote",["tag"],[]) [Str "blockquote"]]]
55+,Header 2 ("external links",[],[]) [Str "external",Space,Str "links"]
56+,Para [Link ("",[],[]) [Emph [Str "Google"],Space,Str "search",Space,Str "engine"] ("http://google.com","")]
57+,Para [Link ("",[],[]) [Str "http://pandoc.org"] ("http://pandoc.org","")]
58+,Para [Link ("",[],[]) [Str "ftp://vim.org"] ("ftp://vim.org","")]
59+,Para [Link ("",[],[]) [Str "http://google.com"] ("http://google.com","")]
60+,Para [Link ("",[],[]) [Str "email",Space,Str "me"] ("mailto:info@example.org","")]
61+,Para [Link ("",[],[]) [Str "mailto:hello@bye.com"] ("mailto:hello@bye.com","")]
62+,Header 2 ("internal links",[],[]) [Str "internal",Space,Str "links"]
63+,Para [Link ("",[],[]) [Str "This is a link"] ("This is a link.html","")]
64+,Para [Link ("",[],[]) [Str "Description",Space,Str "of",Space,Str "the",Space,Str "link"] ("This is a link source.html","")]
65+,Para [Link ("",[],[]) [Str "projects/Important Project 1"] ("projects/Important Project 1.html",""),SoftBreak,Link ("",[],[]) [Str "../index"] ("../index.html",""),SoftBreak,Link ("",[],[]) [Str "Other",Space,Str "files"] ("a subdirectory/","")]
66+,Para [Link ("",[],[]) [Str "try",Space,Str "me",Space,Str "to",Space,Str "test",Space,Str "tag",Space,Str "anchors"] ("#tag-one","")]
67+,Para [Link ("",[],[]) [Str "try",Space,Str "me",Space,Str "to",Space,Str "test",Space,Str "header",Space,Str "anchors"] ("#block quotes","")]
68+,Para [Link ("",[],[]) [Str "try",Space,Str "me",Space,Str "to",Space,Str "test",Space,Str "strong",Space,Str "anchors"] ("#strong","")]
69+,Para [Link ("",[],[]) [Str "Tasks",Space,Str "for",Space,Str "tomorrow"] ("Todo List.html#Tomorrow","")]
70+,Para [Link ("",[],[]) [Str "diary:2017-05-01"] ("diary/2017-05-01.html","")]
71+,Para [Link ("",[],[]) [Str "Important",Space,Str "Data"] ("file:../assets/data.csv","")]
72+,Header 3 ("links with thumbnails",[],[]) [Str "links",Space,Str "with",Space,Str "thumbnails"]
73+,Para [Link ("",[],[]) [Image ("",[],[]) [Str ""] ("./movie.jpg","")] ("http://www.google.com","")]
74+,Header 2 ("images",[],[]) [Str "images"]
75+,Para [Image ("",[],[]) [Str ""] ("file:./lalune.jpg","")]
76+,Para [Image ("",[],[]) [Str "Vimwiki"] ("http://vimwiki.googlecode.com/hg/images/vimwiki_logo.png",""),SoftBreak,Image ("",[],[]) [Str ""] ("file:./movie.jpg","")]
77+,Header 3 ("image with attributes",[],[]) [Str "image",Space,Str "with",Space,Str "attributes"]
78+,Para [Image ("",[],[("style","width:150px;height:120px;")]) [Emph [Str "cool",Space,Str "stuff"]] ("lalune.jpg","")]
79+,Para [Image ("",[],[("style","font-color:red")]) [Span ("Non-existing",[],[]) [],Strong [Str "Non-existing"],Space,Str "image"] ("nonexist.jpg","")]
80+,Para [Image ("",[],[("style","width:150px;height:120px;")]) [Emph [Str "cool",Space,Str "stuff"]] ("lalune.jpg","")]
81+,Header 2 ("lists",[],[]) [Str "lists"]
82+,OrderedList (1,DefaultStyle,DefaultDelim)
83+ [[Plain [Str "ordered",Space,Str "list",Space,Str "item",Space,Str "1,",Space,Str "and",Space,Str "here",Space,Str "is",Space,Str "some",Space,Str "math",Space,Str "belonging",Space,Str "to",Space,Str "list",Space,Str "item",Space,Str "1"]
84+ ,Plain [Str "\\[\n a^2 + b^2 = c^2\n\\]"]
85+ ,Plain [Str "and",Space,Str "some",Space,Str "preformatted",Space,Str "and",Space,Str "tables",Space,Str "belonging",Space,Str "to",Space,Str "item",Space,Str "1",Space,Str "as",Space,Str "well"]
86+ ,CodeBlock ("",[],[]) "I'm part of item 1."
87+ ,Table [] [AlignDefault,AlignDefault] [0.0,0.0]
88+ [[]
89+ ,[]]
90+ [[[Plain [Str "this",Space,Str "table"]]
91+ ,[Plain [Str "is"]]]
92+ ,[[Plain [Str "also",Space,Str "a",Space,Str "part"]]
93+ ,[Plain [Str "of",Space,Str "item",Space,Str "1"]]]]
94+ ,Plain [Str "and",Space,Str "some",Space,Str "more",Space,Str "text",Space,Str "belonging",Space,Str "to",Space,Str "item",Space,Str "1."]]
95+ ,[Plain [Str "ordered",Space,Str "list",Space,Str "item",Space,Str "2"]]]
96+,BulletList
97+ [[Plain [Str "Bulleted",Space,Str "list",Space,Str "item",Space,Str "1"]]
98+ ,[Plain [Str "Bulleted",Space,Str "list",Space,Str "item",Space,Str "2"]]]
99+,OrderedList (1,DefaultStyle,DefaultDelim)
100+ [[Plain [Str "Bulleted",Space,Str "list",Space,Str "item",Space,Str "1"]]
101+ ,[Plain [Str "the",Space,Str "#",Space,Str "become",Space,Str "numbers",Space,Str "when",Space,Str "converted",Space,Str "to",Space,Str "HTML"]]]
102+,BulletList
103+ [[Plain [Str "Bulleted",Space,Str "list",Space,Str "item",Space,Str "1"]]
104+ ,[Plain [Str "Bulleted",Space,Str "list",Space,Str "item",Space,Str "2"]]]
105+,BulletList
106+ [[Plain [Str "Item",Space,Str "1"]]
107+ ,[Plain [Str "Item",Space,Str "2"]
108+ ,OrderedList (1,DefaultStyle,DefaultDelim)
109+ [[Plain [Str "Sub",Space,Str "item",Space,Str "1",Space,Str "(indentation",Space,Str "4",Space,Str "spaces)",SoftBreak,Str "Sub",Space,Str "item",Space,Str "1",Space,Str "continued",Space,Str "line.",SoftBreak,Str "Sub",Space,Str "item",Space,Str "1",Space,Str "next",Space,Str "continued",Space,Str "line."]]
110+ ,[Plain [Str "Sub",Space,Str "item",Space,Str "2,",Space,Str "as",Space,Str "an",Space,Str "ordered",Space,Str "list",Space,Str "item",Space,Str "even",Space,Str "though",Space,Str "the",Space,Str "identifier",Space,Str "is",Space,Code ("",[],[]) "*",Space,Str "(indentation",Space,Str "2",Space,Str "spaces",Space,Str "followed",Space,Str "by",Space,Str "one",Space,Str "tab",Space,Str "of",Space,Str "width",Space,Str "4)"]]
111+ ,[Plain [Str "etc.",SoftBreak,Str "Continuation",Space,Str "of",Space,Str "Item",Space,Str "2",SoftBreak,Str "Next",Space,Str "continuation",Space,Str "of",Space,Str "Item",Space,Str "2"]]]]]
112+,Para [Str "But",Space,Str "this",Space,Str "is",Space,Str "a",Space,Str "new",Space,Str "paragraph."]
113+,OrderedList (1,DefaultStyle,DefaultDelim)
114+ [[Plain [Str "1"]
115+ ,BulletList
116+ [[Plain [Code ("",[],[]) "1.1"]]]]
117+ ,[Plain [Str "2"]
118+ ,BulletList
119+ [[Plain [Str "2.1"]]]]]
120+,BulletList
121+ [[Plain [Str "3"]]]
122+,Header 3 ("ordered lists with non-# identifiers",[],[]) [Str "ordered",Space,Str "lists",Space,Str "with",Space,Str "non-#",Space,Str "identifiers"]
123+,OrderedList (1,DefaultStyle,DefaultDelim)
124+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "1"]]
125+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "2"]]
126+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "3"]]]
127+,OrderedList (1,DefaultStyle,DefaultDelim)
128+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "1"]]
129+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "2"]]
130+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "3"]]]
131+,OrderedList (1,DefaultStyle,DefaultDelim)
132+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "1"]]
133+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "2"]]
134+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "3"]]]
135+,OrderedList (1,DefaultStyle,DefaultDelim)
136+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "1"]]
137+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "2"]]
138+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "3"]]]
139+,OrderedList (1,DefaultStyle,DefaultDelim)
140+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "1"]]
141+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "2"]]
142+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "3"]]]
143+,OrderedList (1,DefaultStyle,DefaultDelim)
144+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "1"]]
145+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "2"]]
146+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "3"]]]
147+,OrderedList (1,DefaultStyle,DefaultDelim)
148+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "1"]]
149+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "2"]]
150+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "item",Space,Str "3"]]]
151+,BulletList
152+ [[Plain [Str "Bulleted",Space,Str "list",Space,Str "item",Space,Str "1"]]
153+ ,[Plain [Str "Bulleted",Space,Str "list",Space,Str "item",Space,Str "2"]
154+ ,OrderedList (1,DefaultStyle,DefaultDelim)
155+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "sub",Space,Str "item",Space,Str "1"]]
156+ ,[Plain [Str "more",Space,Str "..."]
157+ ,BulletList
158+ [[Plain [Str "and",Space,Str "more",Space,Str "..."]]
159+ ,[Plain [Str "..."]]]]
160+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "sub",Space,Str "item",Space,Str "3"]
161+ ,OrderedList (1,DefaultStyle,DefaultDelim)
162+ [[Plain [Str "Numbered",Space,Str "list",Space,Str "sub",Space,Str "sub",Space,Str "item",Space,Str "1"]]
163+ ,[Plain [Str "Numbered",Space,Str "list",Space,Str "sub",Space,Str "sub",Space,Str "item",Space,Str "2"]]]]
164+ ,[Plain [Str "etc."]]]]
165+ ,[Plain [Str "Bulleted",Space,Str "list",Space,Str "item",Space,Str "3"]]]
166+,Header 2 ("todo lists",[],[]) [Str "todo",Space,Str "lists"]
167+,BulletList
168+ [[Plain [Span ("",["done0"],[]) [],Str "task",Space,Str "1"]
169+ ,OrderedList (1,DefaultStyle,DefaultDelim)
170+ [[Plain [Span ("",["done1"],[]) [],Str "5"]]]]
171+ ,[Plain [Span ("",["done2"],[]) [],Str "3"]]
172+ ,[Plain [Str "[]",Space,Str "not",Space,Str "a",Space,Str "todo",Space,Str "item"]]
173+ ,[Plain [Str "[",Space,Str "]not",Space,Str "a",Space,Str "todo",Space,Str "item"]]
174+ ,[Plain [Str "[r]",Space,Str "not",Space,Str "a",Space,Str "todo",Space,Str "item"]]
175+ ,[Plain [Str "[",Space,Str "]",Space,Str "not",Space,Str "a",Space,Str "todo",Space,Str "item"]]
176+ ,[Plain [Span ("",["done2"],[]) [],Str "a",Space,Str "tab",Space,Str "in",Space,Str "the",Space,Str "todo",Space,Str "list",Space,Str "marker",Space,Code ("",[],[]) "[ ]"]
177+ ,OrderedList (1,DefaultStyle,DefaultDelim)
178+ [[Plain [Span ("",["done3"],[]) [],Str "4",SoftBreak,Str "5"]]
179+ ,[Plain [Span ("",["done4"],[]) []]
180+ ,Table [] [AlignDefault,AlignDefault] [0.0,0.0]
181+ [[]
182+ ,[]]
183+ [[[Plain [Str "a"]]
184+ ,[Plain [Str "b"]]]]]]]
185+ ,[Plain [Span ("",["done4"],[]) [],Str "task",Space,Str "2"]]]
186+,Header 2 ("math",[],[]) [Str "math"]
187+,Para [Str "\\( \\sum_i a_i^2 = 1 \\)"]
188+,Plain [Str "\\[\n\\sum_i a_i^2\n=\n1\n\\]"]
189+,Plain [Str "\\begin{align}\n\\sum_i a_i^2 &= 1 + 1 \\\\\n&= 2.\n\\end{align}"]
190+,Para [Str "Just",Space,Str "two",Space,Str "dollar",Space,Str "signs:",Space,Str "$$"]
191+,Para [Str "[not",Space,Str "math]",Space,Str "You",Space,Str "have",Space,Str "$1",SoftBreak,Str "and",Space,Str "I",Space,Str "have",Space,Str "$1."]
192+,Header 2 ("tags",[],[]) [Str "tags"]
193+,Para [Span ("-tag-one",[],[]) [Str ""],Span ("tag-one",["tag"],[]) [Str "tag-one"],Space,Span ("-tag-two",[],[]) [Str ""],Span ("tag-two",["tag"],[]) [Str "tag-two"]]
194+,Header 2 ("tables",[],[]) [Str "tables"]
195+,Table [] [AlignDefault,AlignDefault,AlignDefault] [0.0,0.0,0.0]
196+ [[Plain [Str "Year"]]
197+ ,[Plain [Str "Temperature",Space,Str "(low)"]]
198+ ,[Plain [Str "Temperature",Space,Str "(high)"]]]
199+ [[[Plain [Str "1900"]]
200+ ,[Plain [Str "-10"]]
201+ ,[Plain [Str "25"]]]
202+ ,[[Plain [Str "1910"]]
203+ ,[Plain [Str "-15"]]
204+ ,[Plain [Str "30"]]]
205+ ,[[Plain [Str "1920"]]
206+ ,[Plain [Str "-10"]]
207+ ,[Plain [Str "32"]]]
208+ ,[[Plain [Str "1930"]]
209+ ,[Plain [Emph [Str "N/A"]]]
210+ ,[Plain [Emph [Str "N/A"]]]]
211+ ,[[Plain [Str "1940"]]
212+ ,[Plain [Str "-2"]]
213+ ,[Plain [Str "40"]]]]
214+,Header 3 ("centered headerless tables",[],[]) [Str "centered",Space,Str "headerless",Space,Str "tables"]
215+,Div ("",["center"],[])
216+ [Table [] [AlignDefault,AlignDefault] [0.0,0.0]
217+ [[]
218+ ,[]]
219+ [[[Plain [Str "a"]]
220+ ,[Plain [Str "b"]]]
221+ ,[[Plain [Str "c"]]
222+ ,[Plain [Str "d"]]]]]
223+,Header 2 ("paragraphs",[],[]) [Str "paragraphs"]
224+,Para [Str "This",Space,Str "is",Space,Str "first",Space,Str "paragraph",SoftBreak,Str "with",Space,Str "two",Space,Str "lines."]
225+,Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "second",Space,Str "paragraph",Space,Str "with",SoftBreak,Str "two",Space,Str "lines",Space,Str "after",Space,Str "many",Space,Str "blank",Space,Str "lines."]
226+,Header 2 ("definition list",[],[]) [Str "definition",Space,Str "list"]
227+,DefinitionList
228+ [([Str "Term",Space,Str "1"],
229+ [[Plain [Str "Definition",Space,Str "1"]]])
230+ ,([Str "Term",Space,Str "2"],
231+ [[Plain [Str "Definition",Space,Str "2"]]
232+ ,[Plain [Str "Definition",Space,Str "3"]]])
233+ ,([Str "Term",Space,Str "::",Space,Span ("separated",[],[]) [],Strong [Str "separated"],Space,Str "by",Space,Str "::",Space,Emph [Str "double",Space,Str "colons"]],
234+ [[Plain [Str "Def1"]]
235+ ,[Plain [Str "Def2"]]])
236+ ,([Str "Term",Space,Str "with",Space,Str "lots",Space,Str "of",Space,Str "trailing",Space,Str "colons:::::::"],
237+ [[Plain [Str "Definition"]]])
238+ ,([Str "::",Space,Str "This",Space,Str "is",Space,Str "::",Space,Str "A",Space,Str "term",Space,Str "(rather",Space,Str "than",Space,Str "a",Space,Str "definition)"],
239+ [[Plain [Str "and",Space,Str "this",Space,Str "is",Space,Str "a",Space,Str "definition"]]])
240+ ,([Str "Term",Space,Str "Without",Space,Str "definitions"],
241+ [[]])
242+ ,([Str "Part",Space,Str "::",Space,Str "of",Space,Str "::",Space,Str "dt"],
243+ [[Plain [Str "part",Space,Str "of",Space,Str "::dd"]]])]
244+,DefinitionList
245+ [([],
246+ [[Plain [Str "Definition",Space,Str "1",Space,Str "without",Space,Str "a",Space,Str "term"]]
247+ ,[Plain [Str "Definition",Space,Str "2",Space,Str "without",Space,Str "a",Space,Str "term"]]])]
248+,DefinitionList
249+ [([Str "T1"],
250+ [[Plain [Str "D1"]]])]
251+,Para [Str "new",Space,Str "paragraph"]
252+,DefinitionList
253+ [([Str "T1"],
254+ [[Plain [Str "D1"]]])]
255+,Para [Str "Not::Definition"]
256+,Para [Str "Not",Space,Str "::Definition"]
257+,Para [Str "::Not",Space,Str "definition"]
258+,BlockQuote
259+ [Plain [Str "::",Space,Str "blockquote"]]
260+,BlockQuote
261+ [Plain [Str "block",Space,Str "::",Space,Str "quote"]]
262+,Header 2 ("metadata placeholders",[],[]) [Str "metadata",Space,Str "placeholders"]
263+,Para [Str "%this",Space,Str "is",Space,Str "not",Space,Str "a",Space,Str "placeholder"]
264+,Para [Str "placeholders",SoftBreak,Str "serves",Space,Str "as",Space,Str "space",Space,Str "/",Space,Str "softbreak",Space,Str "in",Space,Str "paragraphs"]
265+,Header 2 ("sup, sub",[],[]) [Str "sup,",Space,Str "sub"]
266+,Para [Str "super",Superscript [Str "script"]]
267+,Para [Str "sub",Subscript [Str "script"]]
268+,Header 2 ("the todo mark",[],[]) [Str "the",Space,Str "todo",Space,Str "mark"]
269+,Para [Span ("",["todo"],[]) [Str "TODO:"]]
270+,Header 1 ("not implemented yet",[],[]) [Emph [Span ("not implemented yet",[],[]) [],Strong [Str "not",Space,Str "implemented",Space,Str "yet"]]]
271+,Header 2 ("tables with spans",[],[]) [Str "tables",Space,Str "with",Space,Str "spans"]
272+,Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.0,0.0,0.0,0.0]
273+ [[]
274+ ,[]
275+ ,[]
276+ ,[]]
277+ [[[Plain [Str "a"]]
278+ ,[Plain [Str "b"]]
279+ ,[Plain [Str "c"]]
280+ ,[Plain [Str "d"]]]
281+ ,[[Plain [Str "\\/"]]
282+ ,[Plain [Str "e"]]
283+ ,[Plain [Str ">"]]
284+ ,[Plain [Str "f"]]]
285+ ,[[Plain [Str "\\/"]]
286+ ,[Plain [Str "\\/"]]
287+ ,[Plain [Str ">"]]
288+ ,[Plain [Str "g"]]]
289+ ,[[Plain [Str "h"]]
290+ ,[Plain [Str ">"]]
291+ ,[Plain [Str ">"]]
292+ ,[Plain [Str ">"]]]]
293+,Header 2 ("tables with multiple lines of headers",[],[]) [Str "tables",Space,Str "with",Space,Str "multiple",Space,Str "lines",Space,Str "of",Space,Str "headers"]
294+,Table [] [AlignDefault,AlignDefault] [0.0,0.0]
295+ [[]
296+ ,[]]
297+ [[[Plain [Str "a"]]
298+ ,[Plain [Str "b"]]]
299+ ,[[Plain [Str "c"]]
300+ ,[Plain [Str "d"]]]
301+ ,[[Plain [Str "---"]]
302+ ,[Plain [Str "---"]]]]
303+,Header 2 ("some other placeholders",[],[]) [Str "some",Space,Str "other",Space,Str "placeholders"]
304+,Para [Code ("",[],[]) "template",Space,Str "placeholder",Space,Str "is",Space,Str "ignored."]
305+,Para [Code ("",[],[]) "nohtml",Space,Str "placeholder",Space,Str "is",Space,Str "ignored."]]
test/vimwiki-reader.wikinew file+414
@@ -0,0 +1,414 @@
1+= _*implemented*_ =
2+= header =
3+
4+== header level two ==
5+
6+=== header `level` 3 ===
7+
8+==== header ~~level~~ four ====
9+
10+===== header _*level* 5_ =====
11+
12+====== header level 6 ======
13+
14+======= not a header ========
15+
16+hi== not a header ==
17+
18+=== not a header ==
19+
20+=== not a header ===-
21+
22+not a header:
23+
24+=n=
25+
26+=== not a header ====
27+
28+ == centred header ==
29+
30+== header with some `==` in between ==
31+== header with some == in between ==
32+== header with some ==in between ==
33+
34+== emph strong and strikeout ==
35+
36+_emph_ *strong*
37+
38+*_strong and emph_*
39+
40+_*emph and strong*_
41+
42+*_emph inside_ strong*
43+
44+*strong with _emph_*
45+
46+_*strong inside* emph_
47+
48+_~~strikeout~~ inside emph_
49+
50+~~This is _struck out_ with emph~~
51+
52+*not
53+strong*
54+
55+just two stars: **
56+
57+just two underscores: __
58+
59+just four ~s: ~~~~
60+
61+_not
62+%%comment
63+emph_
64+
65+~~not
66+ %%comment
67+ %%comment
68+strikeout~~
69+
70+== horizontal rule ==
71+
72+top
73+----
74+middle
75+
76+-------
77+
78+not a rule-----
79+
80+not a rule (trailing spaces):
81+-----
82+
83+not a rule (leading spaces):
84+ ----
85+
86+== comments ==
87+
88+%% you can't see me.
89+
90+this
91+%% secret
92+is %% not secret
93+
94+== inline code ==
95+
96+Here is some `inline code`.
97+
98+Just two backticks: ``
99+
100+== preformatted text ==
101+
102+{{{
103+ Tyger! Tyger! burning bright
104+ In the forests of the night,
105+ What immortal hand or eye
106+ Could frame thy fearful symmetry?
107+ In what distant deeps or skies
108+ Burnt the fire of thine eyes?
109+ On what wings dare he aspire?
110+ What the hand dare sieze the fire?
111+}}}
112+
113+=== preformatted text with attributes ===
114+
115+ {{{class="python" style="color:blue"
116+ for i in range(1, 5):
117+ print(i)
118+ }}}
119+
120+== block quotes ==
121+
122+ (indentation 4 spaces) This would be a blockquote in Vimwiki. It is not *highlighted* in Vim but
123+ (indentation 1 space followed by 1 tab of width 4) could be styled by CSS in HTML. Blockquotes are usually used to quote a
124+ (indentation 1 tab of width 4) long piece of text from another source. ~~blah blah~~ :blockquote:
125+
126+== external links ==
127+
128+[[http://google.com|_Google_ search engine]]
129+
130+http://pandoc.org
131+
132+ftp://vim.org
133+
134+[[http://google.com]]
135+
136+[[mailto:info@example.org|email me]]
137+
138+mailto:hello@bye.com
139+
140+== internal links ==
141+
142+[[This is a link]]
143+
144+[[This is a link source|Description of the link]]
145+
146+[[projects/Important Project 1]]
147+
148+[[../index]]
149+
150+[[a subdirectory/|Other files]]
151+
152+[[#tag-one|try me to test tag anchors]]
153+
154+[[#block quotes|try me to test header anchors]]
155+
156+[[#strong|try me to test strong anchors]]
157+
158+[[Todo List#Tomorrow|Tasks for tomorrow]]
159+
160+[[diary:2017-05-01]]
161+
162+[[file:../assets/data.csv|Important Data]]
163+
164+=== links with thumbnails ===
165+[[http://www.google.com|{{./movie.jpg}}]]
166+
167+== images ==
168+
169+{{file:./lalune.jpg}}
170+
171+{{http://vimwiki.googlecode.com/hg/images/vimwiki_logo.png|Vimwiki}}
172+
173+{{local:./movie.jpg}}
174+
175+
176+=== image with attributes ===
177+{{lalune.jpg|_cool stuff_|style="width:150px;height:120px;"}}
178+
179+{{nonexist.jpg|*Non-existing* image|class="center flow blabla" style="font-color:red"}}
180+
181+{{lalune.jpg|_cool stuff_|style="width:150px;height:120px;"|anything in this segment is ignored}}
182+
183+
184+== lists ==
185+
186+
187+# ordered list item 1, and here is some math belonging to list item 1
188+ {{$
189+ a^2 + b^2 = c^2
190+ }}$
191+ and some preformatted and tables belonging to item 1 as well
192+{{{
193+I'm part of item 1.
194+}}}
195+| this table | is |
196+| also a part | of item 1 |
197+ and some more text belonging to item 1.
198+# ordered list item 2
199+
200+
201+* Bulleted list item 1
202+* Bulleted list item 2
203+
204+
205+# Bulleted list item 1
206+# the # become numbers when converted to HTML
207+
208+- Bulleted list item 1
209+- Bulleted list item 2
210+
211+* Item 1
212+* Item 2
213+ # Sub item 1 (indentation 4 spaces)
214+ Sub item 1 continued line.
215+%%comments
216+ Sub item 1 next continued line.
217+ * Sub item 2, as an ordered list item even though the identifier is `*` (indentation 2 spaces followed by one tab of width 4)
218+ * etc.
219+ Continuation of Item 2
220+ Next continuation of Item 2
221+But this is a new paragraph.
222+
223+# 1
224+ * `1.1`
225+ * 2
226+ * 2.1
227+ * 3
228+
229+=== ordered lists with non-# identifiers ===
230+1. Numbered list item 1
231+2. Numbered list item 2
232+3. Numbered list item 3
233+
234+4. Numbered list item 1
235+5. Numbered list item 2
236+6. Numbered list item 3
237+
238+1) Numbered list item 1
239+2) Numbered list item 2
240+3) Numbered list item 3
241+
242+a) Numbered list item 1
243+b) Numbered list item 2
244+c) Numbered list item 3
245+
246+A) Numbered list item 1
247+B) Numbered list item 2
248+C) Numbered list item 3
249+
250+i) Numbered list item 1
251+ii) Numbered list item 2
252+iii) Numbered list item 3
253+
254+I) Numbered list item 1
255+II) Numbered list item 2
256+III) Numbered list item 3
257+
258+- Bulleted list item 1
259+- Bulleted list item 2
260+ a) Numbered list sub item 1
261+ b) more ...
262+ * and more ...
263+ * ...
264+ c) Numbered list sub item 3
265+ 1. Numbered list sub sub item 1
266+ 2. Numbered list sub sub item 2
267+ d) etc.
268+- Bulleted list item 3
269+
270+== todo lists ==
271+* [ ] task 1
272+ 1. [.] 5
273+* [o] 3
274+* [] not a todo item
275+* [ ]not a todo item
276+* [r] not a todo item
277+* [ ] not a todo item
278+* [o] a tab in the todo list marker `[ ]`
279+ III) [O] 4
280+ 5
281+ i) [X]
282+| a | b |
283+* [X] task 2
284+
285+== math ==
286+
287+$ \sum_i a_i^2 = 1 $
288+
289+{{$
290+\sum_i a_i^2
291+=
292+1
293+}}$
294+
295+{{$%align%
296+\sum_i a_i^2 &= 1 + 1 \\
297+&= 2.
298+}}$
299+
300+Just two dollar signs: $$
301+
302+[not math] You have $1
303+and I have $1.
304+
305+== tags ==
306+
307+:tag-one:tag-two:
308+
309+== tables ==
310+
311+| Year | Temperature (low) | Temperature (high) |
312+|------|-------------------|--------------------|
313+| 1900 | -10 | 25 |
314+| 1910 | -15 | 30 |
315+| 1920 | -10 | 32 |
316+| 1930 | _N/A_ | _N/A_ |
317+| 1940 | -2 | 40 |
318+
319+
320+=== centered headerless tables ===
321+ | a | b |
322+ | c | d |
323+
324+
325+== paragraphs ==
326+
327+This is first paragraph
328+with two lines.
329+
330+
331+
332+
333+
334+
335+
336+
337+This is a second paragraph with
338+two lines after many blank lines.
339+
340+== definition list ==
341+
342+Term 1:: Definition 1
343+Term 2::
344+:: Definition 2
345+ :: Definition 3
346+Term :: *separated* by :: _double colons_ :: Def1
347+:: Def2
348+Term with lots of trailing colons::::::::: Definition
349+:: This is :: A term (rather than a definition) :: and this is a definition
350+Term Without definitions ::
351+::
352+Part :: of :: dt :: part of ::dd
353+
354+:: Definition 1 without a term
355+:: Definition 2 without a term
356+
357+T1 :: D1
358+new paragraph
359+T1 :: D1
360+
361+Not::Definition
362+
363+Not ::Definition
364+
365+::Not definition
366+
367+ :: blockquote
368+
369+ block :: quote
370+
371+== metadata placeholders ==
372+%title title
373+%date 2017-05-01
374+
375+%title second title is ignored
376+%date second date is ignored
377+
378+%this is not a placeholder
379+
380+placeholders
381+%title another title
382+%date 2017-04-23
383+serves as space / softbreak in paragraphs
384+
385+
386+== sup, sub ==
387+
388+super^script^
389+
390+sub,,script,,
391+
392+== the todo mark ==
393+TODO:
394+
395+= _*not implemented yet*_ =
396+== tables with spans ==
397+| a | b | c | d |
398+| \/ | e | > | f |
399+| \/ | \/ | > | g |
400+| h | > | > | > |
401+
402+== tables with multiple lines of headers ==
403+| a | b |
404+| c | d |
405+|---|---|
406+
407+== some other placeholders ==
408+`template` placeholder is ignored.
409+%template template
410+
411+`nohtml` placeholder is ignored.
412+%nohtml
413+
414+