Succeeded to compile examples/tiny.xml
authorPHO <pho@cielonegro.org>
Wed, 11 Feb 2009 03:56:22 +0000 (12:56 +0900)
committerPHO <pho@cielonegro.org>
Wed, 11 Feb 2009 03:56:22 +0000 (12:56 +0900)
Main.hs
Text/XML/HXT/Compilation.hs
Text/XML/HXT/Compilation/XmlTree.hs
examples/tiny.xml [new file with mode: 0644]
hxt-compile.cabal

diff --git a/Main.hs b/Main.hs
index d82a4bd93b7e75a6ff9845150450ae0709b93086..8466f76542ed536646388fa60c09700d69ca8bdc 100644 (file)
--- a/Main.hs
+++ b/Main.hs
@@ -1,4 +1,30 @@
 module Main where
 
+import           Language.Haskell.Pretty
+import           Language.Haskell.Syntax
+import           Text.XML.HXT.Compilation
+import           Text.XML.HXT.Arrow
+import qualified System.IO.UTF8 as Uio
+
+
 main :: IO ()
-main = return ()
+main = do let fpath = "examples/tiny.xml"
+
+          [hsMod] <- runX ( setErrorMsgHandler False fail
+                            >>>
+                            constA fpath
+                            >>>
+                            readFromDocument [ (a_validate        , v_0)
+                                             , (a_check_namespaces, v_1)
+                                             ]
+                            >>>
+                            ( constA (Module "Foo")
+                              &&&
+                              constA (HsIdent "foo")
+                              &&&
+                              compileDocument
+                            )
+                            >>>
+                            wrapIntoModule
+                          )
+          Uio.putStrLn (prettyPrint hsMod)
index 9b2f105cf207b9ebc11f6ba0d07cc2d629ce85a7..cbcf396b03b57baaabf0eda579874b4c1c77e3e8 100644 (file)
@@ -1,4 +1,31 @@
 module Text.XML.HXT.Compilation
