timelog4r 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,366 @@
1
+ #!ruby -Ku
2
+ require 'rexml/document'
3
+ require 'time'
4
+
5
+ class Timelog4r
6
+
7
+ =begin rdoc
8
+ Description::
9
+ Customized XML Parser for TimelogAPI.
10
+
11
+ =end
12
+ module XML_Parser
13
+
14
+ =begin rdoc
15
+ Description::
16
+ memo's entry permission to symbol.
17
+
18
+ Params::
19
+ :string memo's permission [String]
20
+
21
+ Return::
22
+
23
+ :public (case of 'public permission')
24
+ :friends_only (case of 'friends-only permission')
25
+ :private (case of 'private permission')
26
+ :unknown (other case)
27
+
28
+ =end
29
+ def permission_to_sym(string)
30
+ case string
31
+ when '0'
32
+ return :public
33
+ when '1'
34
+ return :friends_only
35
+ when '2'
36
+ return :private
37
+ else
38
+ return :unknown
39
+ end
40
+ end
41
+
42
+ =begin rdoc
43
+ Description::
44
+ tag-strings convert to Array in tag.
45
+
46
+ Params::
47
+ :tag_string tags [String]
48
+
49
+ Return::
50
+ ['TagA', 'TagB', ...]
51
+
52
+ =end
53
+ def tags_to_a(tag_string)
54
+ return tag_string.chop.split(',')
55
+ end
56
+
57
+ =begin rdoc
58
+ Description::
59
+ parse XML::Element convert to hash.
60
+
61
+ Params::
62
+ :element entry-element [REXML::Element]
63
+
64
+ Return::
65
+ {:memo_text => '...', ...}
66
+
67
+ RelatedMethods::
68
+ permission_to_sym
69
+ parse_author
70
+ tags_to_a
71
+
72
+ =end
73
+ def parse_entry(element)
74
+ result = {
75
+ :memo_text => element.elements['memo'].text,
76
+ :memo_id => element.elements['id'].text,
77
+ :permission =>
78
+ permission_to_sym(
79
+ element.elements['dispflag'].text
80
+ ),
81
+ :modified =>
82
+ Time.parse(
83
+ element.elements['modified'].text
84
+ ),
85
+ :permalink =>
86
+ URI.parse(
87
+ element.elements['link'].attributes['href']
88
+ ),
89
+ :author =>
90
+ parse_author(
91
+ element.elements['author']
92
+ )
93
+ }
94
+ result[:reply_to] = {
95
+ :memo_id =>
96
+ element.elements['replyid'].text,
97
+ :author => {
98
+ :user_id =>
99
+ element.elements['toid'].text,
100
+ :screen_name =>
101
+ element.elements['toname'].text,
102
+ }
103
+ } if element.elements['toid'].has_text?
104
+ if element.elements['tododate'].has_text? then
105
+ result[:todo] = Time.parse(
106
+ element.elements['tododate'].text
107
+ ) unless element.elements['tododate'].text.eql?(' ')
108
+ end
109
+ if element.elements['tag'].has_text? then
110
+ result[:tag] = tags_to_a(element.elements['tag'].text)
111
+ end
112
+ if element.elements['fromid'] then
113
+ result[:in_group] = {
114
+ :user_id =>
115
+ element.elements['fromid'].text,
116
+ :screen_name =>
117
+ element.elements['fromname'].text
118
+ }
119
+ end
120
+ return result
121
+ end
122
+
123
+ =begin rdoc
124
+ Description::
125
+ parse XML-Element convert to hash
126
+
127
+ Params::
128
+ :element author-element [REXML::Element]
129
+
130
+ Return::
131
+ {:images => {:normal => ...}, ...}
132
+
133
+ =end
134
+ def parse_author(element)
135
+ return nil unless element.elements['id'].has_text?
136
+ result = {
137
+ :images => {
138
+ :normal =>
139
+ URI.parse(
140
+ element.elements['image/normal'].text
141
+ ),
142
+ :thumbnail =>
143
+ URI.parse(
144
+ element.elements['image/thumb'].text
145
+ ),
146
+ :small =>
147
+ URI.parse(
148
+ element.elements['image/small'].text
149
+ )
150
+ }
151
+ }
152
+ if element.elements['statflag'] then
153
+ author_type = element.elements['statflag'].text == '2' ?
154
+ 'group' : 'user'
155
+ result[:type] = author_type.to_sym
156
+ result["#{author_type}_id".to_sym] = element.elements['id'].text
157
+ result["#{author_type}_name".to_sym] = element.elements['name'].text
158
+ end
159
+ return result
160
+ end
161
+
162
+ =begin rdoc
163
+ Description::
164
+ parse XML-Document convert to hash.
165
+
166
+ Params::
167
+ :document timeline document [REXML::Document]
168
+
169
+ Return::
170
+ {:title => 'Timelog ...', :entries => [...]}
171
+
172
+ RelatedMethods::
173
+ parse_author
174
+ parse_entry
175
+
176
+ =end
177
+ def parse_timeline(document)
178
+ result = {
179
+ :title =>
180
+ document.elements['memos/title'].text,
181
+ :link =>
182
+ URI.parse(
183
+ document.elements['memos/link'].attributes['href']
184
+ ),
185
+ :modified =>
186
+ Time.parse(
187
+ document.elements['memos/modified'].text
188
+ )
189
+ }
190
+ author = parse_author(document.elements['memos/author'])
191
+ result[:author] = author if author
192
+ result[:entries] = document.elements.collect('memos/entry'){|entry|
193
+ parse_entry(entry)
194
+ }
195
+ return result
196
+ end
197
+
198
+ =begin rdoc
199
+ Description::
200
+ parse XML-Element convert to hash.
201
+
202
+ Params::
203
+ :element tag-element [REXML::Element]
204
+
205
+ Return::
206
+ {:tag => 'tag', :count => 2}
207
+
208
+ =end
209
+ def parse_tag(element)
210
+ {
211
+ :tag =>
212
+ element.elements['tag'].text,
213
+ :count =>
214
+ element.elements['cnt'].text
215
+ }
216
+ end
217
+
218
+ =begin rdoc
219
+ Description::
220
+ parse XML-Document convert to hash.
221
+
222
+ Params::
223
+ :document tags-document [REXML::Document]
224
+
225
+ Return::
226
+ {:title => 'Timelog ... ', :entries => [...]}
227
+
228
+ RelatedMethods::
229
+ parse_tag
230
+
231
+ =end
232
+ def parse_tag_list(document)
233
+ result = {
234
+ :title =>
235
+ document.elements['tags/title'].text,
236
+ :link =>
237
+ URI.parse(document.elements['tags/link'].attributes['href']),
238
+ :modified =>
239
+ Time.parse(document.elements['tags/modified'].text)
240
+ }
241
+ result[:tags] = document.elements.collect('tags/tagdata'){|tag|
242
+ parse_tag(tag)
243
+ }
244
+ return result
245
+ end
246
+
247
+ =begin rdoc
248
+ Description::
249
+ parse XML-Element convert to hash.
250
+
251
+ Params::
252
+ :element user-element [REXML::Element]
253
+
254
+ Return::
255
+ {:user_id => 'user_id', :user_name => 'name', ...}
256
+
257
+ =end
258
+ def parse_user(element)
259
+ {
260
+ :user_id =>
261
+ element.elements['id'].text,
262
+ :user_name =>
263
+ element.elements['name'].text,
264
+ :images => {
265
+ :normal =>
266
+ URI.parse(
267
+ element.elements['image/normal'].text
268
+ ),
269
+ :thumbnail =>
270
+ URI.parse(
271
+ element.elements['image/thumb'].text
272
+ ),
273
+ :small =>
274
+ URI.parse(
275
+ element.elements['image/small'].text
276
+ )
277
+ }
278
+ }
279
+ end
280
+
281
+ =begin rdoc
282
+ Description::
283
+ parse XML-Document convert to hash.
284
+
285
+ Params::
286
+ :document users-document [REXML::Document]
287
+
288
+ Return::
289
+ {:title => 'Timelog ... ', :entries => [...]}
290
+
291
+ RelatedMethods::
292
+ parse_user
293
+
294
+ =end
295
+ def parse_user_list(document)
296
+ result = {
297
+ :title =>
298
+ document.elements['friends/title'].text,
299
+ :link =>
300
+ URI.parse(
301
+ document.elements['friends/link'].attributes['href']
302
+ ),
303
+ :modified =>
304
+ Time.parse(
305
+ document.elements['friends/modified'].text
306
+ )
307
+ }
308
+ result[:entries] = document.elements.collect('friends/entry'){|friend|
309
+ parse_user(friend)
310
+ }
311
+ return result
312
+ end
313
+
314
+ =begin rdoc
315
+ Description::
316
+ parse XML-Document convert to hash.
317
+
318
+ Params::
319
+ :document profile-document [REXML::Document]
320
+
321
+ Return::
322
+ {:title => 'Timelog ... ', :link => ...}
323
+
324
+ RelatedMethods::
325
+ parse_user
326
+ tags_to_a
327
+
328
+ =end
329
+ def parse_profile(document)
330
+ result = {
331
+ :title =>
332
+ document.elements['show/title'].text,
333
+ :link =>
334
+ URI.parse(
335
+ document.elements['show/link'].attributes['href']
336
+ ),
337
+ :modified =>
338
+ Time.parse(
339
+ document.elements['show/modified'].text
340
+ ),
341
+ :user => {
342
+ :parmalink =>
343
+ URI.parse(
344
+ document.elements['show/user/url'].text
345
+ ),
346
+ :use_tags =>
347
+ tags_to_a(
348
+ document.elements['show/user/tags'].text
349
+ )
350
+ }.merge(
351
+ parse_user(document.elements['show/user'])
352
+ )
353
+ }
354
+ if document.elements['show/user/prof_url'].has_text?
355
+ result[:user][:other_site] = URI.parse(
356
+ document.elements['show/user/prof_url'].text
357
+ )
358
+ end
359
+ if document.elements['show/user/prof_url'].has_text?
360
+ result[:user][:profile_message] = document.elements['show/user/prof_msg'].text
361
+ end
362
+ return result
363
+ end
364
+ end
365
+ end
366
+