ADD Progress on XML parsing (not finished yet)
authorGreg Burri <greg.burri@gmail.com>
Sun, 3 May 2009 20:41:05 +0000 (22:41 +0200)
committerGreg Burri <greg.burri@gmail.com>
Sun, 3 May 2009 20:41:05 +0000 (22:41 +0200)
ADD Sample for the future XML format

.gitignore [new file with mode: 0644]
src/Pompage.hs
start.sh
xml/sample.xml [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..666fa37
--- /dev/null
@@ -0,0 +1,3 @@
+*.hi
+*.o
+\#*
\ No newline at end of file
index e3066f2..2316f3f 100644 (file)
@@ -1,3 +1,5 @@
+{-# LANGUAGE TypeSynonymInstances, OverlappingInstances, NoMonomorphismRestriction, ScopedTypeVariables #-}
+
 import System.IO (readFile, FilePath(..))
 import System.Directory (
      getDirectoryContents
@@ -8,13 +10,14 @@ import System.Environment (getArgs, getProgName)
 import Data.List
 import Text.Printf (printf)
 import Text.XML.Light
+import qualified Text.XML.Light.Cursor as C
 import Control.Monad (foldM)
+import Control.Exception (SomeException(..), handle, bracket)
 
 type Movies = [Movie]
 
 data Movie = Movie {
-     movieFiles :: [FilePath]
-   , movieId :: Int
+     movieId :: Int
    , movieTitle :: String
    , movieYear :: Maybe Int
    , movieDirectors :: [String]
@@ -25,11 +28,15 @@ data Movie = Movie {
    , moviePressRating :: Maybe Int
    , movieGenres :: [String]
    , movieSynopsis :: String
-   , movieBudget :: Int
+   , movieBudget :: Maybe Int
    , movieBudgetUnit :: String
+   , movieFiles :: [FilePath]
    , movieUrl :: String
 } deriving (Show)
 
+emptyMovie = Movie 0 "no title" Nothing [] [] []
+   Nothing Nothing Nothing [] "" Nothing "" [] ""
+
 data Arg = XML | MovieDir deriving (Show, Eq)
 type Args = [(Arg, String)]
 
@@ -44,7 +51,7 @@ main = do
          paths <- moviePaths dir
          movies <- readXMLFile xmlFile
          print movies
-         print paths
+         --print paths
 
 coversDir = "../img/covers"
 movieExtenstions = ["avi", "mkv", "rmvb", "ogm", "divx"]
@@ -97,7 +104,6 @@ filePaths predicat baseDir = do
             []
             (contents \\ ["..", "."])
 
-
 readXMLFile :: FilePath -> IO Movies
 readXMLFile file = do
    content <- readFile file
@@ -111,13 +117,56 @@ readXMLFile file = do
       (elChildren root)
 
 elementXMLToMovie :: Element -> Maybe Movie
-elementXMLToMovie elem = undefined
-{-
-findAttr (QName "id" Nothing Nothing) elem of
-            Nothing -> acc
-            Just id ->
--}
+elementXMLToMovie elem =
+   Just (emptyMovie, C.fromElement elem) >>?
+   (\(m, c) ->
+      case C.current c of
+         Elem elem ->
+            case findAttr (simpleQName "id") elem of
+            Nothing -> Nothing
+            Just id -> Just (m { movieId = read id :: Int }, c)
+         otherwise -> Nothing) >>?
+   (\(m, c) ->
+      case firstChildElement c of
+         Just (elem, c') -> Just (m { movieTitle = strContent elem }, c')
+         otherwise -> Nothing) >>?
+   (\(m, c) ->
+      case nextSibilingElement c of
+         Just (elem, c') -> Just m { movieYear =  intElement elem }
+         otherwise -> Nothing)
+
+-- A bit naive
+(>>?) :: Maybe alpha -> (alpha -> Maybe beta) -> Maybe beta
+Nothing >>? _ = Nothing
+Just v >>? f = f v
+
+-- Some XML helper functions
+simpleQName name = QName name Nothing Nothing
+firstChildElement :: C.Cursor -> Maybe (Element, C.Cursor)
+firstChildElement c =
+   case C.firstChild c of
+      Just c' ->
+         case C.current c' of
+            Elem elem -> Just (elem, c')
+            otherwise -> nextSibilingElement c'
+      otherwise -> Nothing
 
+nextSibilingElement :: C.Cursor -> Maybe (Element, C.Cursor)
+nextSibilingElement c =
+   case C.right c of
+      Just c' ->
+         case C.current c' of
+            Elem elem -> Just (elem, c')
+            otherwise -> nextSibilingElement c'
+      Nothing -> Nothing
+
+-- Try to cast an element content to an Int.
+intElement :: Element -> Maybe Int
+intElement elem =
+   if content == []
+      then Nothing
+      else Just (read content :: Int)
+   where content = strContent elem
 
 writeXMLFile :: Movies -> FilePath -> IO ()
 writeXMLFile movies file = undefined
index a501312..5b89fa7 100755 (executable)
--- a/start.sh
+++ b/start.sh
@@ -4,4 +4,4 @@
 #  -d <Movies dir> -x <XML file>
 #  
 cd src
-runhaskell Pompage.hs -d /home/gburri/mininux/fat/Films -x ../xml/test.xml
\ No newline at end of file
+runhaskell Pompage.hs -d /home/gburri/mininux/fat/Films -x ../xml/sample.xml
\ No newline at end of file
diff --git a/xml/sample.xml b/xml/sample.xml
new file mode 100644 (file)
index 0000000..856481e
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?xml-stylesheet type="text/xsl" href="../xsl/yopyop.xsl"?>
+<filmography>
+  <movie id='1'>
+    <title>Rocky Balboa</title>
+    <year>2006</year>
+    <directors>
+      <director>Sylvester Stallone</director>
+    </directors>
+    <actors>
+      <actor>Sylvester Stallone</actor>
+      <actor>Burt Young</actor>
+      <actor>Antonio Tarver</actor>
+    </actors>
+    <countries>
+      <country>américain</country>
+    </countries>
+    <length>105</length>
+    <pressRating>4</pressRating>
+    <userRating>3</userRating>
+    <genres>
+      <genre>Drame</genre>
+      <genre>Action</genre>
+    </genres>
+    <synopsis>
+      <p>Rocky Balboa, le légendaire boxeur, a depuis longtemps quitté le ring. De ses succès, il ne reste plus que des histoires qu&apos;il raconte aux clients de son restaurant. La mort de son épouse lui pèse chaque jour et son fils ne vient jamais le voir.</p>
+      <p>Le champion d&apos;aujourd&apos;hui s&apos;appelle Mason Dixon, et tout le monde s&apos;accorde à le définir comme un tueur sans élégance ni coeur. Alors que les promoteurs lui cherchent désespérément un adversaire à sa taille, la légende de Rocky refait surface. L&apos;idée d&apos;opposer deux écoles, deux époques et deux titans aussi différents enflamme tout le monde. Pour Balboa, c&apos;est l&apos;occasion de ranimer les braises d&apos;une passion qui ne l&apos;a jamais quitté. L&apos;esprit d&apos;un champion ne meurt jamais...</p>
+    </synopsis>
+    <budget unit='euro'/>
+    <files>
+      <file>Rocky [x264 Aac] [Fr Eng] [Fr Eng].mkv</file>
+    </files>
+    <url>http://www.allocine.fr/film/fichefilm_gen_cfilm=109061.html</url>
+  </movie>
+</filmography>
\ No newline at end of file