spdx-0.1.0.0: dev/Main.hs
module Main (main) where
import Control.Applicative
import Data.List
import Data.Maybe
import Data.Traversable
import Text.XML.Light
simplify :: Element -> [[[String]]]
simplify el =
let worksheets = filter isWorksheetElement $ childrenElements el
Just tables = traverse tableFromWorksheet worksheets
in map tableElements tables
toElem :: Content -> Maybe Element
toElem (Elem e) = Just e
toElem _ = Nothing
isElement :: String -> Element -> Bool
isElement name = (name ==) . qName . elName
isWorksheetElement :: Element -> Bool
isWorksheetElement = isElement "Worksheet"
childrenElements :: Element -> [Element]
childrenElements = mapMaybe toElem . elContent
tableFromWorksheet :: Element -> Maybe Element
tableFromWorksheet = listToMaybe . filter (isElement "Table") . childrenElements
textContent :: Content -> Maybe String
textContent (Text t) = Just $ cdData t
textContent _ = Nothing
extractData :: Element -> String
extractData el = maybe "" id $ do dataEl <- listToMaybe . filter (isElement "Data") . childrenElements $ el
textEl <- listToMaybe $ elContent dataEl
text <- textContent textEl
return text
tableElements :: Element -> [[String]]
tableElements = map cells . filter (isElement "Row") . childrenElements
where cells = map extractData . filter (isElement "Cell") . childrenElements
extractLicense :: [String] -> (String, String, Bool)
extractLicense row = (row !! 1, row !! 0, (row !! 4) == "YES")
main :: IO ()
main = do
contents <- readFile "data/spdx_licenselist.xml"
let Just el = parseXMLDoc contents
let parsed = simplify el
let licenses = filter (not . null) $ parsed !! 0
f `mapM_` (sort $ map extractLicense licenses)
where f (l, n, osi) = putStrLn $ " , (LicenseId " ++ show l ++ ", " ++ show n ++ ", " ++ show osi ++ ")"