@@ -31,11 +31,12 @@ writers.
3131module Main where
3232import Text.Pandoc
3333import Text.Pandoc.UTF8
34+import Text.Pandoc.ODT
3435import Text.Pandoc.Shared ( joinWithSep, HTMLMathMethod (..) )
3536import Text.Pandoc.Highlighting ( languages )
3637import System.Environment ( getArgs, getProgName, getEnvironment )
3738import System.Exit ( exitWith, ExitCode (..) )
38−import System.FilePath ( takeExtension )
39+import System.FilePath ( takeExtension, takeDirectory )
3940import System.Console.GetOpt
4041import System.IO
4142import Data.Maybe ( fromMaybe )
@@ -82,6 +83,7 @@ writers = [("native" , (writeDoc, ""))
8283 ,("s5" , (writeS5String, defaultS5Header))
8384 ,("docbook" , (writeDocbook, defaultDocbookHeader))
8485 ,("opendocument" , (writeOpenDocument, defaultOpenDocumentHeader))
86+ ,("odt" , (writeOpenDocument, defaultOpenDocumentHeader))
8587 ,("latex" , (writeLaTeX, defaultLaTeXHeader))
8688 ,("context" , (writeConTeXt, defaultConTeXtHeader))
8789 ,("texinfo" , (writeTexinfo, ""))
@@ -92,6 +94,10 @@ writers = [("native" , (writeDoc, ""))
9294 ,("rtf" , (writeRTF, defaultRTFHeader))
9395 ]
9496
97+isNonTextOutput :: String -> Bool
98+isNonTextOutput "odt" = True
99+isNonTextOutput _ = False
100+
95101-- | Writer for Pandoc native format.
96102writeDoc :: WriterOptions -> Pandoc -> String
97103writeDoc _ = prettyPandoc
@@ -392,8 +398,7 @@ defaultWriterName x =
392398 ".texi" -> "texinfo"
393399 ".texinfo" -> "texinfo"
394400 ".db" -> "docbook"
395− ".xml" -> "docbook"
396− ".sgml" -> "docbook"
401+ ".odt" -> "odt"
397402 ['.',y] | y `elem` ['1'..'9'] -> "man"
398403 _ -> "html"
399404
@@ -478,10 +483,6 @@ main = do
478483 Just (w,h) -> return (w, h)
479484 Nothing -> error ("Unknown writer: " ++ writerName')
480485
481− output <- if (outputFile == "-")
482− then return stdout
483− else openFile outputFile WriteMode
484−
485486 environment <- getEnvironment
486487 let columns = case lookup "COLUMNS" environment of
487488 Just cols -> read cols
@@ -501,11 +502,13 @@ main = do
501502 tabFilter spsToNextStop (x:xs) =
502503 x:(tabFilter (spsToNextStop - 1) xs)
503504
505+ let standalone' = (standalone && not strict) || writerName' == "odt"
506+
504507 let startParserState =
505508 defaultParserState { stateParseRaw = parseRaw,
506509 stateTabStop = tabStop,
507510 stateSanitizeHTML = sanitize,
508− stateStandalone = standalone && (not strict),
511+ stateStandalone = standalone',
509512 stateSmart = smart || writerName' `elem`
510513 ["latex", "context"],
511514 stateColumns = columns,
@@ -519,16 +522,15 @@ main = do
519522 let header = (if (customHeader == "DEFAULT")
520523 then defaultHeader
521524 else customHeader) ++ csslink ++ includeHeader
522− let writerOptions = WriterOptions { writerStandalone = standalone &&
523− (not strict),
525+ let writerOptions = WriterOptions { writerStandalone = standalone',
524526 writerHeader = header,
525527 writerTitlePrefix = titlePrefix,
526528 writerTabStop = tabStop,
527529 writerTableOfContents = toc &&
528530 (not strict) &&
529− writerName/="s5",
531+ writerName' /= "s5",
530532 writerHTMLMathMethod = mathMethod,
531− writerS5 = (writerName=="s5"),
533+ writerS5 = (writerName' == "s5"),
532534 writerIgnoreNotes = False,
533535 writerIncremental = incremental,
534536 writerNumberSections = numberSections,
@@ -538,11 +540,25 @@ main = do
538540 writerReferenceLinks = referenceLinks,
539541 writerWrapText = wrap }
540542
541− (readSources sources) >>= (hPutStrLn output . toUTF8 .
543+ let writeOutput = if writerName' == "odt"
544+ then if outputFile == "-"
545+ then \_ -> do
546+ hPutStrLn stderr ("Error: Cannot write " ++ writerName ++
547+ " output to stdout.\n" ++
548+ "Specify an output file using the -o option.")
549+ exitWith $ ExitFailure 5
550+ else let sourceDirRelative = if null sources
551+ then ""
552+ else takeDirectory (head sources)
553+ in saveOpenDocumentAsODT outputFile sourceDirRelative
554+ else if outputFile == "-"
555+ then putStrLn
556+ else writeFile outputFile . (++ "\n")
557+
558+ (readSources sources) >>= writeOutput . toUTF8 .
542559 (writer writerOptions) .
543560 (reader startParserState) . tabFilter tabStop .
544− fromUTF8 . (joinWithSep "\n")) >>
545− hClose output
561+ fromUTF8 . (joinWithSep "\n")
546562
547563 where
548564 readSources [] = mapM readSource ["-"]