git.iko.soy/typeable/pandoc
on master help sign in
Moved tabFilter to Shared.
ede0d80fiddlosopher
src/Text/Pandoc/Shared.hs+21
@@ -49,6 +49,7 @@ module Text.Pandoc.Shared (
49 wrapTeXIfNeeded,
49 wrapTeXIfNeeded,
50 BlockWrapper (..),
50 BlockWrapper (..),
51 wrappedBlocksToDoc,
51 wrappedBlocksToDoc,
52+ tabFilter,
52 -- * Parsing
53 -- * Parsing
53 (>>~),
54 (>>~),
54 anyLine,
55 anyLine,
@@ -285,6 +286,26 @@ wrappedBlocksToDoc = foldr addBlock empty
285 addBlock (Pad d) accum = d $$ text "" $$ accum
286 addBlock (Pad d) accum = d $$ text "" $$ accum
286 addBlock (Reg d) accum = d $$ accum
287 addBlock (Reg d) accum = d $$ accum
287
288
289+-- | Convert tabs to spaces and filter out DOS line endings.
290+-- Tabs will be preserved if tab stop is set to 0.
291+tabFilter :: Int -- ^ Tab stop
292+ -> String -- ^ Input
293+ -> String
294+tabFilter tabStop =
295+ let go _ [] = ""
296+ go _ ('\n':xs) = '\n' : go tabStop xs
297+ go _ ('\r':'\n':xs) = '\n' : go tabStop xs
298+ go _ ('\r':xs) = '\n' : go tabStop xs
299+ go spsToNextStop ('\t':xs) =
300+ if tabStop == 0
301+ then '\t' : go tabStop xs
302+ else replicate spsToNextStop ' ' ++ go tabStop xs
303+ go 1 (x:xs) =
304+ x : go tabStop xs
305+ go spsToNextStop (x:xs) =
306+ x : go (spsToNextStop - 1) xs
307+ in go tabStop
308+
288--
309--
289-- Parsing
310-- Parsing
290--
311--
src/pandoc.hs+5−22
@@ -32,7 +32,7 @@ writers.
32module Main where
32module Main where
33import Text.Pandoc
33import Text.Pandoc
34import Text.Pandoc.ODT
34import Text.Pandoc.ODT
35−import Text.Pandoc.Shared ( HTMLMathMethod (..), splitBy, ObfuscationMethod (..) )
35+import Text.Pandoc.Shared ( HTMLMathMethod (..), splitBy, tabFilter, ObfuscationMethod (..) )
36import Text.Pandoc.Highlighting ( languages )
36import Text.Pandoc.Highlighting ( languages )
37import System.Environment ( getArgs, getProgName, getEnvironment )
37import System.Environment ( getArgs, getProgName, getEnvironment )
38import System.Exit ( exitWith, ExitCode (..) )
38import System.Exit ( exitWith, ExitCode (..) )
@@ -131,8 +131,7 @@ writeDoc _ = prettyPandoc
131
131
132-- | Data structure for command line options.
132-- | Data structure for command line options.
133data Opt = Opt
133data Opt = Opt
134− { optPreserveTabs :: Bool -- ^ Convert tabs to spaces
135− , optTabStop :: Int -- ^ Number of spaces per tab
134+ { optTabStop :: Int -- ^ Number of spaces per tab
136 , optStandalone :: Bool -- ^ Include header, footer
135 , optStandalone :: Bool -- ^ Include header, footer
137 , optReader :: String -- ^ Reader format
136 , optReader :: String -- ^ Reader format
138 , optWriter :: String -- ^ Writer format
137 , optWriter :: String -- ^ Writer format
@@ -167,8 +166,7 @@ data Opt = Opt
167-- | Defaults for command-line options.
166-- | Defaults for command-line options.
168defaultOpts :: Opt
167defaultOpts :: Opt
169defaultOpts = Opt
168defaultOpts = Opt
170− { optPreserveTabs = False
171− , optTabStop = 4
169+ { optTabStop = 4
172 , optStandalone = False
170 , optStandalone = False
173 , optReader = "" -- null for default reader
171 , optReader = "" -- null for default reader
174 , optWriter = "" -- null for default writer
172 , optWriter = "" -- null for default writer
@@ -229,7 +227,7 @@ options =
229
227
230 , Option "p" ["preserve-tabs"]
228 , Option "p" ["preserve-tabs"]
231 (NoArg
229 (NoArg
232− (\opt -> return opt { optPreserveTabs = True }))
230+ (\opt -> return opt { optTabStop = 0 }))
233 "" -- "Preserve tabs instead of converting to spaces"
231 "" -- "Preserve tabs instead of converting to spaces"
234
232
235 , Option "" ["tab-stop"]
233 , Option "" ["tab-stop"]
@@ -519,8 +517,7 @@ main = do
519 -- thread option data structure through all supplied option actions
517 -- thread option data structure through all supplied option actions
520 opts <- foldl (>>=) (return defaultOpts') actions
518 opts <- foldl (>>=) (return defaultOpts') actions
521
519
522− let Opt { optPreserveTabs = preserveTabs
523− , optTabStop = tabStop
520+ let Opt { optTabStop = tabStop
524 , optStandalone = standalone
521 , optStandalone = standalone
525 , optReader = readerName
522 , optReader = readerName
526 , optWriter = writerName
523 , optWriter = writerName
@@ -581,20 +578,6 @@ main = do
581 Just cols -> read cols
578 Just cols -> read cols
582 Nothing -> stateColumns defaultParserState
579 Nothing -> stateColumns defaultParserState
583
580
584− let tabFilter _ [] = ""
585− tabFilter _ ('\n':xs) = '\n' : tabFilter tabStop xs
586− -- remove DOS line endings
587− tabFilter _ ('\r':'\n':xs) = '\n' : tabFilter tabStop xs
588− tabFilter _ ('\r':xs) = '\n' : tabFilter tabStop xs
589− tabFilter spsToNextStop ('\t':xs) =
590− if preserveTabs
591− then '\t' : tabFilter tabStop xs
592− else replicate spsToNextStop ' ' ++ tabFilter tabStop xs
593− tabFilter 1 (x:xs) =
594− x : tabFilter tabStop xs
595− tabFilter spsToNextStop (x:xs) =
596− x : tabFilter (spsToNextStop - 1) xs
597−
598 let standalone' = (standalone && not strict) || isNonTextOutput writerName'
581 let standalone' = (standalone && not strict) || isNonTextOutput writerName'
599
582
600#ifdef _CITEPROC
583#ifdef _CITEPROC