diff --git a/MDict.hs b/MDict.hs
index 0bd271a..ec4fc26 100644
--- a/MDict.hs
+++ b/MDict.hs
@@ -34,18 +34,22 @@ import qualified Data.ByteString.Char8 as BSC
import Data.Word (Word64)
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
+import qualified Data.Conduit.Combinators as CC
+import Data.Conduit
+import Conduit
import Data.Char (toLower)
import System.FilePath (takeExtension)
import Text.HTML.Scalpel
import Data.Maybe (fromMaybe)
-import Data.List (isInfixOf, intercalate)
+import Data.List (isInfixOf, intercalate, foldl')
import Data.List.Split (splitOn)
import System.Directory (doesFileExist)
import System.FilePath ((>), takeDirectory)
import Control.Monad
+import Control.Applicative
import System.FilePath (replaceExtension)
import Control.DeepSeq (NFData, deepseq)
-import Wazahs
+import Data.Bool (Bool)
-- C-compatible struct
data SimpleKeyItem = SimpleKeyItem
@@ -237,54 +241,62 @@ listAllKeys dict = do
-- Media related functions:
--- | Replace all local sources with base64 content from .mdd
+findLocalImages :: String -> [String]
+findLocalImages html =
+ let urlsRaw = scrapeStringLike html $ chroots "img" $ attr "src" anySelector
+ allUrls = fromMaybe [] urlsRaw
+ in filter isLocal allUrls
+
+findcss :: String -> [String]
+findcss html =
+ let urlsRaw = scrapeStringLike html $ chroots "link" $ liftA2 (,) (attr "rel" anySelector) (attr "href" anySelector) >>= \(rel, href) -> guard (rel == "stylesheet") >> pure href
+ allUrls = fromMaybe [] urlsRaw
+ in filter isLocal allUrls
+
+isLocal :: String -> Bool
+isLocal url = not ("://" `isInfixOf` url)
+
+-- Takes a list of paths, looks them up in the MDD, returns pairs of (Path, Base64)
+fetchResources :: FilePath -> [String] -> IO [(String, String)]
+fetchResources mddFile paths = do
+ mapM (\path -> do
+ let query = "\\" ++ map slashToBack path
+
+ base64 <- lookupMedia mddFile query
+
+ return (path, base64)
+ ) paths
+
+-- Replaces every occurrence of 'path' with 'base64' in the HTML
+injectResources :: String -> [(String, String)] -> String
+injectResources =
+ foldl' applyReplacement
+ where
+ applyReplacement currentHtml (path, base64) =
+ if null base64
+ then currentHtml
+ else replaceSrc ["src", "href"] path base64 currentHtml
+
replaceMedia :: FilePath -> String -> IO String
replaceMedia mdxFile html = do
let mddFile = replaceExtension mdxFile ".mdd"
mdxDir = takeDirectory mdxFile
- -- Phase 1: Replace
media
- let urlsRaw = scrapeStringLike html $ chroots "img" $ attr "src" anySelector
- urls = fromMaybe [] urlsRaw
- localPaths = filter (not . isInfixOf "://") urls
- html' <- foldM (replaceOne mddFile) html localPaths
-
- -- Phase 2: Handle CSS
- let cssRaw = scrapeStringLike html' $ chroots "link" $ do
- rel <- attr "rel" anySelector
- href <- attr "href" anySelector
- if rel == "stylesheet" then return href else fail "not css"
- cssFiles = fromMaybe [] cssRaw
- localCssFiles = filter (not . isInfixOf "://") cssFiles
+ -- Get all CSS and HTML paths
+ let allPaths = findLocalImages html ++ findcss html
-- Lookup each CSS in the dictionary or read from local file
- cssBlocks <- mapM (\css -> do
- let localPath = mdxDir > css
- exists <- doesFileExist localPath
- if exists
- then readFile localPath
- else lookupMedia mddFile css
- ) localCssFiles
-
- let cssTag = concatMap (\c -> if null c then "" else "") cssBlocks
-
- -- Inject all CSS into