@@ -136,6 +136,12 @@ isNonTextOutput = (`elem` ["odt"])
136136writeDoc :: WriterOptions -> Pandoc -> String
137137writeDoc _ = prettyPandoc
138138
139+headerShift :: Int -> Pandoc -> Pandoc
140+headerShift n = processWith shift
141+ where shift :: Block -> Block
142+ shift (Header level inner) = Header (level + n) inner
143+ shift x = x
144+
139145-- | Data structure for command line options.
140146data Opt = Opt
141147 { optTabStop :: Int -- ^ Number of spaces per tab
@@ -145,7 +151,7 @@ data Opt = Opt
145151 , optWriter :: String -- ^ Writer format
146152 , optParseRaw :: Bool -- ^ Parse unconvertable HTML and TeX
147153 , optTableOfContents :: Bool -- ^ Include table of contents
148− , optHeaderShift :: Int -- ^ Headers base level
154+ , optTransforms :: [Pandoc -> Pandoc] -- ^ Doc transforms to apply
149155 , optTemplate :: String -- ^ Custom template
150156 , optVariables :: [(String,String)] -- ^ Template variables to set
151157 , optBefore :: [String] -- ^ Texts to include before body
@@ -185,7 +191,7 @@ defaultOpts = Opt
185191 , optWriter = "" -- null for default writer
186192 , optParseRaw = False
187193 , optTableOfContents = False
188− , optHeaderShift = 1
194+ , optTransforms = []
189195 , optTemplate = ""
190196 , optVariables = []
191197 , optBefore = []
@@ -358,7 +364,11 @@ options =
358364 (ReqArg
359365 (\arg opt -> do
360366 if all isDigit arg && (read arg :: Int) >= 1
361− then return opt { optHeaderShift = read arg - 1 }
367+ then do
368+ let oldTransforms = optTransforms opt
369+ let shift = read arg - 1
370+ return opt{ optTransforms =
371+ headerShift shift : oldTransforms }
362372 else do
363373 hPutStrLn stderr $ "base-header-level must be a number >= 1"
364374 exitWith $ ExitFailure 19)
@@ -572,10 +582,6 @@ defaultWriterName x =
572582 ['.',y] | y `elem` ['1'..'9'] -> "man"
573583 _ -> "html"
574584
575−shiftHeaderLevels :: Int -> Block -> Block
576−shiftHeaderLevels shift (Header level inner) = Header (level + shift) inner
577−shiftHeaderLevels _ x = x
578−
579585main :: IO ()
580586main = do
581587
@@ -612,7 +618,7 @@ main = do
612618 , optBefore = befores
613619 , optAfter = afters
614620 , optTableOfContents = toc
615− , optHeaderShift = headerShift
621+ , optTransforms = transforms
616622 , optTemplate = template
617623 , optOutputFile = outputFile
618624 , optNumberSections = numberSections
@@ -766,9 +772,7 @@ main = do
766772
767773 doc <- fmap (reader startParserState . convertTabs . intercalate "\n") (readSources sources)
768774
769− let doc' = if headerShift > 1
770− then processWith (shiftHeaderLevels headerShift) doc
771− else doc
775+ let doc' = foldr ($) doc transforms
772776
773777 doc'' <- do
774778#ifdef _CITEPROC