git.iko.soy/typeable/pandoc
on master help sign in
Text.Pandoc.App: improved detection of format based on extension.

We now ensure that if someone tries to convert a file for a format that has a pandoc writer but not a reader, it won't just default to markdown.

commit563b1011b571db79008236ab9b8e6ff699ab764c authorJohn MacFarlane <jgm@berkeley.edu> dateThu 1 Nov 2018, 21:24 (8 years ago) parente10d5b3
1 file changed+66−83
src/Text/Pandoc/App.hs+66−83
src/Text/Pandoc/App.hs+66−83
@@ -215,19 +215,22 @@ convertWithOpts opts = do
215215 Just _ -> return $ optDataDir opts
216216
217217 -- assign reader and writer based on options and filenames
218− let readerName = fromMaybe ( defaultReaderName
219− (if any isURI sources
220− then "html"
221− else "markdown") sources) (optReader opts)
222−
223− let nonPdfWriterName Nothing = defaultWriterName outputFile
224− nonPdfWriterName (Just x) = x
218+ let readerName = case optReader opts of
219+ Just f -> f
220+ Nothing -> formatFromFilePaths fallback sources
221+ where fallback = if any isURI sources
222+ then "html"
223+ else "markdown"
225224
226225 let pdfOutput = map toLower (takeExtension outputFile) == ".pdf"
226+
227227 (writerName, maybePdfProg) <-
228228 if pdfOutput
229229 then pdfWriterAndProg (optWriter opts) (optPdfEngine opts)
230− else return (nonPdfWriterName $ optWriter opts, Nothing)
230+ else case optWriter opts of
231+ Nothing ->
232+ return (formatFromFilePaths "html" [outputFile], Nothing)
233+ Just f -> return (f, Nothing)
231234
232235 let format = map toLower $ baseWriterName
233236 $ takeFileName writerName -- in case path to lua script
@@ -708,82 +711,62 @@ readMetaValue s = case YAML.decodeStrict (UTF8.fromString s) of
708711 -> MetaBool b
709712 _ -> MetaString s
710713
711−-- Determine default reader based on source file extensions
712−defaultReaderName :: String -> [FilePath] -> String
713−defaultReaderName fallback [] = fallback
714−defaultReaderName fallback (x:xs) =
715− case takeExtension (map toLower x) of
716− ".xhtml" -> "html"
717− ".html" -> "html"
718− ".htm" -> "html"
719− ".md" -> "markdown"
720− ".markdown" -> "markdown"
721− ".muse" -> "muse"
722− ".tex" -> "latex"
723− ".latex" -> "latex"
724− ".ltx" -> "latex"
725− ".rst" -> "rst"
726− ".org" -> "org"
727− ".lhs" -> "markdown+lhs"
728− ".db" -> "docbook"
729− ".opml" -> "opml"
730− ".wiki" -> "mediawiki"
731− ".dokuwiki" -> "dokuwiki"
732− ".textile" -> "textile"
733− ".native" -> "native"
734− ".json" -> "json"
735− ".docx" -> "docx"
736− ".t2t" -> "t2t"
737− ".epub" -> "epub"
738− ".odt" -> "odt"
739− ".pdf" -> "pdf" -- so we get an "unknown reader" error
740− ".doc" -> "doc" -- so we get an "unknown reader" error
741− ".fb2" -> "fb2"
742− ['.',y] | y `elem` ['1'..'9'] -> "man"
743− _ -> defaultReaderName fallback xs
744−
745−-- Determine default writer based on output file extension
746−defaultWriterName :: FilePath -> String
747−defaultWriterName "-" = "html" -- no output file
748−defaultWriterName x =
714+-- Determine default reader based on source file extensions.
715+formatFromFilePaths :: String -> [FilePath] -> String
716+formatFromFilePaths fallback [] = fallback
717+formatFromFilePaths fallback (x:xs) =
718+ case formatFromFilePath x of
719+ Just f -> f
720+ Nothing -> formatFromFilePaths fallback xs
721+
722+-- Determine format based on file extension
723+formatFromFilePath :: FilePath -> Maybe String
724+formatFromFilePath x =
749725 case takeExtension (map toLower x) of
750− "" -> "markdown" -- empty extension
751− ".tex" -> "latex"
752− ".latex" -> "latex"
753− ".ltx" -> "latex"
754− ".context" -> "context"
755− ".ctx" -> "context"
756− ".rtf" -> "rtf"
757− ".rst" -> "rst"
758− ".s5" -> "s5"
759− ".native" -> "native"
760− ".json" -> "json"
761− ".txt" -> "markdown"
762− ".text" -> "markdown"
763− ".md" -> "markdown"
764− ".muse" -> "muse"
765− ".markdown" -> "markdown"
766− ".textile" -> "textile"
767− ".lhs" -> "markdown+lhs"
768− ".texi" -> "texinfo"
769− ".texinfo" -> "texinfo"
770− ".db" -> "docbook"
771− ".odt" -> "odt"
772− ".docx" -> "docx"
773− ".epub" -> "epub"
774− ".org" -> "org"
775− ".asciidoc" -> "asciidoc"
776− ".adoc" -> "asciidoc"
777− ".fb2" -> "fb2"
778− ".opml" -> "opml"
779− ".icml" -> "icml"
780− ".tei.xml" -> "tei"
781− ".tei" -> "tei"
782− ".ms" -> "ms"
783− ".roff" -> "ms"
784− ".pptx" -> "pptx"
785− ['.',y] | y `elem` ['1'..'9'] -> "man"
786− _ -> "html"
726+ ".adoc" -> Just "asciidoc"
727+ ".asciidoc" -> Just "asciidoc"
728+ ".context" -> Just "context"
729+ ".ctx" -> Just "context"
730+ ".db" -> Just "docbook"
731+ ".doc" -> Just "doc" -- so we get an "unknown reader" error
732+ ".docx" -> Just "docx"
733+ ".dokuwiki" -> Just "dokuwiki"
734+ ".epub" -> Just "epub"
735+ ".fb2" -> Just "fb2"
736+ ".htm" -> Just "html"
737+ ".html" -> Just "html"
738+ ".icml" -> Just "icml"
739+ ".json" -> Just "json"
740+ ".latex" -> Just "latex"
741+ ".lhs" -> Just "markdown+lhs"
742+ ".ltx" -> Just "latex"
743+ ".markdown" -> Just "markdown"
744+ ".md" -> Just "markdown"
745+ ".ms" -> Just "ms"
746+ ".muse" -> Just "muse"
747+ ".native" -> Just "native"
748+ ".odt" -> Just "odt"
749+ ".opml" -> Just "opml"
750+ ".org" -> Just "org"
751+ ".pdf" -> Just "pdf" -- so we get an "unknown reader" error
752+ ".pptx" -> Just "pptx"
753+ ".roff" -> Just "ms"
754+ ".rst" -> Just "rst"
755+ ".rtf" -> Just "rtf"
756+ ".s5" -> Just "s5"
757+ ".t2t" -> Just "t2t"
758+ ".tei" -> Just "tei"
759+ ".tei.xml" -> Just "tei"
760+ ".tex" -> Just "latex"
761+ ".texi" -> Just "texinfo"
762+ ".texinfo" -> Just "texinfo"
763+ ".text" -> Just "markdown"
764+ ".textile" -> Just "textile"
765+ ".txt" -> Just "markdown"
766+ ".wiki" -> Just "mediawiki"
767+ ".xhtml" -> Just "html"
768+ ['.',y] | y `elem` ['1'..'9'] -> Just "man"
769+ _ -> Nothing
787770
788771-- Transformations of a Pandoc document post-parsing:
789772