@@ -69,7 +69,32 @@ parseOrg = do
69 blocks' <- parseBlocks
69 blocks' <- parseBlocks
70 st <- getState
70 st <- getState
71 let meta = runF (orgStateMeta' st) st
71 let meta = runF (orgStateMeta' st) st
72+ let removeUnwantedBlocks = dropCommentTrees . filter (/= Null)
72− return $ Pandoc meta $ filter (/= Null) (B.toList $ runF blocks' st)
73+ return $ Pandoc meta $ removeUnwantedBlocks (B.toList $ runF blocks' st)
75+-- | Drop COMMENT headers and the document tree below those headers.
76+dropCommentTrees :: [Block] -> [Block]
77+dropCommentTrees [] = []
78+dropCommentTrees blks@(b:bs) =
79+ maybe blks (flip dropUntilHeaderAboveLevel bs) $ commentHeaderLevel b
81+-- | Return the level of a header starting a comment tree and Nothing
83+commentHeaderLevel :: Block -> Maybe Int
84+commentHeaderLevel blk =
86+ (Header level _ ((Str "COMMENT"):_)) -> Just level
89+-- | Drop blocks until a header on or above the given level is seen
90+dropUntilHeaderAboveLevel :: Int -> [Block] -> [Block]
91+dropUntilHeaderAboveLevel n = dropWhile (not . isHeaderLevelLowerEq n)
93+isHeaderLevelLowerEq :: Int -> Block -> Bool
94+isHeaderLevelLowerEq n blk =
96+ (Header level _ _) -> n >= level
75-- Parser State for Org
100-- Parser State for Org