timelog4r 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
+