-    (
+    ( compileDocument
+    , wrapIntoModule
     )
     where
+
+import           Language.Haskell.Syntax
+import           Text.XML.HXT.Arrow
+import           Text.XML.HXT.Compilation.XmlTree
+
+
+compileDocument :: ArrowXml a => a XmlTree (HsQualType, HsExp)
+compileDocument = uniqueNamespacesFromDeclAndQNames
+                  >>>
+                  ( constA (HsQualType [] (HsTyCon (UnQual (HsIdent "XmlTree"))))
+                    &&&
+                    arr compileXmlTree
+                  )
+
+
+wrapIntoModule :: Arrow a => a (Module, (HsName, (HsQualType, HsExp))) HsModule
+wrapIntoModule = proc (modName, (symName, (symType, symExp))) ->
+                 do let hsModule = HsModule undefined modName (Just exports) imports decls
+                        exports  = [HsEVar (UnQual symName)]
+                        imports  = [ HsImportDecl undefined (Module "Text.XML.HXT.Arrow") False Nothing Nothing
+                                   , HsImportDecl undefined (Module "Text.XML.HXT.DOM.XmlNode") True (Just (Module "XN")) Nothing
+                                   ]
+                        decls    = [ HsTypeSig undefined [symName] symType
+                                   , HsFunBind [HsMatch undefined symName [] (HsUnGuardedRhs symExp) []]
+                                   ]
+                    returnA -< hsModule
index 7884c771bb632bfc428b5dbee61ce5c1a625fc15..37bb842ad370dd1564ca232f88e43f27f49e3d94 100644 (file)
@@ -1,5 +1,10 @@
 module Text.XML.HXT.Compilation.XmlTree
     ( compileXmlTree
+    , compileXmlTrees
+    , compileXNode
+    , compileDTDElem
+    , compileAttributes
+    , compileQName
     )
     where
 
@@ -9,16 +14,16 @@ import           Text.XML.HXT.DOM.XmlNode
 import           Text.XML.HXT.DOM.TypeDefs
 
 
-compileXmlTrees :: XmlTrees -> HsExp
-compileXmlTrees = HsList . map compileXmlTree
-
-
 compileXmlTree :: XmlTree -> HsExp
 compileXmlTree t
     = let node     = compileXNode (getNode t)
           children = HsList (map compileXmlTree (getChildren t))
       in
-        xn "mkTree" $: node $: children
+        xn "mkTree" $: HsParen node $: children
+
+
+compileXmlTrees :: XmlTrees -> HsExp
+compileXmlTrees = HsList . map compileXmlTree
 
 
 compileXNode :: XNode -> HsExp
@@ -27,11 +32,11 @@ compileXNode (XCharRef   n) = xn "mkCharRef"     $: litInt n
 compileXNode (XEntityRef s) = xn "mkEntityRef"   $: litStr s
 compileXNode (XCmt       s) = xn "mkCmt"         $: litStr s
 compileXNode (XCdata     s) = xn "mkCdata"       $: litStr s
-compileXNode (XPi    qn ts) = xn "mkPi"          $: compileQName   qn $: compileXmlTrees ts
-compileXNode (XTag   qn ts) = xn "mkElementNode" $: compileQName   qn $: compileXmlTrees ts
-compileXNode (XDTD   de as) = xn "mkDTDNode"     $: compileDTDElem de $: compileAttributes as
-compileXNode (XAttr     qn) = xn "mkAttrNode"    $: compileQName   qn
-compileXNode (XError  n  s) = xn "mkError"       $: litInt n          $: litStr s
+compileXNode (XPi    qn ts) = xn "mkPi"          $: HsParen (compileQName   qn) $: compileXmlTrees ts
+compileXNode (XTag   qn ts) = xn "mkElementNode" $: HsParen (compileQName   qn) $: compileXmlTrees ts
+compileXNode (XDTD   de as) = xn "mkDTDNode"     $: HsParen (compileDTDElem de) $: HsParen (compileAttributes as)
+compileXNode (XAttr     qn) = xn "mkAttrNode"    $: HsParen (compileQName   qn)
+compileXNode (XError  n  s) = xn "mkError"       $: litInt n $: litStr s
 
 
 compileDTDElem :: DTDElem -> HsExp
@@ -45,6 +50,9 @@ compileAttributes = error "compileAttributes: FIXME: not implemented"
 xn :: String -> HsExp
 xn = HsVar . Qual (Module "XN") . HsIdent
 
+unq :: String -> HsExp
+unq = HsVar . UnQual . HsIdent
+
 
 litStr :: String -> HsExp
 litStr = HsLit . HsString
@@ -54,11 +62,11 @@ litInt :: Integral a => a -> HsExp
 litInt = HsLit . HsInt . toInteger
 
 
-infixl $:
+infixr 5 $:
 ($:) :: HsExp -> HsExp -> HsExp
-($:) = HsApp
+a $: b = HsApp a b
 
 
 compileQName :: QName -> HsExp
 compileQName (QN prefix local ns)
-    = xn "mkQName" $: litStr prefix $: litStr local $: litStr ns
+    = unq "mkQName" $: litStr prefix $: litStr local $: litStr ns
diff --git a/examples/tiny.xml b/examples/tiny.xml
new file mode 100644 (file)
index 0000000..1080534
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<foo>
+  <bar>baz</bar>
+</foo>
index e8ba617e4c2370363574deef493d22a57aaf2c6d..255be89ec267ae5f773a1e95d74a8f01ac7d6873 100644 (file)
@@ -9,14 +9,21 @@ Maintainer:          PHO <pho at cielonegro.org>
 Cabal-Version:       >= 1.2
 Build-Type:          Simple
 
+Extra-Source-Files:
+    examples/tiny.xml
+
 Library
     Build-Depends:
-        base, haskell-src, hxt
+        base, haskell-src, hxt, utf8-string
     Exposed-Modules:
         Text.XML.HXT.Compilation
         Text.XML.HXT.Compilation.XmlTree
+    Extensions:
+        Arrows
     GHC-Options:     -Wall
 
 Executable hxt-compile
     Main-Is:         Main.hs
+    Extensions:
+        Arrows
     GHC-Options:     -Wall