multifile 0.1.0.2 → 0.1.0.3
raw patch · 2 files changed
+65/−12 lines, 2 filesdep +transformersdep −optparse-applicativedep ~directory
Dependencies added: transformers
Dependencies removed: optparse-applicative
Dependency ranges changed: directory
Files
- multifile.cabal +2/−2
- src/Main.hs +63/−10
multifile.cabal view
@@ -10,7 +10,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 0.1.0.2+version: 0.1.0.3 -- A short (one-line) description of the package. synopsis: create many files from one@@ -60,7 +60,7 @@ -- other-extensions: -- Other library packages from which modules are imported.- build-depends: base >=4.9 && <4.10 , HaXml < 10000 , directory < 10000, optparse-applicative < 10000 , pretty <10000+ build-depends: base >=4.9 && <4.10 , HaXml < 10000 , directory >= 1.2.7 , pretty <10000,transformers <10000 -- Directories containing source files. hs-source-dirs: src
src/Main.hs view
@@ -3,6 +3,7 @@ import System.Environment import System.IO import Text.XML.HaXml+import Text.XML.HaXml.Escape import Text.XML.HaXml.XmlContent.Haskell import Extsubset@@ -10,20 +11,73 @@ import Control.Monad import System.Directory -import Options.Applicative- import Text.PrettyPrint+import Data.Maybe+import Data.Either -create' xs = do- files <- forM xs $ \filePath -> do- content <- readFile filePath- return ( File (File_Attrs filePath) content )- return (render $ htmlprint $ toContents $ Multifile files)+import Control.Monad.Trans.Except+import Control.Monad.Trans.Class +import Data.Char -create xs = create' xs >>= putStr+isRegularPath :: FilePath -> Bool +isRegularPath f = f /= "." && f /= ".." - -- data Args = Args {+isRegularDirectory f = fmap (== isRegularPath f) (doesDirectoryExist f) +doesPathExist' f = liftM2 (||) (isRegularDirectory f) (doesFileExist f)++create'' dirStack xs = do+ files <- forM (filter isRegularPath xs) $ \filePath -> do+ let filePath' = dirStack++filePath+ properFile <- lift $ doesFileExist filePath'+ properDir <- lift $ doesDirectoryExist filePath'+ if properDir then do+ filePaths <- lift $ listDirectory filePath'+ files' <- create'' (dirStack ++ ((filter (/='/') filePath) ++ "/")) filePaths+ return files'+ else if properFile then do+ content <- lift $ readFile filePath'+ return [File (File_Attrs filePath') content ]+ else + throwE filePath'+ return (concat files)++create' files =runExceptT $ do + files' <- create'' [] files+ return $ (render $ htmlprint $ map myFun $ toContents $ Multifile files')+++s = xmlEscapeContent stdXmlEscaper ++create xs = create' xs >>= \x -> case x of + (Left x) -> putStrLn ("unknown file "++x)+ (Right x) -> putStr x++cdatafy x = "<![CDATA[" ++ x ++ "]]>"+++g = + (\ ch ->+ let+ i = ord ch+ in+ i < 10 || (10<i && i<32) || i >= 127 ||+ case ch of+ '\'' -> True+ '\"' -> True+ '&' -> True+ '<' -> True+ '>' -> True+ _ -> False+ )++myFun (CString a b c) | any g b = CString a (cdatafy b) c+ | otherwise = CString a b c+myFun (CElem e i) = CElem (myFun' e) i+myFun x = x++myFun' (Elem a b cs) = Elem a b (map myFun cs)+ dir x = getDirectoryContents x >>= create main :: IO ()@@ -38,7 +92,6 @@ where z ("-create":xs) = create xs z ("-c":xs) = create xs- z ("-dir":x:[]) = dir x z _ = putStr "unknown usage" processFiles (Multifile xs) = mapM_ processFile xs