git.iko.soy/typeable/pandoc
on master help sign in
Implement definition lists in dokuwiki writer (#386) - credit: James Smaldon
commit78ae3c24929e02710ef55614694435ecb1029390 authorclaremacrae <github@cfmacrae.fastmail.co.uk> dateWed 28 Aug 2013, 08:09 (13 years ago) parentfe1040d
2 files changed+36−40
src/Text/Pandoc/Writers/DokuWiki.hs+24−31 tests/writer.dokuwiki+12−9
src/Text/Pandoc/Writers/DokuWiki.hs+24−31
@@ -32,7 +32,6 @@ DokuWiki: <https://www.dokuwiki.org/dokuwiki>
3232
3333{-
3434 [ ] Don't generate <blockquote>...
35− [ ] Implement definition lists
3635 [ ] Don't generate lists using <ol> and <ul>
3736 [ ] Don't generate <div>
3837 [ ] Implement alignment of text in tables
@@ -54,7 +53,7 @@ import Control.Monad.State
5453
5554data WriterState = WriterState {
5655 stNotes :: Bool -- True if there are notes
57− , stListLevel :: [Char] -- String at beginning of list items, e.g. "**"
56+ , stIndent :: String -- Indent after the marker at the beginning of list items
5857 , stUseTags :: Bool -- True if we should use HTML tags because we're in a complex list
5958 }
6059
@@ -62,7 +61,7 @@ data WriterState = WriterState {
6261writeDokuWiki :: WriterOptions -> Pandoc -> String
6362writeDokuWiki opts document =
6463 evalState (pandocToDokuWiki opts document)
65− (WriterState { stNotes = False, stListLevel = [], stUseTags = False })
64+ (WriterState { stNotes = False, stIndent = "", stUseTags = False })
6665
6766-- | Return DokuWiki representation of document.
6867pandocToDokuWiki :: WriterOptions -> Pandoc -> State WriterState String
@@ -112,11 +111,11 @@ blockToDokuWiki opts (Para [Image txt (src,'f':'i':'g':':':tit)]) = do
112111
113112blockToDokuWiki opts (Para inlines) = do
114113 useTags <- get >>= return . stUseTags
115− listLevel <- get >>= return . stListLevel
114+ indent <- get >>= return . stIndent
116115 contents <- inlineListToDokuWiki opts inlines
117116 return $ if useTags
118117 then "<p>" ++ contents ++ "</p>"
119− else contents ++ if null listLevel then "\n" else ""
118+ else contents ++ if null indent then "\n" else ""
120119
121120blockToDokuWiki _ (RawBlock "mediawiki" str) = return str
122121blockToDokuWiki _ (RawBlock "html" str) = return str
@@ -166,7 +165,7 @@ blockToDokuWiki opts (Table capt aligns _ headers rows') = do
166165
167166blockToDokuWiki opts x@(BulletList items) = do
168167 oldUseTags <- get >>= return . stUseTags
169− listLevel <- get >>= return . stListLevel
168+ indent <- get >>= return . stIndent
170169 let useTags = oldUseTags || not (isSimpleList x)
171170 if useTags
172171 then do
@@ -175,14 +174,14 @@ blockToDokuWiki opts x@(BulletList items) = do
175174 modify $ \s -> s { stUseTags = oldUseTags }
176175 return $ "<ul>\n" ++ vcat contents ++ "</ul>\n"
177176 else do
178− modify $ \s -> s { stListLevel = stListLevel s ++ " " }
177+ modify $ \s -> s { stIndent = stIndent s ++ " " }
179178 contents <- mapM (listItemToDokuWiki opts) items
180− modify $ \s -> s { stListLevel = init (stListLevel s) }
181− return $ vcat contents ++ if null listLevel then "\n" else ""
179+ modify $ \s -> s { stIndent = indent }
180+ return $ vcat contents ++ if null indent then "\n" else ""
182181
183182blockToDokuWiki opts x@(OrderedList attribs items) = do
184183 oldUseTags <- get >>= return . stUseTags
185− listLevel <- get >>= return . stListLevel
184+ indent <- get >>= return . stIndent
186185 let useTags = oldUseTags || not (isSimpleList x)
187186 if useTags
188187 then do
@@ -191,17 +190,17 @@ blockToDokuWiki opts x@(OrderedList attribs items) = do
191190 modify $ \s -> s { stUseTags = oldUseTags }
192191 return $ "<ol" ++ listAttribsToString attribs ++ ">\n" ++ vcat contents ++ "</ol>\n"
193192 else do
194− modify $ \s -> s { stListLevel = stListLevel s ++ " " }
193+ modify $ \s -> s { stIndent = stIndent s ++ " " }
195194 contents <- mapM (orderedListItemToDokuWiki opts) items
196− modify $ \s -> s { stListLevel = init (stListLevel s) }
197− return $ vcat contents ++ if null listLevel then "\n" else ""
195+ modify $ \s -> s { stIndent = indent }
196+ return $ vcat contents ++ if null indent then "\n" else ""
198197
199198-- TODO Need to decide how to make definition lists work on dokuwiki - I don't think there
200199-- is a specific representation of them.
201200-- TODO This creates double '; ; ' if there is a bullet or ordered list inside a definition list
202201blockToDokuWiki opts x@(DefinitionList items) = do
203202 oldUseTags <- get >>= return . stUseTags
204− listLevel <- get >>= return . stListLevel
203+ indent <- get >>= return . stIndent
205204 let useTags = oldUseTags || not (isSimpleList x)
206205 if useTags
207206 then do
@@ -210,10 +209,10 @@ blockToDokuWiki opts x@(DefinitionList items) = do
210209 modify $ \s -> s { stUseTags = oldUseTags }
211210 return $ "<dl>\n" ++ vcat contents ++ "</dl>\n"
212211 else do
213− modify $ \s -> s { stListLevel = stListLevel s ++ ";" }
212+ modify $ \s -> s { stIndent = stIndent s ++ " " }
214213 contents <- mapM (definitionListItemToDokuWiki opts) items
215− modify $ \s -> s { stListLevel = init (stListLevel s) }
216− return $ vcat contents ++ if null listLevel then "\n" else ""
214+ modify $ \s -> s { stIndent = indent }
215+ return $ vcat contents ++ if null indent then "\n" else ""
217216
218217-- Auxiliary functions for lists:
219218
@@ -236,10 +235,8 @@ listItemToDokuWiki opts items = do
236235 if useTags
237236 then return $ "<li>" ++ contents ++ "</li>"
238237 else do
239− marker <- get >>= return . stListLevel
240− -- This marker ++ marker is an awful hack to write 2 spaces per indentation level.
241− -- I couldn't find a cleaner way of doing it.
242− return $ marker ++ marker ++ "* " ++ contents
238+ indent <- get >>= return . stIndent
239+ return $ indent ++ "* " ++ contents
243240
244241-- | Convert ordered list item (list of blocks) to DokuWiki.
245242-- | TODO Emiminate dreadful duplication of text from listItemToDokuWiki
@@ -250,10 +247,8 @@ orderedListItemToDokuWiki opts items = do
250247 if useTags
251248 then return $ "<li>" ++ contents ++ "</li>"
252249 else do
253− marker <- get >>= return . stListLevel
254− -- This marker ++ marker is an awful hack to write 2 spaces per indentation level.
255− -- I couldn't find a cleaner way of doing it.
256− return $ marker ++ marker ++ "- " ++ contents
250+ indent <- get >>= return . stIndent
251+ return $ indent ++ "- " ++ contents
257252
258253-- | Convert definition list item (label, list of blocks) to DokuWiki.
259254definitionListItemToDokuWiki :: WriterOptions
@@ -267,9 +262,8 @@ definitionListItemToDokuWiki opts (label, items) = do
267262 then return $ "<dt>" ++ labelText ++ "</dt>\n" ++
268263 (intercalate "\n" $ map (\d -> "<dd>" ++ d ++ "</dd>") contents)
269264 else do
270− marker <- get >>= return . stListLevel
271− return $ marker ++ " " ++ labelText ++ "\n" ++
272− (intercalate "\n" $ map (\d -> init marker ++ ": " ++ d) contents)
265+ indent <- get >>= return . stIndent
266+ return $ indent ++ "* **" ++ labelText ++ "** " ++ concat contents
273267
274268-- | True if the list can be handled by simple wiki markup, False if HTML tags will be needed.
275269isSimpleList :: Block -> Bool
@@ -277,7 +271,7 @@ isSimpleList x =
277271 case x of
278272 BulletList _ -> True
279273 OrderedList _ _ -> True
280− DefinitionList items -> all isSimpleListItem $ concatMap snd items
274+ DefinitionList _ -> True
281275 _ -> False
282276
283277-- | True if list item can be handled with the simple wiki syntax. False if
@@ -371,8 +365,7 @@ blockListToDokuWiki opts blocks =
371365
372366-- | Convert list of Pandoc inline elements to DokuWiki.
373367inlineListToDokuWiki :: WriterOptions -> [Inline] -> State WriterState String
374−inlineListToDokuWiki opts lst =
375− mapM (inlineToDokuWiki opts) lst >>= return . concat
368+inlineListToDokuWiki opts lst = mapM (inlineToDokuWiki opts) lst >>= return . concat
376369
377370-- | Convert Pandoc inline element to DokuWiki.
378371inlineToDokuWiki :: WriterOptions -> Inline -> State WriterState String
tests/writer.dokuwiki+12−9
@@ -247,25 +247,28 @@ Loose:
247247
248248Multiple blocks with italics:
249249
250− * **apple** red fruitcontains seeds, crisp, pleasant to taste
251− * **orange** orange fruit<code>
252−{ orange code block }
253−</code>orange block quote
250+ * **//apple//** red fruit
251+contains seeds, crisp, pleasant to taste
252+ * **//orange//** orange fruit
253+<code>{ orange code block }</code>
254+<blockquote>orange block quote</blockquote>
254255
255256Multiple definitions, tight:
256257
257− * **apple** red fruit computer
258+ * **apple** red fruitcomputer
258259 * **orange** orange fruitbank
259260
260261Multiple definitions, loose:
261262
262− * **apple** red fruit computer
263− * **orange** orange fruit bank
263+ * **apple** red fruitcomputer
264+ * **orange** orange fruitbank
264265
265266Blank line after term, indented marker, alternate markers:
266267
267− * **apple** red fruit computer
268− * **orange** orange fruit sublist sublist
268+ * **apple** red fruitcomputer
269+ * **orange** orange fruit
270+ - sublist
271+ - sublist
269272
270273====== HTML Blocks ======
271274