git.iko.soy/typeable/pandoc
on master help sign in
Preliminary support for new Div and Span elements in writers.

Currently these are "transparent" containers, except in HTML, where they produce div and span elements with attributes.

commite9de0f0e22b9b64b5684efe81d03539c3f57a71c authorJohn MacFarlane <fiddlosopher@gmail.com> dateThu 8 Aug 2013, 23:14 (13 years ago) parent99bb066
18 files changed+64
data/sample.lua+8 src/Text/Pandoc/Writers/AsciiDoc.hs+2 src/Text/Pandoc/Writers/ConTeXt.hs+2 src/Text/Pandoc/Writers/Custom.hs+5 src/Text/Pandoc/Writers/Docbook.hs+3 src/Text/Pandoc/Writers/Docx.hs+2 src/Text/Pandoc/Writers/FB2.hs+3 src/Text/Pandoc/Writers/HTML.hs+5 src/Text/Pandoc/Writers/LaTeX.hs+2 src/Text/Pandoc/Writers/Man.hs+2 src/Text/Pandoc/Writers/Markdown.hs+3 src/Text/Pandoc/Writers/MediaWiki.hs+6 src/Text/Pandoc/Writers/OpenDocument.hs+2 src/Text/Pandoc/Writers/Org.hs+3 src/Text/Pandoc/Writers/RST.hs+2 src/Text/Pandoc/Writers/RTF.hs+3 src/Text/Pandoc/Writers/Texinfo.hs+5 src/Text/Pandoc/Writers/Textile.hs+6
data/sample.lua+8
@@ -177,6 +177,10 @@ function Note(s)
177177 '"><sup>' .. num .. '</sup></a>'
178178end
179179
180+function Span(s, attr)
181+ return "<span" .. attributes(attr) .. ">" .. s .. "</span>"
182+end
183+
180184function Plain(s)
181185 return s
182186end
@@ -299,6 +303,10 @@ function Table(caption, aligns, widths, headers, rows)
299303 return table.concat(buffer,'\n')
300304end
301305
306+function Div(s, attr)
307+ return "<div" .. attributes(attr) .. ">\n" .. s .. "</div>"
308+end
309+
302310-- The following code will produce runtime warnings when you haven't defined
303311-- all of the functions you need for the custom writer, so it's useful
304312-- to include when you're working on a writer.
src/Text/Pandoc/Writers/AsciiDoc.hs+2
@@ -246,6 +246,7 @@ blockToAsciiDoc opts (OrderedList (_start, sty, _delim) items) = do
246246blockToAsciiDoc opts (DefinitionList items) = do
247247 contents <- mapM (definitionListItemToAsciiDoc opts) items
248248 return $ cat contents <> blankline
249+blockToAsciiDoc opts (Div _ bs) = blockListToAsciiDoc opts bs
249250
250251-- | Convert bullet list item (list of blocks) to asciidoc.
251252bulletListItemToAsciiDoc :: WriterOptions -> [Block] -> State WriterState Doc
@@ -383,3 +384,4 @@ inlineToAsciiDoc opts (Note [Plain inlines]) = do
383384 return $ text "footnote:[" <> contents <> "]"
384385-- asciidoc can't handle blank lines in notes
385386inlineToAsciiDoc _ (Note _) = return "[multiblock footnote omitted]"
387+inlineToAsciiDoc opts (Span _ ils) = inlineListToAsciiDoc opts ils
src/Text/Pandoc/Writers/ConTeXt.hs+2
@@ -143,6 +143,7 @@ blockToConTeXt (CodeBlock _ str) =
143143 -- blankline because \stoptyping can't have anything after it, inc. '}'
144144blockToConTeXt (RawBlock "context" str) = return $ text str <> blankline
145145blockToConTeXt (RawBlock _ _ ) = return empty
146+blockToConTeXt (Div _ bs) = blockListToConTeXt bs
146147blockToConTeXt (BulletList lst) = do
147148 contents <- mapM listItemToConTeXt lst
148149 return $ ("\\startitemize" <> if isTightList lst
@@ -330,6 +331,7 @@ inlineToConTeXt (Note contents) = do
330331 then text "\\footnote{" <> nest 2 contents' <> char '}'
331332 else text "\\startbuffer " <> nest 2 contents' <>
332333 text "\\stopbuffer\\footnote{\\getbuffer}"
334+inlineToConTeXt (Span _ ils) = inlineListToConTeXt ils
333335
334336-- | Craft the section header, inserting the secton reference, if supplied.
335337sectionHeader :: Attr
src/Text/Pandoc/Writers/Custom.hs+5
@@ -178,6 +178,9 @@ blockToCustom lua (OrderedList (num,sty,delim) items) =
178178blockToCustom lua (DefinitionList items) =
179179 callfunc lua "DefinitionList" items
180180
181+blockToCustom lua (Div attr items) =
182+ callfunc lua "Div" items (attrToMap attr)
183+
181184-- | Convert list of Pandoc block elements to Custom.
182185blockListToCustom :: LuaState -- ^ Options
183186 -> [Block] -- ^ List of block elements
@@ -240,3 +243,5 @@ inlineToCustom lua (Image alt (src,tit)) =
240243
241244inlineToCustom lua (Note contents) = callfunc lua "Note" contents
242245
246+inlineToCustom lua (Span attr items) =
247+ callfunc lua "Span" items (attrToMap attr)
src/Text/Pandoc/Writers/Docbook.hs+3
@@ -148,6 +148,7 @@ listItemToDocbook opts item =
148148-- | Convert a Pandoc block element to Docbook.
149149blockToDocbook :: WriterOptions -> Block -> Doc
150150blockToDocbook _ Null = empty
151+blockToDocbook opts (Div _ bs) = blocksToDocbook opts bs
151152blockToDocbook _ (Header _ _ _) = empty -- should not occur after hierarchicalize
152153blockToDocbook opts (Plain lst) = inlinesToDocbook opts lst
153154-- title beginning with fig: indicates that the image is a figure
@@ -267,6 +268,8 @@ inlineToDocbook opts (Quoted _ lst) =
267268 inTagsSimple "quote" $ inlinesToDocbook opts lst
268269inlineToDocbook opts (Cite _ lst) =
269270 inlinesToDocbook opts lst
271+inlineToDocbook opts (Span _ ils) =
272+ inlinesToDocbook opts ils
270273inlineToDocbook _ (Code _ str) =
271274 inTagsSimple "literal" $ text (escapeStringForXML str)
272275inlineToDocbook opts (Math t str)
src/Text/Pandoc/Writers/Docx.hs+2
@@ -428,6 +428,7 @@ getUniqueId = liftIO $ (show . (+ 20) . hashUnique) `fmap` newUnique
428428-- | Convert a Pandoc block element to OpenXML.
429429blockToOpenXML :: WriterOptions -> Block -> WS [Element]
430430blockToOpenXML _ Null = return []
431+blockToOpenXML opts (Div _ bs) = blocksToOpenXML opts bs
431432blockToOpenXML opts (Header lev (ident,_,_) lst) = do
432433 contents <- withParaProp (pStyle $ "Heading" ++ show lev) $
433434 blockToOpenXML opts (Para lst)
@@ -633,6 +634,7 @@ formattedString str = do
633634inlineToOpenXML :: WriterOptions -> Inline -> WS [Element]
634635inlineToOpenXML _ (Str str) = formattedString str
635636inlineToOpenXML opts Space = inlineToOpenXML opts (Str " ")
637+inlineToOpenXML opts (Span _ ils) = inlinesToOpenXML opts ils
636638inlineToOpenXML opts (Strong lst) =
637639 withTextProp (mknode "w:b" [] ()) $ inlinesToOpenXML opts lst
638640inlineToOpenXML opts (Emph lst) =
src/Text/Pandoc/Writers/FB2.hs+3
@@ -324,6 +324,7 @@ blockToXml (CodeBlock _ s) = return . spaceBeforeAfter .
324324 map (el "p" . el "code") . lines $ s
325325blockToXml (RawBlock _ s) = return . spaceBeforeAfter .
326326 map (el "p" . el "code") . lines $ s
327+blockToXml (Div _ bs) = cMapM blockToXml bs
327328blockToXml (BlockQuote bs) = liftM (list . el "cite") $ cMapM blockToXml bs
328329blockToXml (OrderedList a bss) = do
329330 state <- get
@@ -425,6 +426,7 @@ indent = indentBlock
425426-- | Convert a Pandoc's Inline element to FictionBook XML representation.
426427toXml :: Inline -> FBM [Content]
427428toXml (Str s) = return [txt s]
429+toXml (Span _ ils) = cMapM toXml ils
428430toXml (Emph ss) = list `liftM` wrap "emphasis" ss
429431toXml (Strong ss) = list `liftM` wrap "strong" ss
430432toXml (Strikeout ss) = list `liftM` wrap "strikethrough" ss
@@ -560,6 +562,7 @@ list = (:[])
560562plain :: Inline -> String
561563plain (Str s) = s
562564plain (Emph ss) = concat (map plain ss)
565+plain (Span _ ss) = concat (map plain ss)
563566plain (Strong ss) = concat (map plain ss)
564567plain (Strikeout ss) = concat (map plain ss)
565568plain (Superscript ss) = concat (map plain ss)
src/Text/Pandoc/Writers/HTML.hs+5
@@ -407,6 +407,9 @@ blockToHtml opts (Para [Str ".",Space,Str ".",Space,Str "."])
407407blockToHtml opts (Para lst) = do
408408 contents <- inlineListToHtml opts lst
409409 return $ H.p contents
410+blockToHtml opts (Div attr bs) = do
411+ contents <- blockListToHtml opts bs
412+ return $ addAttrs opts attr $ H.div $ nl opts >> contents >> nl opts
410413blockToHtml _ (RawBlock "html" str) = return $ preEscapedString str
411414blockToHtml _ (RawBlock _ _) = return mempty
412415blockToHtml opts (HorizontalRule) = return $ if writerHtml5 opts then H5.hr else H.hr
@@ -590,6 +593,8 @@ inlineToHtml opts inline =
590593 (Str str) -> return $ strToHtml str
591594 (Space) -> return $ strToHtml " "
592595 (LineBreak) -> return $ if writerHtml5 opts then H5.br else H.br
596+ (Span attr ils) -> inlineListToHtml opts ils >>=
597+ return . addAttrs opts attr . H.span
593598 (Emph lst) -> inlineListToHtml opts lst >>= return . H.em
594599 (Strong lst) -> inlineListToHtml opts lst >>= return . H.strong
595600 (Code attr str) -> case hlCode of
src/Text/Pandoc/Writers/LaTeX.hs+2
@@ -282,6 +282,7 @@ isLineBreakOrSpace _ = False
282282blockToLaTeX :: Block -- ^ Block to convert
283283 -> State WriterState Doc
284284blockToLaTeX Null = return empty
285+blockToLaTeX (Div _ bs) = blockListToLaTeX bs
285286blockToLaTeX (Plain lst) =
286287 inlineListToLaTeX $ dropWhile isLineBreakOrSpace lst
287288-- title beginning with fig: indicates that the image is a figure
@@ -560,6 +561,7 @@ isQuoted _ = False
560561-- | Convert inline element to LaTeX
561562inlineToLaTeX :: Inline -- ^ Inline to convert
562563 -> State WriterState Doc
564+inlineToLaTeX (Span _ ils) = inlineListToLaTeX ils >>= return . braces
563565inlineToLaTeX (Emph lst) =
564566 inlineListToLaTeX lst >>= return . inCmd "emph"
565567inlineToLaTeX (Strong lst) =
src/Text/Pandoc/Writers/Man.hs+2
@@ -160,6 +160,7 @@ blockToMan :: WriterOptions -- ^ Options
160160 -> Block -- ^ Block element
161161 -> State WriterState Doc
162162blockToMan _ Null = return empty
163+blockToMan opts (Div _ bs) = blockListToMan opts bs
163164blockToMan opts (Plain inlines) =
164165 liftM vcat $ mapM (inlineListToMan opts) $ splitSentences inlines
165166blockToMan opts (Para inlines) = do
@@ -300,6 +301,7 @@ inlineListToMan opts lst = mapM (inlineToMan opts) lst >>= (return . hcat)
300301
301302-- | Convert Pandoc inline element to man.
302303inlineToMan :: WriterOptions -> Inline -> State WriterState Doc
304+inlineToMan opts (Span _ ils) = inlineListToMan opts ils
303305inlineToMan opts (Emph lst) = do
304306 contents <- inlineListToMan opts lst
305307 return $ text "\\f[I]" <> contents <> text "\\f[]"
src/Text/Pandoc/Writers/Markdown.hs+3
@@ -301,6 +301,7 @@ blockToMarkdown :: WriterOptions -- ^ Options
301301 -> Block -- ^ Block element
302302 -> State WriterState Doc
303303blockToMarkdown _ Null = return empty
304+blockToMarkdown opts (Div _ bs) = blockListToMarkdown opts bs
304305blockToMarkdown opts (Plain inlines) = do
305306 contents <- inlineListToMarkdown opts inlines
306307 return $ contents <> cr
@@ -628,6 +629,8 @@ escapeSpaces x = x
628629
629630-- | Convert Pandoc inline element to markdown.
630631inlineToMarkdown :: WriterOptions -> Inline -> State WriterState Doc
632+inlineToMarkdown opts (Span _ ils) =
633+ inlineListToMarkdown opts ils
631634inlineToMarkdown opts (Emph lst) = do
632635 contents <- inlineListToMarkdown opts lst
633636 return $ "*" <> contents <> "*"
src/Text/Pandoc/Writers/MediaWiki.hs+6
@@ -83,6 +83,9 @@ blockToMediaWiki :: WriterOptions -- ^ Options
8383
8484blockToMediaWiki _ Null = return ""
8585
86+blockToMediaWiki opts (Div _ bs) =
87+ blockListToMediaWiki opts bs
88+
8689blockToMediaWiki opts (Plain inlines) =
8790 inlineListToMediaWiki opts inlines
8891
@@ -328,6 +331,9 @@ inlineListToMediaWiki opts lst =
328331-- | Convert Pandoc inline element to MediaWiki.
329332inlineToMediaWiki :: WriterOptions -> Inline -> State WriterState String
330333
334+inlineToMediaWiki opts (Span _ ils) =
335+ inlineListToMediaWiki opts ils
336+
331337inlineToMediaWiki opts (Emph lst) = do
332338 contents <- inlineListToMediaWiki opts lst
333339 return $ "''" ++ contents ++ "''"
src/Text/Pandoc/Writers/OpenDocument.hs+2
@@ -285,6 +285,7 @@ blockToOpenDocument :: WriterOptions -> Block -> State WriterState Doc
285285blockToOpenDocument o bs
286286 | Plain b <- bs = inParagraphTags =<< inlinesToOpenDocument o b
287287 | Para b <- bs = inParagraphTags =<< inlinesToOpenDocument o b
288+ | Div _ xs <- bs = blocksToOpenDocument o xs
288289 | Header i _ b <- bs = setFirstPara >>
289290 (inHeaderTags i =<< inlinesToOpenDocument o b)
290291 | BlockQuote b <- bs = setFirstPara >> mkBlockQuote b
@@ -360,6 +361,7 @@ inlinesToOpenDocument o l = hcat <$> mapM (inlineToOpenDocument o) l
360361inlineToOpenDocument :: WriterOptions -> Inline -> State WriterState Doc
361362inlineToOpenDocument o ils
362363 | Space <- ils = inTextStyle space
364+ | Span _ xs <- ils = inlinesToOpenDocument o xs
363365 | LineBreak <- ils = return $ selfClosingTag "text:line-break" []
364366 | Str s <- ils = inTextStyle $ handleSpaces $ escapeStringForXML s
365367 | Emph l <- ils = withTextStyle Italic $ inlinesToOpenDocument o l
src/Text/Pandoc/Writers/Org.hs+3
@@ -106,6 +106,7 @@ escapeString = escapeStringUsing $
106106blockToOrg :: Block -- ^ Block element
107107 -> State WriterState Doc
108108blockToOrg Null = return empty
109+blockToOrg (Div _ bs) = blockListToOrg bs
109110blockToOrg (Plain inlines) = inlineListToOrg inlines
110111-- title beginning with fig: indicates that the image is a figure
111112blockToOrg (Para [Image txt (src,'f':'i':'g':':':tit)]) = do
@@ -229,6 +230,8 @@ inlineListToOrg lst = mapM inlineToOrg lst >>= return . hcat
229230
230231-- | Convert Pandoc inline element to Org.
231232inlineToOrg :: Inline -> State WriterState Doc
233+inlineToOrg (Span _ lst) =
234+ inlineListToOrg lst
232235inlineToOrg (Emph lst) = do
233236 contents <- inlineListToOrg lst
234237 return $ "/" <> contents <> "/"
src/Text/Pandoc/Writers/RST.hs+2
@@ -161,6 +161,7 @@ bordered contents c =
161161blockToRST :: Block -- ^ Block element
162162 -> State WriterState Doc
163163blockToRST Null = return empty
164+blockToRST (Div _ bs) = blockListToRST bs
164165blockToRST (Plain inlines) = inlineListToRST inlines
165166-- title beginning with fig: indicates that the image is a figure
166167blockToRST (Para [Image txt (src,'f':'i':'g':':':tit)]) = do
@@ -338,6 +339,7 @@ inlineListToRST lst = mapM inlineToRST (insertBS lst) >>= return . hcat
338339
339340-- | Convert Pandoc inline element to RST.
340341inlineToRST :: Inline -> State WriterState Doc
342+inlineToRST (Span _ ils) = inlineListToRST ils
341343inlineToRST (Emph lst) = do
342344 contents <- inlineListToRST lst
343345 return $ "*" <> contents <> "*"
src/Text/Pandoc/Writers/RTF.hs+3
@@ -208,6 +208,8 @@ blockToRTF :: Int -- ^ indent level
208208 -> Block -- ^ block to convert
209209 -> String
210210blockToRTF _ _ Null = ""
211+blockToRTF indent alignment (Div _ bs) =
212+ concatMap (blockToRTF indent alignment) bs
211213blockToRTF indent alignment (Plain lst) =
212214 rtfCompact indent 0 alignment $ inlineListToRTF lst
213215blockToRTF indent alignment (Para lst) =
@@ -308,6 +310,7 @@ inlineListToRTF lst = concatMap inlineToRTF lst
308310-- | Convert inline item to RTF.
309311inlineToRTF :: Inline -- ^ inline to convert
310312 -> String
313+inlineToRTF (Span _ lst) = inlineListToRTF lst
311314inlineToRTF (Emph lst) = "{\\i " ++ (inlineListToRTF lst) ++ "}"
312315inlineToRTF (Strong lst) = "{\\b " ++ (inlineListToRTF lst) ++ "}"
313316inlineToRTF (Strikeout lst) = "{\\strike " ++ (inlineListToRTF lst) ++ "}"
src/Text/Pandoc/Writers/Texinfo.hs+5
@@ -123,6 +123,8 @@ blockToTexinfo :: Block -- ^ Block to convert
123123
124124blockToTexinfo Null = return empty
125125
126+blockToTexinfo (Div _ bs) = blockListToTexinfo bs
127+
126128blockToTexinfo (Plain lst) =
127129 inlineListToTexinfo lst
128130
@@ -374,6 +376,9 @@ disallowedInNode c = c `elem` ".,:()"
374376inlineToTexinfo :: Inline -- ^ Inline to convert
375377 -> State WriterState Doc
376378
379+inlineToTexinfo (Span _ lst) =
380+ inlineListToTexinfo lst
381+
377382inlineToTexinfo (Emph lst) =
378383 inlineListToTexinfo lst >>= return . inCmd "emph"
379384
src/Text/Pandoc/Writers/Textile.hs+6
@@ -101,6 +101,9 @@ blockToTextile :: WriterOptions -- ^ Options
101101
102102blockToTextile _ Null = return ""
103103
104+blockToTextile opts (Div _ bs) =
105+ blockListToTextile opts bs
106+
104107blockToTextile opts (Plain inlines) =
105108 inlineListToTextile opts inlines
106109
@@ -343,6 +346,9 @@ inlineListToTextile opts lst =
343346-- | Convert Pandoc inline element to Textile.
344347inlineToTextile :: WriterOptions -> Inline -> State WriterState String
345348
349+inlineToTextile opts (Span _ lst) =
350+ inlineListToTextile opts lst
351+
346352inlineToTextile opts (Emph lst) = do
347353 contents <- inlineListToTextile opts lst
348354 return $ if '_' `elem` contents