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.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +30 -0
- data/README.txt +43 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +73 -0
- data/config/requirements.rb +15 -0
- data/example/create_refollow_list.rb +14 -0
- data/example/hello_world.rb +10 -0
- data/lib/timelog4r/utils.rb +115 -0
- data/lib/timelog4r/version.rb +9 -0
- data/lib/timelog4r/xml_parser.rb +366 -0
- data/lib/timelog4r.rb +513 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +82 -0
- data/setup.rb +1585 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/timelog4r_spec.rb +412 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/rspec.rake +21 -0
- data/tasks/website.rake +17 -0
- data/website/index.html +72 -0
- data/website/index.txt +60 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.html.erb +48 -0
- metadata +97 -0
@@ -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
|
+
|