Move the wrapper div inside the ArticlePage to_xhtml function.
authorMichael Orlitzky <michael@orlitzky.com>
Sun, 8 Jul 2012 21:25:34 +0000 (17:25 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Sun, 8 Jul 2012 21:25:34 +0000 (17:25 -0400)
Add an XML class and implement to_xml for Articles.

src/LWN/Article.hs
src/LWN/Page.hs
src/LWN/XHTML.hs

index 9d4c85868be9f25299eabd79604249e56474f1ca..ac3d456da8aae0ef43339e66c9bd62d5e92cff44 100644 (file)
@@ -14,6 +14,15 @@ import Test.HUnit (Assertion, assertEqual)
 import Test.Framework (Test, testGroup)
 import Test.Framework.Providers.HUnit (testCase)
 import Text.Regex.Posix ((=~))
+import Text.XML.HXT.Core (
+  (>>>),
+  arr,
+  hread,
+  selem,
+  none,
+  runX,
+  txt,
+  xshow)
 
 import LWN.URI (
   add_trailing_slash,
@@ -21,7 +30,7 @@ import LWN.URI (
   try_make_absolute_url,
   make_https)
 
-import LWN.XHTML (XHTML, to_xhtml)
+import LWN.XHTML (XHTML, XML, to_xhtml, to_xml)
 
 newtype Title    = Title    { getTitle    :: String }
 newtype Byline   = Byline   { getByline   :: Maybe String }
@@ -47,17 +56,35 @@ instance XHTML Byline where
 instance XHTML BodyHtml where
   to_xhtml = getBodyHtml
 
+
+instance XML Title where
+  to_xml (Title t) =
+    selem "h2" [ txt t ]
+
+instance XML Byline where
+  to_xml (Byline (Just bl)) =
+    selem "p" [ selem "em" [ txt bl ] ]
+  to_xml (Byline   Nothing) = none
+
+instance XML BodyHtml where
+  to_xml (BodyHtml bh) =
+    (arr $ const bh) >>> hread
+
 data Article = Article { title     :: Title,
                          byline    :: Byline,
                          body_html :: BodyHtml }
 
 instance XHTML Article where
   to_xhtml (Article t bl b) =
+    "<div>"       ++
     (to_xhtml t)  ++
     (to_xhtml bl) ++
-    (to_xhtml b)
-
+    (to_xhtml b)  ++
+    "</div>"
 
+instance XML Article where
+  to_xml (Article t bl b) =
+    selem "div" [to_xml t, to_xml bl, to_xml b]
 
 -- | Convert the given article to either a URL or a filesystem
 --   path. If the given article exists on the filesystem, we assume
@@ -112,6 +139,29 @@ test_non_https_article_path = do
   actual <- real_article_path "http://lwn.net/Articles/502979/"
   assertEqual "Non-https URL made https" expected actual
 
+
+
+-- | Compares the output of (xshow . to_xml) and to_xhtml; they should
+--   match.
+test_to_xml :: Assertion
+test_to_xml = do
+  actual_xml' <- runX . xshow $ to_xml input_article
+  let actual_xml = actual_xml' !! 0
+
+  let expected_xml = to_xhtml input_article
+
+  assertEqual
+    "The to_xml function works on a trivial example"
+    expected_xml
+    actual_xml
+  where
+    t  = Title "Hello, world!"
+    bl = Byline $ Just "Breaking News"
+    b  = BodyHtml "<p>Hello, world!</p>"
+    input_article = Article t bl b
+
+
+
 article_tests :: Test
 article_tests =
   testGroup "Article Tests" [
@@ -121,4 +171,5 @@ article_tests =
       test_current_bigpage_article_path,
     testCase "Numbered article path constructed" test_numbered_article_path,
     testCase "Full article path left alone" test_full_article_path,
-    testCase "Non-https URL made https" test_non_https_article_path ]
+    testCase "Non-https URL made https" test_non_https_article_path,
+    testCase "The to_xml function works on a trivial example" test_to_xml ]
index 3705f3bcf62bd89759c9793410ee6a3633cc877e..3027eaef6c83e76067a744acf98be3a8b6b8579f 100644 (file)
@@ -133,9 +133,7 @@ instance XHTML Page where
     "  <title>" ++ (show $ LWN.Article.title a) ++ "</title>" ++
     "</head>" ++
     "<body>" ++
-    "<div>" ++
     (to_xhtml a) ++
-    "</div>" ++
     "</body>" ++
     "</html>"
 
index caa740336010fe5d1fc21df6ae3ece5c44a845c2..f6632db19fe902afd69a8ea3017adeeba4b43655 100644 (file)
@@ -1,11 +1,15 @@
 module LWN.XHTML (
   XHTML,
+  XML,
+  my_read_opts,
   parse_lwn,
-  to_xhtml
+  to_xhtml,
+  to_xml
   )
 where
 
 import Text.XML.HXT.Core (
+  ArrowXml,
   IOStateArrow,
   SysConfigList,
   XmlTree,
@@ -20,7 +24,8 @@ import Text.XML.HXT.Core (
 class XHTML a where
   to_xhtml :: a -> String
 
-
+class XML a where
+  to_xml :: (ArrowXml b) => a -> (b XmlTree XmlTree)
 
 -- | Options used when parsing HTML.
 my_read_opts :: SysConfigList