git.iko.soy/typeable/pandoc
on master help sign in
Org reader: Respect :exports header arguments on code blocks

Adds support to the org reader for conditionally exporting either the code block, results block immediately following, both, or neither, depending on the value of the `:exports` header argument. If no such argument is supplied, the default org behavior (for most languages) of exporting code is used.

commit1bb4f0c497a352a12a546fd9f1dff570bdee4018 authorCraig S. Bosma <craig.bosma@gmail.com> dateMon 14 Jul 2014, 19:14 (12 years ago) parente053562
2 files changed+87−5
src/Text/Pandoc/Readers/Org.hs+27−5 tests/Tests/Readers/Org.hs+60
src/Text/Pandoc/Readers/Org.hs+27−5
@@ -341,14 +341,36 @@ verseBlock blkProp = try $ do
341341 fmap B.para . mconcat . intersperse (pure B.linebreak)
342342 <$> mapM (parseFromString parseInlines) (lines content)
343343
344+exportsCode :: [(String, String)] -> Bool
345+exportsCode attrs = not (("rundoc-exports", "none") `elem` attrs
346+ || ("rundoc-exports", "results") `elem` attrs)
347+
348+exportsResults :: [(String, String)] -> Bool
349+exportsResults attrs = ("rundoc-exports", "results") `elem` attrs
350+ || ("rundoc-exports", "both") `elem` attrs
351+
352+followingResultsBlock :: OrgParser (Maybe String)
353+followingResultsBlock =
354+ optionMaybe (try $ blanklines *> stringAnyCase "#+RESULTS:"
355+ *> blankline
356+ *> (unlines <$> many1 exampleLine))
357+
344358codeBlock :: BlockProperties -> OrgParser (F Blocks)
345359codeBlock blkProp = do
346360 skipSpaces
347− (classes, kv) <- codeHeaderArgs <|> (mempty <$ ignHeaders)
348− id' <- fromMaybe "" <$> lookupBlockAttribute "name"
349− content <- rawBlockContent blkProp
350− let codeBlck = B.codeBlockWith ( id', classes, kv ) content
351− maybe (pure codeBlck) (labelDiv codeBlck) <$> lookupInlinesAttr "caption"
361+ (classes, kv) <- codeHeaderArgs <|> (mempty <$ ignHeaders)
362+ id' <- fromMaybe "" <$> lookupBlockAttribute "name"
363+ content <- rawBlockContent blkProp
364+ resultsContent <- followingResultsBlock
365+ let includeCode = exportsCode kv
366+ let includeResults = exportsResults kv
367+ let codeBlck = B.codeBlockWith ( id', classes, kv ) content
368+ labelledBlck <- maybe (pure codeBlck)
369+ (labelDiv codeBlck)
370+ <$> lookupInlinesAttr "caption"
371+ let resultBlck = pure $ maybe mempty (exampleCode) resultsContent
372+ return $ (if includeCode then labelledBlck else mempty)
373+ <> (if includeResults then resultBlck else mempty)
352374 where
353375 labelDiv blk value =
354376 B.divWith nullAttr <$> (mappend <$> labelledBlock value
tests/Tests/Readers/Org.hs+60
@@ -886,6 +886,66 @@ tests =
886886 , " (+ 23 42))" ]
887887 in codeBlockWith ("", classes, params) code'
888888
889+ , "Source block with results and :exports both" =:
890+ unlines [ "#+BEGIN_SRC emacs-lisp :exports both"
891+ , "(progn (message \"Hello, World!\")"
892+ , " (+ 23 42))"
893+ , "#+END_SRC"
894+ , ""
895+ , "#+RESULTS:"
896+ , ": 65"] =?>
897+ let classes = [ "commonlisp" -- as kate doesn't know emacs-lisp syntax
898+ , "rundoc-block"
899+ ]
900+ params = [ ("rundoc-language", "emacs-lisp")
901+ , ("rundoc-exports", "both")
902+ ]
903+ code' = unlines [ "(progn (message \"Hello, World!\")"
904+ , " (+ 23 42))" ]
905+ results' = "65\n"
906+ in codeBlockWith ("", classes, params) code'
907+ <>
908+ codeBlockWith ("", ["example"], []) results'
909+
910+ , "Source block with results and :exports code" =:
911+ unlines [ "#+BEGIN_SRC emacs-lisp :exports code"
912+ , "(progn (message \"Hello, World!\")"
913+ , " (+ 23 42))"
914+ , "#+END_SRC"
915+ , ""
916+ , "#+RESULTS:"
917+ , ": 65" ] =?>
918+ let classes = [ "commonlisp" -- as kate doesn't know emacs-lisp syntax
919+ , "rundoc-block"
920+ ]
921+ params = [ ("rundoc-language", "emacs-lisp")
922+ , ("rundoc-exports", "code")
923+ ]
924+ code' = unlines [ "(progn (message \"Hello, World!\")"
925+ , " (+ 23 42))" ]
926+ in codeBlockWith ("", classes, params) code'
927+
928+ , "Source block with results and :exports results" =:
929+ unlines [ "#+BEGIN_SRC emacs-lisp :exports results"
930+ , "(progn (message \"Hello, World!\")"
931+ , " (+ 23 42))"
932+ , "#+END_SRC"
933+ , ""
934+ , "#+RESULTS:"
935+ , ": 65" ] =?>
936+ let results' = "65\n"
937+ in codeBlockWith ("", ["example"], []) results'
938+
939+ , "Source block with results and :exports none" =:
940+ unlines [ "#+BEGIN_SRC emacs-lisp :exports none"
941+ , "(progn (message \"Hello, World!\")"
942+ , " (+ 23 42))"
943+ , "#+END_SRC"
944+ , ""
945+ , "#+RESULTS:"
946+ , ": 65" ] =?>
947+ rawBlock "html" ""
948+
889949 , "Example block" =:
890950 unlines [ "#+begin_example"
891951 , "A chosen representation of"