]> gitweb.michael.orlitzky.com - dead/halcyon.git/blobdiff - src/Twitter/Xml.hs
Whitespace cleanup.
[dead/halcyon.git] / src / Twitter / Xml.hs
index 9c220dc8231c8e6bd6da0e4653823e161ac6ed6f..871d2164dee05737e9861d45c2e400dfde76e741 100644 (file)
@@ -47,6 +47,16 @@ status_text = keep /> (tag "text") /> txt
 status_user :: CFilter i
 status_user = keep /> (tag "user")
 
+-- | Finds the text of the <retweeted> element contained within some
+--   other element.
+status_retweeted :: CFilter i
+status_retweeted = keep /> (tag "retweeted") /> txt
+
+-- | Finds the text of the <in_reply_to_status_id> element contained
+--   within some other element.
+status_reply_to_status_id :: CFilter i
+status_reply_to_status_id = keep /> (tag "in_reply_to_status_id") /> txt
+
 -- |Finds the text of the <screen_name> element contained within some
 -- other element.
 user_screen_name :: CFilter i
@@ -69,15 +79,20 @@ entity_from_codepoint codepoint =
       Just num -> [(chr num)]
 
 
--- |A list of tuples whose first entry is a regular expression
--- matching XML entities, and whose second entry is the ASCII
--- character represented by that entity.
+-- | A list of tuples whose first entry is a regular expression
+--   matching XML entities, and whose second entry is the ASCII
+--   character represented by that entity.
+--
+--   For some reason, ampersands are escaped twice in the status
+--   text. Rather than unescape everything twice, we just stick "amp"
+--   in the list again.
 xml_entities :: [(String, String)]
 xml_entities = [("[lr]dquo", "\""),
                 ("quot",     "\""),
                 ("[mn]dash", "-"),
                 ("nbsp",     " "),
                 ("amp",      "&"),
+                ("amp",      "&"),
                 ("lt",       "<"),
                 ("gt",       ">"),
                 ("hellip",   "…")]
@@ -120,7 +135,7 @@ unescape_recursive replacements target =
 
 
 xml_tests :: [Test]
-xml_tests = [ test_replace_entities ]
+xml_tests = [ test_replace_entities, test_double_unescape ]
 
 
 test_replace_entities :: Test
@@ -129,3 +144,11 @@ test_replace_entities =
     where
       actual_text = (replace_entities "&quot;The moon is gay&#8230;&hellip;&quot; said &lt;insert the current president of the United States of America&gt;. &ldquo;It&#8217;s OK&mdash;&ndash;he&#8217;s not a real doctor.&rdquo;")
       expected_text = "\"The moon is gay……\" said <insert the current president of the United States of America>. \"It’s OK--he’s not a real doctor.\""
+
+
+test_double_unescape :: Test
+test_double_unescape =
+    TestCase $ assertEqual "The status text is unescaped twice." expected_text actual_text
+    where
+      actual_text = (replace_entities "As a kid, I'd pull a girl's hair to let her know I liked her, but now that I'm older &amp;amp; wiser I simply hit her with my car.")
+      expected_text = "As a kid, I'd pull a girl's hair to let her know I liked her, but now that I'm older & wiser I simply hit her with my car."