]> gitweb.michael.orlitzky.com - dead/halcyon.git/blob - src/Twitter/Xml.hs
Initial commit.
[dead/halcyon.git] / src / Twitter / Xml.hs
1 module Twitter.Xml
2 where
3
4 import Data.Maybe
5 import Text.Regex (mkRegex, subRegex)
6 import Text.XML.HaXml
7
8 get_char_data :: Content -> (Maybe CharData)
9 get_char_data (CString _ cd) = Just cd
10 get_char_data (CRef ref) = Just (verbatim ref) -- Entities.
11 get_char_data _ = Nothing
12
13
14 all_statuses :: CFilter
15 all_statuses = (tag "statuses" /> tag "status")
16
17 -- Called unique_id here because status_id is used elsewhere.
18 unique_id :: CFilter
19 unique_id = keep /> (tag "id") /> txt
20
21 status_created_at :: CFilter
22 status_created_at = keep /> (tag "created_at") /> txt
23
24 status_text :: CFilter
25 status_text = keep /> (tag "text") /> txt
26
27 status_user :: CFilter
28 status_user = keep /> (tag "user")
29
30 user_screen_name :: CFilter
31 user_screen_name = keep /> (tag "screen_name") /> txt
32
33
34 xml_entities :: [(String, String)]
35 xml_entities = [("[lr]dquo", "\""),
36 ("[mn]dash", "-"),
37 ("nbsp", " "),
38 ("#8217", "'"),
39 ("amp", "&"),
40 ("lt", "<"),
41 ("gt", ">")]
42
43 replace_entities :: String -> String
44 replace_entities target = unescape_recursive xml_entities target
45
46 unescape_recursive :: [(String, String)] -> String -> String
47 unescape_recursive [] target = target
48 unescape_recursive replacements target =
49 unescape_recursive (tail replacements) (subRegex (mkRegex from) target to)
50 where
51 replacement = (replacements !! 0)
52 from = "&" ++ (fst replacement) ++ ";"
53 to = (snd replacement)