git.iko.soy/typeable/pandoc
on master help sign in
Integrated the docx reader into the main pandoc program.

Changes also include generalising the types of reader allowed. The mechanism now mimics the more general output mechanism.

commit3bc818d2d3079f1d31dbb409f839585a32f26f6e authormpickering <matthewtpickering@gmail.com> dateSun 15 Jun 2014, 13:38 (12 years ago) parent7f4668d
2 files changed+46−23
pandoc.hs+10−3 src/Text/Pandoc.hs+36−20
pandoc.hs+10−3
@@ -858,6 +858,7 @@ defaultReaderName fallback (x:xs) =
858858 ".textile" -> "textile"
859859 ".native" -> "native"
860860 ".json" -> "json"
861+ ".docx" -> "docx"
861862 _ -> defaultReaderName fallback xs
862863
863864-- Returns True if extension of first source is .lhs
@@ -1158,15 +1159,21 @@ main = do
11581159 Left e -> throwIO e
11591160 Right (bs,_) -> return $ UTF8.toString bs
11601161
1162+ let readFiles [] = error "Cannot read archive from stdin"
1163+ readFiles (x:_) = B.readFile x
1164+
11611165 let convertTabs = tabFilter (if preserveTabs then 0 else tabStop)
11621166
11631167 let handleIncludes' = if readerName' == "latex" || readerName' == "latex+lhs"
11641168 then handleIncludes
11651169 else return
11661170
1167− doc <- readSources sources >>=
1168− handleIncludes' . convertTabs . intercalate "\n" >>=
1169− reader readerOpts
1171+ doc <- case reader of
1172+ StringReader r->
1173+ readSources sources >>=
1174+ handleIncludes' . convertTabs . intercalate "\n" >>=
1175+ r readerOpts
1176+ ByteStringReader r -> readFiles sources >>= r readerOpts
11701177
11711178
11721179 let doc0 = M.foldWithKey setMeta doc metadata
src/Text/Pandoc.hs+36−20
@@ -62,6 +62,8 @@ module Text.Pandoc
6262 , readers
6363 , writers
6464 -- * Readers: converting /to/ Pandoc format
65+ , Reader (..)
66+ , readDocX
6567 , readMarkdown
6668 , readMediaWiki
6769 , readRST
@@ -125,6 +127,7 @@ import Text.Pandoc.Readers.HTML
125127import Text.Pandoc.Readers.Textile
126128import Text.Pandoc.Readers.Native
127129import Text.Pandoc.Readers.Haddock
130+import Text.Pandoc.Readers.DocX
128131import Text.Pandoc.Writers.Native
129132import Text.Pandoc.Writers.Markdown
130133import Text.Pandoc.Writers.RST
@@ -192,24 +195,34 @@ markdown o s = do
192195 mapM_ warn warnings
193196 return doc
194197
198+data Reader = StringReader (ReaderOptions -> String -> IO Pandoc)
199+ | ByteStringReader (ReaderOptions -> BL.ByteString -> IO Pandoc)
200+
201+mkStringReader :: (ReaderOptions -> String -> Pandoc) -> Reader
202+mkStringReader r = StringReader (\o s -> return $ r o s)
203+
204+mkBSReader :: (ReaderOptions -> BL.ByteString -> Pandoc) -> Reader
205+mkBSReader r = ByteStringReader (\o s -> return $ r o s)
206+
195207-- | Association list of formats and readers.
196−readers :: [(String, ReaderOptions -> String -> IO Pandoc)]
197−readers = [ ("native" , \_ s -> return $ readNative s)
198− ,("json" , \o s -> return $ readJSON o s)
199− ,("markdown" , markdown)
200− ,("markdown_strict" , markdown)
201− ,("markdown_phpextra" , markdown)
202− ,("markdown_github" , markdown)
203− ,("markdown_mmd", markdown)
204− ,("rst" , \o s -> return $ readRST o s)
205− ,("mediawiki" , \o s -> return $ readMediaWiki o s)
206− ,("docbook" , \o s -> return $ readDocBook o s)
207− ,("opml" , \o s -> return $ readOPML o s)
208− ,("org" , \o s -> return $ readOrg o s)
209− ,("textile" , \o s -> return $ readTextile o s) -- TODO : textile+lhs
210− ,("html" , \o s -> return $ readHtml o s)
211− ,("latex" , \o s -> return $ readLaTeX o s)
212− ,("haddock" , \o s -> return $ readHaddock o s)
208+readers :: [(String, Reader)]
209+readers = [ ("native" , StringReader $ \_ s -> return $ readNative s)
210+ ,("json" , mkStringReader readJSON )
211+ ,("markdown" , StringReader markdown)
212+ ,("markdown_strict" , StringReader markdown)
213+ ,("markdown_phpextra" , StringReader markdown)
214+ ,("markdown_github" , StringReader markdown)
215+ ,("markdown_mmd", StringReader markdown)
216+ ,("rst" , mkStringReader readRST )
217+ ,("mediawiki" , mkStringReader readMediaWiki)
218+ ,("docbook" , mkStringReader readDocBook)
219+ ,("opml" , mkStringReader readOPML)
220+ ,("org" , mkStringReader readOrg)
221+ ,("textile" , mkStringReader readTextile) -- TODO : textile+lhs
222+ ,("html" , mkStringReader readHtml)
223+ ,("latex" , mkStringReader readLaTeX)
224+ ,("haddock" , mkStringReader readHaddock)
225+ ,("docx" , mkBSReader readDocX)
213226 ]
214227
215228data Writer = PureStringWriter (WriterOptions -> Pandoc -> String)
@@ -280,14 +293,17 @@ getDefaultExtensions "textile" = Set.fromList [Ext_auto_identifiers, Ext
280293getDefaultExtensions _ = Set.fromList [Ext_auto_identifiers]
281294
282295-- | Retrieve reader based on formatSpec (format+extensions).
283−getReader :: String -> Either String (ReaderOptions -> String -> IO Pandoc)
296+getReader :: String -> Either String Reader
284297getReader s =
285298 case parseFormatSpec s of
286299 Left e -> Left $ intercalate "\n" $ [m | Message m <- errorMessages e]
287− Right (readerName, setExts) ->
300+ Right (readerName, setExts) ->
288301 case lookup readerName readers of
289302 Nothing -> Left $ "Unknown reader: " ++ readerName
290− Just r -> Right $ \o ->
303+ Just (StringReader r) -> Right $ StringReader $ \o ->
304+ r o{ readerExtensions = setExts $
305+ getDefaultExtensions readerName }
306+ Just (ByteStringReader r) -> Right $ ByteStringReader $ \o ->
291307 r o{ readerExtensions = setExts $
292308 getDefaultExtensions readerName }
293309