root/trunk/as2/com/jeroenwijering/feeds/AbstractParser.as @ 1

Revision 1, 4.0 kB (checked in by jeroen, 18 months ago)

initial commit of old repository into public one

  • Property svn:executable set to *
Line 
1/**
2* General functionality of all feedtype-parsers.
3*
4* @author       Jeroen Wijering
5* @version      1.3
6**/
7
8
9import com.jeroenwijering.utils.StringMagic;
10
11
12class com.jeroenwijering.feeds.AbstractParser {
13
14
15        /** All elements that can be parsed without manipulations **/
16        private var elements:Object;
17        /** Accepted mimetypes for enclosures **/
18        private var mimetypes:Object;
19        /** Timezone abbreviation offsets **/
20        private var timezones:Object = { IDLW:-12,NT:-11,AHST:-10,CAT:-10,HST:-10,
21                YST:-9,PST:-8,MST:-7,PDT:-7,CST:-6,EST:-5,CDT:-5,EDT:-4,ADT:-3,WBT:-4,
22                AST:-4,NT:-3.5,EBT:-3,AT:-2,WAT:-1,UTC:0,UT:0,GMT:0,WET:0,CET:1,
23                CEST:1,EET:2,EEDT:3,MSK:3,IRT:3.5,SAMT:4,YEKT:5,TMT:5,TJT:5,OMST:6,
24                NOVT:6,LKT:6,MMT:6.5,KRAT:7,ICT:7,WIT:7,WAST:7,IRKT:8,ULAT:8,CST:8,
25                CIT:8,BNT:8,YAKT:9,JST:9,KST:9,EIT:9,ACST:9.5,VLAT:10,ACDT:10.5,
26                SAKT:10,GST:10,MAGT:11,IDLE:12,PETT:12,NZST:12
27        };     
28        /** Supporting array to translate RFC2822 months to number. **/
29        private var MONTH_INDEXES:Object = {January:0,February:1,March:2,April:3,
30                May:4,June:5,July:6,August:7,September:8,October:9,November:10,
31                December:11,Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,
32                Oct:9,Nov:10,Dec:11};
33
34
35        /** Constructor. **/
36        function AbstractParser(pre:String) {
37                setElements();
38                setMimes();
39        };
40
41
42        /** build an array with all regular elements **/
43        private function setElements() {
44                elements = new Object();
45        };
46
47
48        /** build an array with all registered mimetypes **/
49        private function setMimes() {
50                mimetypes = new Object();
51                mimetypes["mp3"] = "mp3";
52                mimetypes["audio/mpeg"] = "mp3";
53                mimetypes["flv"] = "flv";
54                mimetypes["video/x-flv"] = "flv";
55                mimetypes["jpeg"] = "jpg";
56                mimetypes["jpg"] = "jpg";
57                mimetypes["image/jpeg"] = "jpg";
58                mimetypes["png"] = "png";
59                mimetypes["image/png"] = "png";
60                mimetypes["gif"] = "gif";
61                mimetypes["image/gif"] = "gif";
62                mimetypes["rtmp"] = "rtmp";
63                mimetypes["swf"] = "swf";
64                mimetypes["mov"] = "mov";
65                mimetypes["application/x-shockwave-flash"] = "swf";
66                mimetypes["rtmp"] = "rtmp";
67                mimetypes["application/x-fcs"] = "rtmp";
68                mimetypes["audio/x-m4a"] = "m4a";
69                mimetypes["audio/x-mp4"] = "mp4";
70                mimetypes["video/x-m4v"] = "m4v";
71                mimetypes["video/mp4"] = "mp4";
72                mimetypes["video/h264"] = "mp4";
73                mimetypes["video/3gpp"] = "3gp";
74                mimetypes["video/x-3gpp2"] = "3g2";
75                mimetypes["audio/x-3gpp2"] = "3g2";
76        };
77
78
79        /** Parse a specific object. **/
80        function parse(xml:XML):Array {
81                var arr:Array = new Array();
82                for(var i=0; i<xml.firstChild.childNodes.length; i++) {
83                        arr.push(xml.firstChild.childNodes[i].nodeName);
84                }
85                return arr;
86        };
87
88
89        /** Translate RFC2822 date strings to timestamp. **/
90        private function rfc2Date(dat:String):Number {
91                if(isNaN(dat)) {
92                        var darr:Array = dat.split(' ');
93                        darr[1] == "" ? darr.splice(1,1) : null;
94                        var month:Number = MONTH_INDEXES[darr[2]];
95                        var date:Number = darr[1].substring(0,2);
96                        var year:Number = darr[3];
97                        var zone = darr[5];
98                        var tarr = darr[4].split(':');
99                        var myDate = new Date(year,month,date,tarr[0],tarr[1],tarr[2]);
100                        var stamp = Math.round(myDate.valueOf()/1000) -
101                                myDate.getTimezoneOffset()*60;
102                        if(isNaN(zone)) {
103                                stamp -= 3600*timezones[zone];
104                        } else {
105                                stamp -= 3600*Number(zone.substring(0,3)) -
106                                        60*Number(zone.substring(3,2));
107                        }
108                        return stamp;
109                } else {
110                        return Number(dat);
111                }
112        };
113
114
115        /** Translate ISO8601 date strings to timestamp. **/
116        private function iso2Date(dat):Number {
117                if(isNaN(dat)) {
118                        while(dat.indexOf(" ") > -1) {
119                                var idx = dat.indexOf(" ");
120                                dat = dat.substr(0,idx) + dat.substr(idx+1);
121                        }
122                        var myDate = new Date(dat.substr(0,4),dat.substr(5,2)-1,
123                                dat.substr(8,2),dat.substr(11,2),dat.substr(14,2),
124                                dat.substr(17,2));
125                        var stamp = Math.round(myDate.valueOf()/1000) -
126                                myDate.getTimezoneOffset()*60;
127                        if(dat.length > 20) {
128                                var hr:Number = Number(dat.substr(20,2));
129                                var mn:Number = Number(dat.substr(23,2));
130                                if(dat.charAt(19) == "-") {
131                                        stamp = stamp - hr*3600 - mn*60;
132                                } else {
133                                        stamp += hr*3600 + mn*60;
134                                }
135                        }
136                        return stamp;
137                } else {
138                        return dat;
139                }
140        };
141
142
143}
Note: See TracBrowser for help on using the browser.