From 8b0968b2054d3bb8d90b5ac056727f7c2ebeaed3 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Tue, 11 Dec 2018 18:10:48 +0300 Subject: (* HUGE *) Use nixpkgs overlays --- pkgs/xinclude2nix/xinclude2nix.hs | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 pkgs/xinclude2nix/xinclude2nix.hs (limited to 'pkgs/xinclude2nix/xinclude2nix.hs') diff --git a/pkgs/xinclude2nix/xinclude2nix.hs b/pkgs/xinclude2nix/xinclude2nix.hs new file mode 100644 index 0000000..369f103 --- /dev/null +++ b/pkgs/xinclude2nix/xinclude2nix.hs @@ -0,0 +1,49 @@ +{-# LANGUAGE Arrows #-} + +{- + Takes a list of XML files + Parses them for xi:xinclude elements + Extract included files + Prints list of included files +-} +module Main + ( main + ) where + +import Data.List (isPrefixOf, stripPrefix) +import Data.Maybe (fromMaybe) +import System.Environment (getArgs) +import Text.XML.HXT.Core + ((>>>), deep, getAttrValue, hasAttr, hasName, isElem, readDocument, + returnA, runX) + +getXIncludes :: FilePath -> IO [String] +getXIncludes xmlFileName = + runX $ + readDocument [] xmlFileName >>> + deep (isElem >>> hasName "xi:include" >>> hasAttr "href") >>> + proc d -> + do href <- getAttrValue "href" -< d + returnA -< href + +getFiles :: [String] -> [String] +getFiles = map stripScheme . filter isFile + where + fileScheme = "file://" + isFile s = "/" `isPrefixOf` s || (fileScheme `isPrefixOf` s) + stripScheme u = fromMaybe u (stripPrefix fileScheme u) + +unique :: [String] -> [String] +unique [] = [] +unique (x:xs) + | x `elem` xs = unique xs + | otherwise = x : unique xs + +toNix :: [String] -> String +toNix ss = "[" ++ unwords (map show ss) ++ "]" + +main :: IO () +main = do + paths <- getArgs + includedFiles <- unique . getFiles . concat <$> mapM getXIncludes paths + putStrLn $ toNix includedFiles -- cgit v1.2.3