@@ 64,7 64,7 @@ executable rhapsode
html-conduit, xml-conduit, text, containers, data-default-class,
network-uri,
stylist >= 1.1, css-syntax, xml-conduit-stylist, scientific,
- async, hurl >= 1.1.0.0, filepath
+ async, hurl >= 1.2.0.0, filepath, temporary
-- Directories containing source files.
hs-source-dirs: src
@@ 15,6 15,7 @@ import Control.Concurrent.Async
import System.IO
import System.Environment
import System.Directory
+import System.IO.Temp
import Data.List
import Data.Default.Class
import Data.Maybe (fromMaybe)
@@ 76,14 77,28 @@ evalInput http ("-x", url) = fetchDocument http ["text/xml", "text/html", "text/
evalInput http ("-xml", url) = fetchDocument http ["text/xml", "text/html", "text/plain"] url
evalInput _ (flag, _) = error ("Unsupported input flag " ++ flag)
-fetchDocument http mime uri = fetchURL http mime uri >>= parseDocument
-parseDocument ("text/html", Left text) = return $ HTML.parseLT $ fromStrict text
-parseDocument ("text/html", Right bytes) = return $ HTML.parseLBS bytes
-parseDocument ("text/plain", Left text) = return $ docForText text
-parseDocument ("text/plain", Right bytes) = return $ docForText $ decodeUtf8 $ B.toStrict bytes
-parseDocument (_, Left text) | Right doc <- XML.parseText def $ fromStrict text = return doc
-parseDocument (_, Right bytes) | Right doc <- XML.parseLBS def bytes = return doc
-parseDocument (mime, _) = return $ docForText $ Txt.concat ["Unsupported MIMEtype ", Txt.pack mime]
+fetchDocument http mime uri = fetchURL http mime uri >>= parseDocument http
+parseDocument _ ("text/html", Left text) = return $ HTML.parseLT $ fromStrict text
+parseDocument _ ("text/html", Right bytes) = return $ HTML.parseLBS bytes
+parseDocument _ ("text/plain", Left text) = return $ docForText text
+parseDocument _ ("text/plain", Right bytes) = return $ docForText $ decodeUtf8 $ B.toStrict bytes
+parseDocument _ ("application/xhtml+xml", Left text) | Right doc <- XML.parseText def $ fromStrict text = return doc
+ | otherwise = return $ docForText "Unreadable webpage!"
+parseDocument _ ("application/xhtml+xml", Right bytes) | Right doc <- XML.parseLBS def bytes = return doc
+ | otherwise = return $ docForText "Unreadable webpage!"
+parseDocument session (mime, download) = do
+ localURI <- withSystemTempFile "rhapsode-download" $ writeDownloadToFile download
+ result <- dispatchByMIME session mime localURI
+ case result of
+ Just text -> return $ docForText $ Txt.pack text
+ Nothing -> parseDocument session ("application/xhtml+xml", download)
+
+writeDownloadToFile (Left text) file handle = do
+ hPutStr handle $ Txt.unpack text
+ return $ URI "file:" Nothing file "" ""
+writeDownloadToFile (Right bytes) file handle = do
+ B.hPut handle bytes
+ return $ URI "file:" Nothing file "" ""
docForText txt = XML.Document {
XML.documentPrologue = XML.Prologue [] Nothing [],
@@ 94,13 109,3 @@ docForText txt = XML.Document {
},
XML.documentEpilogue = []
}
-
-newFilePath filepath count = do
- let realpath = filepath ++ show count
- exists <- doesPathExist realpath
- if exists then newFilePath filepath $ count + 1 else return realpath
-
-downloadsDir = do
- downloads <- lookupEnv "XDG_DOWNLOAD_DIR"
- home <- getHomeDirectory
- return $ fromMaybe (home </> "Downloads") downloads