packages feed

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 ++ ")"