colonymech / docs / www / colonyscout / internal / includes / uploadify / com / adobe / fileformats / vcard / VCardParser.as @ f59acf11
History | View | Annotate | Download (7.17 KB)
1 | f59acf11 | Dan Shope | /* |
---|---|---|---|
2 | Copyright (c) 2008, Adobe Systems Incorporated |
||
3 | All rights reserved. |
||
4 | |||
5 | Redistribution and use in source and binary forms, with or without |
||
6 | modification, are permitted provided that the following conditions are |
||
7 | met: |
||
8 | |||
9 | * Redistributions of source code must retain the above copyright notice, |
||
10 | this list of conditions and the following disclaimer. |
||
11 | |||
12 | * Redistributions in binary form must reproduce the above copyright |
||
13 | notice, this list of conditions and the following disclaimer in the |
||
14 | documentation and/or other materials provided with the distribution. |
||
15 | |||
16 | * Neither the name of Adobe Systems Incorporated nor the names of its |
||
17 | contributors may be used to endorse or promote products derived from |
||
18 | this software without specific prior written permission. |
||
19 | |||
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
||
21 | IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
||
22 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||
23 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||
24 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||
25 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||
26 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||
27 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||
28 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||
29 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||
30 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||
31 | */ |
||
32 | package com.adobe.fileformats.vcard |
||
33 | { |
||
34 | import mx.utils.Base64Decoder; |
||
35 | import mx.utils.StringUtil; |
||
36 | |||
37 | public class VCardParser |
||
38 | { |
||
39 | public static function parse(vcardStr:String):Array |
||
40 | { |
||
41 | var vcards:Array = new Array(); |
||
42 | var lines:Array = vcardStr.split(/\r\n/); |
||
43 | var vcard:VCard; |
||
44 | var type:String; |
||
45 | var typeTmp:String; |
||
46 | var line:String; |
||
47 | |||
48 | for (var i:uint = 0; i < lines.length; ++i) |
||
49 | { |
||
50 | line = lines[i]; |
||
51 | if (line == "BEGIN:VCARD") |
||
52 | { |
||
53 | vcard = new VCard(); |
||
54 | } |
||
55 | else if (line == "END:VCARD") |
||
56 | { |
||
57 | if (vcard != null) |
||
58 | { |
||
59 | vcards.push(vcard); |
||
60 | } |
||
61 | } |
||
62 | else if(line.search(/^ORG/i) != -1) |
||
63 | { |
||
64 | var org:String = line.substring(4, line.length); |
||
65 | var orgArray:Array = org.split(";"); |
||
66 | for each (var orgToken:String in orgArray) |
||
67 | { |
||
68 | if (StringUtil.trim(orgToken).length > 0) |
||
69 | { |
||
70 | vcard.orgs.push(orgToken); |
||
71 | } |
||
72 | } |
||
73 | } |
||
74 | else if(line.search(/^TITLE/i) != -1) |
||
75 | { |
||
76 | var title:String = line.substring(6, line.length); |
||
77 | vcard.title = title; |
||
78 | } |
||
79 | else if (line.search(/^FN:/i) != -1) |
||
80 | { |
||
81 | var fullName:String = line.substring(3, line.length); |
||
82 | vcard.fullName = fullName; |
||
83 | } |
||
84 | else if (line.search(/^TEL/i) != -1) |
||
85 | { |
||
86 | type = new String(); |
||
87 | typeTmp = new String(); |
||
88 | var phone:Phone = new Phone(); |
||
89 | var number:String; |
||
90 | var phoneTokens:Array = line.split(";"); |
||
91 | for each (var phoneToken:String in phoneTokens) |
||
92 | { |
||
93 | if (phoneToken.search(/^TYPE=/i) != -1) |
||
94 | { |
||
95 | if (phoneToken.indexOf(":") != -1) |
||
96 | { |
||
97 | typeTmp = phoneToken.substring(5, phoneToken.indexOf(":")); |
||
98 | number = phoneToken.substring(phoneToken.indexOf(":")+1, phoneToken.length); |
||
99 | } |
||
100 | else |
||
101 | { |
||
102 | typeTmp = phoneToken.substring(5, phoneToken.length); |
||
103 | } |
||
104 | |||
105 | typeTmp = typeTmp.toLocaleLowerCase(); |
||
106 | |||
107 | if (typeTmp == "pref") |
||
108 | { |
||
109 | continue; |
||
110 | } |
||
111 | if (type.length != 0) |
||
112 | { |
||
113 | type += (" "); |
||
114 | } |
||
115 | type += typeTmp; |
||
116 | } |
||
117 | } |
||
118 | if (type.length > 0 && number != null) |
||
119 | { |
||
120 | phone.type = type; |
||
121 | phone.number = number; |
||
122 | } |
||
123 | vcard.phones.push(phone); |
||
124 | } |
||
125 | else if (line.search(/^EMAIL/i) != -1) |
||
126 | { |
||
127 | type = new String(); |
||
128 | typeTmp = new String(); |
||
129 | var email:Email = new Email(); |
||
130 | var emailAddress:String; |
||
131 | var emailTokens:Array = line.split(";"); |
||
132 | for each (var emailToken:String in emailTokens) |
||
133 | { |
||
134 | if (emailToken.search(/^TYPE=/i) != -1) |
||
135 | { |
||
136 | if (emailToken.indexOf(":") != -1) |
||
137 | { |
||
138 | typeTmp = emailToken.substring(5, emailToken.indexOf(":")); |
||
139 | emailAddress = emailToken.substring(emailToken.indexOf(":")+1, emailToken.length); |
||
140 | } |
||
141 | else |
||
142 | { |
||
143 | typeTmp = emailToken.substring(5, emailToken.length); |
||
144 | } |
||
145 | |||
146 | typeTmp = typeTmp.toLocaleLowerCase(); |
||
147 | |||
148 | if (typeTmp == "pref" || typeTmp == "internet") |
||
149 | { |
||
150 | continue; |
||
151 | } |
||
152 | if (type.length != 0) |
||
153 | { |
||
154 | type += (" "); |
||
155 | } |
||
156 | type += typeTmp; |
||
157 | } |
||
158 | } |
||
159 | if (type.length > 0 && emailAddress != null) |
||
160 | { |
||
161 | email.type = type; |
||
162 | email.address = emailAddress; |
||
163 | } |
||
164 | vcard.emails.push(email); |
||
165 | } |
||
166 | else if (line.indexOf("ADR;") != -1) |
||
167 | { |
||
168 | var addressTokens:Array = line.split(";"); |
||
169 | var address:Address = new Address(); |
||
170 | for (var j:uint = 0; j < addressTokens.length; ++j) |
||
171 | { |
||
172 | var addressToken:String = addressTokens[j]; |
||
173 | if (addressToken.search(/^home:+$/i) != -1) // For Outlook, which uses non-standard vCards. |
||
174 | { |
||
175 | address.type = "home"; |
||
176 | } |
||
177 | else if (addressToken.search(/^work:+$/i) != -1) // For Outlook, which uses non-standard vCards. |
||
178 | { |
||
179 | address.type = "work"; |
||
180 | } |
||
181 | if (addressToken.search(/^type=/i) != -1) // The "type" parameter is the standard way (which Address Book uses) |
||
182 | { |
||
183 | // First, remove the optional ":" character. |
||
184 | addressToken = addressToken.replace(/:/,""); |
||
185 | var addressType:String = addressToken.substring(5, addressToken.length).toLowerCase(); |
||
186 | if (addressType == "pref") // Not interested in which one is preferred. |
||
187 | { |
||
188 | continue; |
||
189 | } |
||
190 | else if (addressType.indexOf("home") != -1) // home |
||
191 | { |
||
192 | addressType = "home"; |
||
193 | } |
||
194 | else if (addressType.indexOf("work") != -1) // work |
||
195 | { |
||
196 | addressType = "work"; |
||
197 | } |
||
198 | else if (addressType.indexOf(",") != -1) // if the comma technique is used, just use the first one |
||
199 | { |
||
200 | var typeTokens:Array = addressType.split(","); |
||
201 | for each (var typeToken:String in typeTokens) |
||
202 | { |
||
203 | if (typeToken != "pref") |
||
204 | { |
||
205 | addressType = typeToken; |
||
206 | break; |
||
207 | } |
||
208 | } |
||
209 | } |
||
210 | address.type = addressType; |
||
211 | } |
||
212 | else if (addressToken.search(/^\d/) != -1 && address.street == null) |
||
213 | { |
||
214 | address.street = addressToken.replace(/\\n/, ""); |
||
215 | address.city = addressTokens[j+1]; |
||
216 | address.state = addressTokens[j+2]; |
||
217 | address.postalCode = addressTokens[j+3]; |
||
218 | } |
||
219 | } |
||
220 | if (address.type != null && address.street != null) |
||
221 | { |
||
222 | vcard.addresses.push(address); |
||
223 | } |
||
224 | |||
225 | } |
||
226 | else if (line.search(/^PHOTO;BASE64/i) != -1) |
||
227 | { |
||
228 | var imageStr:String = new String(); |
||
229 | for (var k:uint = i+1; k < lines.length; ++k) |
||
230 | { |
||
231 | imageStr += lines[k]; |
||
232 | //if (lines[k].search(/.+\=$/) != -1) // Very slow in Mac due to RegEx bug |
||
233 | if (lines[k].indexOf('=') != -1) |
||
234 | { |
||
235 | var decoder:Base64Decoder = new Base64Decoder(); |
||
236 | decoder.decode(imageStr); |
||
237 | vcard.image = decoder.flush(); |
||
238 | break; |
||
239 | } |
||
240 | } |
||
241 | } |
||
242 | } |
||
243 | return vcards; |
||
244 | } |
||
245 | } |
||
246 | } |