aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Krewinkel <[email protected]>2022-08-22 09:48:50 +0200
committerAlbert Krewinkel <[email protected]>2022-08-22 12:53:57 +0200
commita31cf9a005f3d7dcd3f5d16262f40d8b3e406776 (patch)
tree6069cdb2f750c708bec72fe7ec4f4266212ec196
parent1de40c62fc1220b689389e6c2eaa76f4936363fe (diff)
Org writer: keep code block attributes as header args.
This allows to keep more information in the resulting `src` blocks, making it easier to roundtrip from or through Org. Org babel ignores unknown header arguments.
-rw-r--r--src/Text/Pandoc/Writers/Org.hs14
-rw-r--r--test/Tests/Writers/Org.hs9
2 files changed, 19 insertions, 4 deletions
diff --git a/src/Text/Pandoc/Writers/Org.hs b/src/Text/Pandoc/Writers/Org.hs
index 81c9d8d48..772e13d5c 100644
--- a/src/Text/Pandoc/Writers/Org.hs
+++ b/src/Text/Pandoc/Writers/Org.hs
@@ -159,10 +159,16 @@ blockToOrg (CodeBlock (ident,classes,kvs) str) = do
else " -n" <> startnum
else ""
let at = map pandocLangToOrg classes `intersect` orgLangIdentifiers
- let (beg, end) = case at of
- [] -> ("#+begin_example" <> numberlines, "#+end_example")
- (x:_) -> ("#+begin_src " <> x <> numberlines, "#+end_src")
- return $ name $$ literal beg $$ literal str $$ text end $$ blankline
+ let lang = case at of
+ [] -> Nothing
+ l:_ -> Just l
+ let args = mconcat $
+ [ " :" <> k <> " " <> v
+ | (k, v) <- kvs, k `notElem` ["startFrom", "org-language"]]
+ let (beg, end) = case lang of
+ Nothing -> ("#+begin_example" <> numberlines, "#+end_example")
+ Just x -> ("#+begin_src " <> x <> numberlines <> args, "#+end_src")
+ return $ name $$ literal beg $$ literal str $$ literal end $$ blankline
blockToOrg (BlockQuote blocks) = do
contents <- blockListToOrg blocks
return $ blankline $$ "#+begin_quote" $$
diff --git a/test/Tests/Writers/Org.hs b/test/Tests/Writers/Org.hs
index cc957fc6c..c36e761cd 100644
--- a/test/Tests/Writers/Org.hs
+++ b/test/Tests/Writers/Org.hs
@@ -76,5 +76,14 @@ tests =
, "return True"
, "#+end_src"
]
+
+ , "attributes"
+ =: codeBlockWith ("", ["python"], [("cache", "yes"), ("noweb", "yes")])
+ "'Hello'"
+ =?> T.unlines
+ [ "#+begin_src python :cache yes :noweb yes"
+ , "'Hello'"
+ , "#+end_src"
+ ]
]
]