aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Text/Pandoc/Writers/OpenDocument.hs43
-rw-r--r--test/command/6755.md11
2 files changed, 44 insertions, 10 deletions
diff --git a/src/Text/Pandoc/Writers/OpenDocument.hs b/src/Text/Pandoc/Writers/OpenDocument.hs
index 789dbe9b0..071a5542f 100644
--- a/src/Text/Pandoc/Writers/OpenDocument.hs
+++ b/src/Text/Pandoc/Writers/OpenDocument.hs
@@ -188,15 +188,23 @@ formulaStyle mt = inTags False "style:style"
,("style:horizontal-rel", "paragraph-content")
,("style:wrap", "none")]
+inBookmarkTags :: Text -> Doc Text -> Doc Text
+inBookmarkTags ident d =
+ selfClosingTag "text:bookmark-start" [ ("text:name", ident) ]
+ <> d <>
+ selfClosingTag "text:bookmark-end" [ ("text:name", ident) ]
+
+selfClosingBookmark :: Text -> Doc Text
+selfClosingBookmark ident =
+ selfClosingTag "text:bookmark" [("text:name", ident)]
+
inHeaderTags :: PandocMonad m => Int -> Text -> Doc Text -> OD m (Doc Text)
inHeaderTags i ident d =
return $ inTags False "text:h" [ ("text:style-name", "Heading_20_" <> tshow i)
, ("text:outline-level", tshow i)]
$ if T.null ident
then d
- else selfClosingTag "text:bookmark-start" [ ("text:name", ident) ]
- <> d <>
- selfClosingTag "text:bookmark-end" [ ("text:name", ident) ]
+ else inBookmarkTags ident d
inQuotes :: QuoteType -> Doc Text -> Doc Text
inQuotes SingleQuote s = char '\8216' <> s <> char '\8217'
@@ -360,12 +368,7 @@ blockToOpenDocument o bs
then return empty
else inParagraphTags =<< inlinesToOpenDocument o b
| LineBlock b <- bs = blockToOpenDocument o $ linesToPara b
- | Div attr xs <- bs = do
- let (_,_,kvs) = attr
- withLangFromAttr attr $
- case lookup "custom-style" kvs of
- Just sty -> withParagraphStyle o sty xs
- _ -> blocksToOpenDocument o xs
+ | Div attr xs <- bs = mkDiv attr xs
| Header i (ident,_,_) b
<- bs = setFirstPara >> (inHeaderTags i ident
=<< inlinesToOpenDocument o b)
@@ -390,6 +393,16 @@ blockToOpenDocument o bs
setInDefinitionList False
return r
preformatted s = flush . vcat <$> mapM (inPreformattedTags . escapeStringForXML) (T.lines s)
+ mkDiv attr s = do
+ let (ident,_,kvs) = attr
+ i = withLangFromAttr attr $
+ case lookup "custom-style" kvs of
+ Just sty -> withParagraphStyle o sty s
+ _ -> blocksToOpenDocument o s
+ mkBookmarkedDiv = inTags False "text:section" [("text:name", ident)]
+ if T.null ident
+ then i
+ else fmap mkBookmarkedDiv i
mkBlockQuote b = do increaseIndent
i <- paraStyle
[("style:parent-style-name","Quotations")]
@@ -567,7 +580,7 @@ inlineToOpenDocument o ils
| writerWrapText o == WrapPreserve
-> return $ preformatted "\n"
| otherwise -> return space
- Span attr xs -> withLangFromAttr attr (inlinesToOpenDocument o xs)
+ Span attr xs -> mkSpan attr xs
LineBreak -> return $ selfClosingTag "text:line-break" []
Str s -> return $ handleSpaces $ escapeStringForXML s
Emph l -> withTextStyle Italic $ inlinesToOpenDocument o l
@@ -625,6 +638,16 @@ inlineToOpenDocument o ils
, ("xlink:type" , "simple")
, ("xlink:show" , "embed" )
, ("xlink:actuate", "onLoad")]
+ mkSpan attr xs = do
+ let (ident,_,_) = attr
+ i = withLangFromAttr attr (inlinesToOpenDocument o xs)
+ mkBookmarkedSpan b =
+ if isEmpty b
+ then selfClosingBookmark ident
+ else inBookmarkTags ident b
+ if T.null ident
+ then i
+ else fmap mkBookmarkedSpan i
mkNote l = do
n <- length <$> gets stNotes
let footNote t = inTags False "text:note"
diff --git a/test/command/6755.md b/test/command/6755.md
new file mode 100644
index 000000000..b6ff0fc0b
--- /dev/null
+++ b/test/command/6755.md
@@ -0,0 +1,11 @@
+```
+%pandoc -f native -t opendocument
+[Div ("divId",[],[])
+ [Para [Str "Here",Space,Str "is",Space,Str "a",Space,Str "div."]],
+Para [Span ("spanId",[],[]) [Str "And",Space,Str "here",Space,Str "is",Space,Str "a",Space,Str "span."]]]
+^D
+<text:section text:name="divId"><text:p text:style-name="Text_20_body">Here
+is a div.</text:p></text:section>
+<text:p text:style-name="Text_20_body"><text:bookmark-start text:name="spanId" />And
+here is a span.<text:bookmark-end text:name="spanId" /></text:p>
+```