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
data/lib/timelog4r.rb
ADDED
@@ -0,0 +1,513 @@
|
|
1
|
+
#!ruby -Ku
|
2
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
3
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
4
|
+
|
5
|
+
require 'timelog4r/utils'
|
6
|
+
require 'timelog4r/xml_parser'
|
7
|
+
|
8
|
+
=begin rdoc
|
9
|
+
Timelog4r is TimelogAPI for ruby.
|
10
|
+
|
11
|
+
see example/*.rb
|
12
|
+
|
13
|
+
about TimelogAPI
|
14
|
+
http://timelog.jp/api.asp
|
15
|
+
=end
|
16
|
+
class Timelog4r
|
17
|
+
# OPTIONAL:: Set your Program's 'UserAgent'.
|
18
|
+
attr_accessor :user_agent
|
19
|
+
# REQUIRED:: Set your Timelog User-ID.
|
20
|
+
attr_accessor :user_id
|
21
|
+
# REQUIRED:: Set your Timelog PassWord.
|
22
|
+
attr_accessor :password
|
23
|
+
|
24
|
+
# TimelogAPI's BaseURI.
|
25
|
+
BaseAddress = 'http://api.timelog.jp/'
|
26
|
+
|
27
|
+
# Utilities.
|
28
|
+
include Utils
|
29
|
+
# Customized XML-Parser.
|
30
|
+
include XML_Parser
|
31
|
+
|
32
|
+
def initialize #:nodoc:
|
33
|
+
@user_agent = 'timelog4r'
|
34
|
+
end
|
35
|
+
|
36
|
+
=begin rdoc
|
37
|
+
Description::
|
38
|
+
get public timeline[http://timelog.jp/home/public.asp]
|
39
|
+
|
40
|
+
Params::
|
41
|
+
options {
|
42
|
+
|
43
|
+
:cnt => entry_count [Fixnum],
|
44
|
+
:stat => entry_type(:bm|:gn) [String],
|
45
|
+
:since => entry_after_since [Time]
|
46
|
+
|
47
|
+
} [Hash] default nil
|
48
|
+
|
49
|
+
Return::
|
50
|
+
{:title => 'Timelog ... ', entries => [...]}
|
51
|
+
|
52
|
+
RelatedMethods::
|
53
|
+
Utils#parse_options
|
54
|
+
Utils#create_uri
|
55
|
+
Utils#create_request
|
56
|
+
Utils#http_access
|
57
|
+
XML_Parser#parse_timeline
|
58
|
+
|
59
|
+
=end
|
60
|
+
def get_public_timeline(options = nil)
|
61
|
+
address = BaseAddress + 'public_msg.asp'
|
62
|
+
address += parse_options(options) if options
|
63
|
+
uri = create_uri(address)
|
64
|
+
request = create_request(:get, uri)
|
65
|
+
response = http_access(uri, request)
|
66
|
+
result = parse_timeline(response) if response
|
67
|
+
return result
|
68
|
+
end
|
69
|
+
|
70
|
+
=begin rdoc
|
71
|
+
Description::
|
72
|
+
get user and friends timeline[http://timelog.jp/home]
|
73
|
+
|
74
|
+
Params::
|
75
|
+
options {
|
76
|
+
|
77
|
+
:cnt => entry_count [Fixnum],
|
78
|
+
:since => entry_after_since [Time]
|
79
|
+
|
80
|
+
} [Hash] default nil
|
81
|
+
|
82
|
+
Return::
|
83
|
+
{:title => 'Timelog ... ', :entries => [...]}
|
84
|
+
|
85
|
+
RelatedMethods::
|
86
|
+
Utils#parse_options
|
87
|
+
Utils#create_uri
|
88
|
+
Utils#create_request
|
89
|
+
Utils#http_access
|
90
|
+
XML_Parser#parse_timeline
|
91
|
+
|
92
|
+
=end
|
93
|
+
def get_friends_timeline(options = nil)
|
94
|
+
address = BaseAddress + 'friends_msg.asp'
|
95
|
+
address += parse_options(options) if options
|
96
|
+
uri = create_uri(address)
|
97
|
+
request = create_request(:get, uri, true)
|
98
|
+
response = http_access(uri, request)
|
99
|
+
result = parse_timeline(response) if response
|
100
|
+
return result
|
101
|
+
end
|
102
|
+
|
103
|
+
=begin rdoc
|
104
|
+
Description::
|
105
|
+
get my timeline[http:timelog.jp/home/?ac=user_id]
|
106
|
+
|
107
|
+
Params::
|
108
|
+
options {
|
109
|
+
|
110
|
+
:cnt => entry_count [Fixnum],
|
111
|
+
:stat => entry_tipe [String],
|
112
|
+
:since => entry_after_since [Time],
|
113
|
+
:tag => find_entries_from_tag [String]
|
114
|
+
|
115
|
+
} [Hash] default nil
|
116
|
+
|
117
|
+
Return::
|
118
|
+
{:title => 'Timelog ... ', :entries => [...]}
|
119
|
+
|
120
|
+
RelatedMethods::
|
121
|
+
Utils#parse_options
|
122
|
+
Utils#create_uri
|
123
|
+
Utils#create_request
|
124
|
+
Utils#http_access
|
125
|
+
XML_Parser#parse_timeline
|
126
|
+
|
127
|
+
=end
|
128
|
+
def get_my_timeline(options = nil)
|
129
|
+
address = BaseAddress + 'my_msg.asp'
|
130
|
+
address += parse_options(options) if options
|
131
|
+
uri = create_uri(address)
|
132
|
+
request = create_request(:get, uri, true)
|
133
|
+
response = http_access(uri, request)
|
134
|
+
result = parse_timeline(response) if response
|
135
|
+
return result
|
136
|
+
end
|
137
|
+
|
138
|
+
=begin rdoc
|
139
|
+
Description::
|
140
|
+
get my profile[http://user_id.timelog.jp]
|
141
|
+
|
142
|
+
Return::
|
143
|
+
{:title => 'Timelog ... ', :user => {...} }
|
144
|
+
|
145
|
+
RelatedMethods::
|
146
|
+
Utils#parse_options
|
147
|
+
Utils#create_uri
|
148
|
+
Utils#create_request
|
149
|
+
Utils#http_access
|
150
|
+
XML_Parser#parse_profile
|
151
|
+
|
152
|
+
=end
|
153
|
+
def get_profile
|
154
|
+
address = BaseAddress + 'show.asp'
|
155
|
+
uri = create_uri(address)
|
156
|
+
request = create_request(:get, uri, true)
|
157
|
+
response = http_access(uri, request)
|
158
|
+
result = parse_profile(response) if response
|
159
|
+
return result
|
160
|
+
end
|
161
|
+
|
162
|
+
=begin rdoc
|
163
|
+
Description::
|
164
|
+
get friends list[http://timelog.jp/profile/frito.asp?ac=user_id]
|
165
|
+
|
166
|
+
Params::
|
167
|
+
options {
|
168
|
+
:cnt => friend_count [Fixnum]
|
169
|
+
} [Hash] default nil
|
170
|
+
|
171
|
+
Return::
|
172
|
+
{:title => 'Timelog ... ', :entries => [...]}
|
173
|
+
|
174
|
+
RelatedMethods::
|
175
|
+
Utils#parse_options
|
176
|
+
Utils#create_uri
|
177
|
+
Utils#create_request
|
178
|
+
Utils#http_access
|
179
|
+
XML_Parser#parse_user_list
|
180
|
+
|
181
|
+
=end
|
182
|
+
def get_friend_list(options = nil)
|
183
|
+
address = BaseAddress + 'friends.asp'
|
184
|
+
address += parse_options(options) if options
|
185
|
+
uri = create_uri(address)
|
186
|
+
request = create_request(:get, uri, true)
|
187
|
+
response = http_access(uri, request)
|
188
|
+
result = parse_user_list(response) if response
|
189
|
+
return result
|
190
|
+
end
|
191
|
+
|
192
|
+
=begin rdoc
|
193
|
+
Description::
|
194
|
+
get fan list[http://timelog.jp/profile/frifrom.asp?ac=user_id]
|
195
|
+
|
196
|
+
Params::
|
197
|
+
options {
|
198
|
+
:cnt => user_count [Fixnum]
|
199
|
+
} [Hash] default nil
|
200
|
+
|
201
|
+
Return::
|
202
|
+
{:title => 'Timelog ... ', :entries => [...]}
|
203
|
+
|
204
|
+
RelatedMethods::
|
205
|
+
Utils#parse_options
|
206
|
+
Utils#create_uri
|
207
|
+
Utils#create_request
|
208
|
+
Utils#http_access
|
209
|
+
XML_Parser#parse_user_list
|
210
|
+
|
211
|
+
=end
|
212
|
+
def get_fan_list(options = nil)
|
213
|
+
address = BaseAddress + 'fan.asp'
|
214
|
+
address += parse_options(options) if options
|
215
|
+
uri = create_uri(address)
|
216
|
+
request = create_request(:get, uri, true)
|
217
|
+
response = http_access(uri, request)
|
218
|
+
result = parse_user_list(response) if response
|
219
|
+
return result
|
220
|
+
end
|
221
|
+
|
222
|
+
=begin rdoc
|
223
|
+
Description::
|
224
|
+
get tag list[http://timelog.jp/taglist.asp]
|
225
|
+
|
226
|
+
Params::
|
227
|
+
options {
|
228
|
+
:cnt => tag_count [Fixnum]
|
229
|
+
} [Hash] default nil
|
230
|
+
|
231
|
+
Return::
|
232
|
+
{:title => 'Timelog ... ', :tags => [...]}
|
233
|
+
|
234
|
+
RelatedMethods::
|
235
|
+
Utils#parse_options
|
236
|
+
Utils#create_uri
|
237
|
+
Utils#create_request
|
238
|
+
Utils#http_access
|
239
|
+
XML_Parser#parse_tag_list
|
240
|
+
|
241
|
+
=end
|
242
|
+
def get_tag_list(options = nil)
|
243
|
+
address = BaseAddress + 'tags.asp'
|
244
|
+
address += parse_options(options) if options
|
245
|
+
uri = create_uri(address)
|
246
|
+
request = create_request(:get, uri, true)
|
247
|
+
response = http_access(uri, request)
|
248
|
+
result = parse_tag_list(response) if response
|
249
|
+
return result
|
250
|
+
end
|
251
|
+
|
252
|
+
=begin rdoc
|
253
|
+
Description::
|
254
|
+
get direct messages[http://timelog.jp/profile/message.asp]
|
255
|
+
|
256
|
+
Params::
|
257
|
+
options {
|
258
|
+
:cnt => message_count [Fixnum]
|
259
|
+
} [Hash] default nil
|
260
|
+
|
261
|
+
Return::
|
262
|
+
{:title => 'Timelog ... ', :entries => [...]}
|
263
|
+
|
264
|
+
RelatedMethods::
|
265
|
+
Utils#parse_options
|
266
|
+
Utils#create_uri
|
267
|
+
Utils#create_request
|
268
|
+
Utils#http_access
|
269
|
+
XML_Parser#parse_timeline
|
270
|
+
|
271
|
+
=end
|
272
|
+
def get_direct_messages(options = nil)
|
273
|
+
address = BaseAddress + 'direct_msg.asp'
|
274
|
+
address += parse_options(options) if options
|
275
|
+
uri = create_uri(address)
|
276
|
+
request = create_request(:get, uri, true)
|
277
|
+
response = http_access(uri, request)
|
278
|
+
result = parse_timeline(response) if response
|
279
|
+
return result
|
280
|
+
end
|
281
|
+
|
282
|
+
=begin rdoc
|
283
|
+
Description::
|
284
|
+
get reply to my memos[http://timelog.jp/profile/remsg.asp]
|
285
|
+
|
286
|
+
Params::
|
287
|
+
options {
|
288
|
+
:cnt => entry_count [Fixnum]
|
289
|
+
} [Hash] default nil
|
290
|
+
|
291
|
+
Return::
|
292
|
+
{:title => 'Timelog ... ', :entries => [...]}
|
293
|
+
|
294
|
+
RelatedMethods::
|
295
|
+
Utils#parse_options
|
296
|
+
Utils#create_uri
|
297
|
+
Utils#create_request
|
298
|
+
Utils#http_access
|
299
|
+
XML_Parser#parse_timeline
|
300
|
+
|
301
|
+
=end
|
302
|
+
def get_reply_list(options = nil)
|
303
|
+
address = BaseAddress + 'res_msg.asp'
|
304
|
+
address += parse_options(options) if options
|
305
|
+
uri = create_uri(address)
|
306
|
+
request = create_request(:get, uri, true)
|
307
|
+
response = http_access(uri, request)
|
308
|
+
result = parse_timeline(response) if response
|
309
|
+
return result
|
310
|
+
end
|
311
|
+
|
312
|
+
=begin rdoc
|
313
|
+
Description::
|
314
|
+
set tags to text.
|
315
|
+
|
316
|
+
Params::
|
317
|
+
|
318
|
+
:text memo's body [String]
|
319
|
+
:tags set tags [Array]
|
320
|
+
|
321
|
+
Return::
|
322
|
+
text [String]
|
323
|
+
|
324
|
+
=end
|
325
|
+
def set_tags(text, tags)
|
326
|
+
text += '[' + tags.join(',') + ']'
|
327
|
+
return text
|
328
|
+
end
|
329
|
+
|
330
|
+
=begin rdoc
|
331
|
+
Description::
|
332
|
+
update memo.
|
333
|
+
insert :text in 'Timelog Command' Support.
|
334
|
+
|
335
|
+
Params::
|
336
|
+
|
337
|
+
:text memo's body [Stirng]
|
338
|
+
:res_id response to memo_id [String] default nil
|
339
|
+
:tags update tags [Array] default nil
|
340
|
+
|
341
|
+
Return::
|
342
|
+
|
343
|
+
true (case of 'update success')
|
344
|
+
false (case of 'update failed')
|
345
|
+
|
346
|
+
RelatedMethods::
|
347
|
+
set_tags
|
348
|
+
Utils#parse_options
|
349
|
+
Utils#create_uri
|
350
|
+
Utils#create_request
|
351
|
+
Utils#http_access
|
352
|
+
|
353
|
+
=end
|
354
|
+
def update(text, res_id = nil, tags = nil)
|
355
|
+
text = set_tags(text, tags) if tags
|
356
|
+
params = {:text => text}
|
357
|
+
params[:remsgid] = res_id if res_id
|
358
|
+
address = BaseAddress + 'new.asp' + parse_options(params)
|
359
|
+
uri = create_uri(address)
|
360
|
+
request = create_request(:post, uri, true)
|
361
|
+
response = http_access(uri, request)
|
362
|
+
return !response.nil?
|
363
|
+
end
|
364
|
+
|
365
|
+
=begin rdoc
|
366
|
+
Description::
|
367
|
+
send a direct message to timelog-user.
|
368
|
+
|
369
|
+
Params::
|
370
|
+
|
371
|
+
:text memo's body [String]
|
372
|
+
:to send to timelog user_id [String]
|
373
|
+
:res_id response to memo_id [String] default nil
|
374
|
+
:tags update tags [Array] default nil
|
375
|
+
|
376
|
+
Return::
|
377
|
+
|
378
|
+
true (case of 'send message success')
|
379
|
+
false (case of 'send message failed')
|
380
|
+
|
381
|
+
RelatedMethods::
|
382
|
+
update
|
383
|
+
|
384
|
+
=end
|
385
|
+
def send_message(text, to, res_id = nil, tags = nil)
|
386
|
+
text = '/d @' + to + ' ' + text
|
387
|
+
update(text, res_id, tags)
|
388
|
+
end
|
389
|
+
|
390
|
+
=begin rdoc
|
391
|
+
Description::
|
392
|
+
update memo type of todo.
|
393
|
+
|
394
|
+
Params::
|
395
|
+
|
396
|
+
:text memo's body [String]
|
397
|
+
:time todo end-time [Time]
|
398
|
+
:res_id response to memo_id [String] default nil
|
399
|
+
:tags update tags [Array] default nil
|
400
|
+
|
401
|
+
Return::
|
402
|
+
|
403
|
+
true (case of 'update success')
|
404
|
+
false (case of 'update failed')
|
405
|
+
|
406
|
+
RelatedMethods::
|
407
|
+
update
|
408
|
+
|
409
|
+
=end
|
410
|
+
def set_todo(text, time, res_id = nil, tags = nil)
|
411
|
+
text = '/t ' +
|
412
|
+
time.strftime('%Y%m%d%H%M') +
|
413
|
+
' ' + text
|
414
|
+
update(text, res_id, tags)
|
415
|
+
end
|
416
|
+
|
417
|
+
=begin rdoc
|
418
|
+
Description::
|
419
|
+
update memo type of bookmark.
|
420
|
+
|
421
|
+
Params::
|
422
|
+
|
423
|
+
:text memo's body [String]
|
424
|
+
:uri bookmarks uri [URI]
|
425
|
+
:res_id response to memo_id [String] default nil
|
426
|
+
:tags update tags [Array] default nil
|
427
|
+
|
428
|
+
Return::
|
429
|
+
|
430
|
+
true (case of 'update success')
|
431
|
+
false (case of 'update failed')
|
432
|
+
|
433
|
+
RelatedMethods::
|
434
|
+
update
|
435
|
+
|
436
|
+
=end
|
437
|
+
def update_bookmark(text, uri, res_id = nil, tags = nil)
|
438
|
+
text = '/b ' + uri.to_s + ' ' + text
|
439
|
+
update(text, res_id, tags)
|
440
|
+
end
|
441
|
+
|
442
|
+
=begin rdoc
|
443
|
+
Description::
|
444
|
+
update memo type of good.
|
445
|
+
|
446
|
+
Params::
|
447
|
+
|
448
|
+
:text memo's body [String]
|
449
|
+
:res_id response to memo_id [String] default nil
|
450
|
+
:tags update tags [Array] default nil
|
451
|
+
|
452
|
+
Return::
|
453
|
+
|
454
|
+
true (case of 'update success')
|
455
|
+
false (case of 'update failed')
|
456
|
+
|
457
|
+
RelatedMethods::
|
458
|
+
update
|
459
|
+
|
460
|
+
=end
|
461
|
+
def update_good(text, res_id = nil, tags = nil)
|
462
|
+
text = '/g ' + text
|
463
|
+
update(text, res_id, tags)
|
464
|
+
end
|
465
|
+
|
466
|
+
=begin rdoc
|
467
|
+
Description::
|
468
|
+
update memo type of news.
|
469
|
+
|
470
|
+
Params::
|
471
|
+
|
472
|
+
:text memo's body [String]
|
473
|
+
:res_id response to memo_id [String] default nil
|
474
|
+
:tags update tags [Array] default nil
|
475
|
+
|
476
|
+
Return::
|
477
|
+
|
478
|
+
true (case of 'update success')
|
479
|
+
false (case of 'update failed')
|
480
|
+
|
481
|
+
RelatedMethods::
|
482
|
+
update
|
483
|
+
|
484
|
+
=end
|
485
|
+
def update_news(text, res_id = nil, tags = nil)
|
486
|
+
text = '/n ' + text
|
487
|
+
update(text, res_id, tags)
|
488
|
+
end
|
489
|
+
|
490
|
+
=begin rdoc
|
491
|
+
Description::
|
492
|
+
update memo type of vote.
|
493
|
+
|
494
|
+
Params::
|
495
|
+
|
496
|
+
:text memo's body [String]
|
497
|
+
:res_id response to memo_id [String] default nil
|
498
|
+
:tags update tags [Array] default nil
|
499
|
+
|
500
|
+
Return::
|
501
|
+
|
502
|
+
true (case of 'update success')
|
503
|
+
false (case of 'update failed')
|
504
|
+
|
505
|
+
RelatedMethods::
|
506
|
+
update
|
507
|
+
|
508
|
+
=end
|
509
|
+
def update_vote(text, res_id = nil, tags = nil)
|
510
|
+
text = '/j ' + text
|
511
|
+
update(text, res_id, tags)
|
512
|
+
end
|
513
|
+
end
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/timelog4r.rb'}"
|
9
|
+
puts "Loading timelog4r gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/script/txt2html
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
GEM_NAME = 'timelog4r' # what ppl will type to install your gem
|
4
|
+
RUBYFORGE_PROJECT = 'timelog4r'
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
begin
|
8
|
+
require 'newgem'
|
9
|
+
require 'rubyforge'
|
10
|
+
rescue LoadError
|
11
|
+
puts "\n\nGenerating the website requires the newgem RubyGem"
|
12
|
+
puts "Install: gem install newgem\n\n"
|
13
|
+
exit(1)
|
14
|
+
end
|
15
|
+
require 'redcloth'
|
16
|
+
require 'syntax/convertors/html'
|
17
|
+
require 'erb'
|
18
|
+
require File.dirname(__FILE__) + "/../lib/#{GEM_NAME}/version.rb"
|
19
|
+
|
20
|
+
version = Timelog4r::VERSION::STRING
|
21
|
+
download = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
22
|
+
|
23
|
+
def rubyforge_project_id
|
24
|
+
RubyForge.new.autoconfig["group_ids"][RUBYFORGE_PROJECT]
|
25
|
+
end
|
26
|
+
|
27
|
+
class Fixnum
|
28
|
+
def ordinal
|
29
|
+
# teens
|
30
|
+
return 'th' if (10..19).include?(self % 100)
|
31
|
+
# others
|
32
|
+
case self % 10
|
33
|
+
when 1: return 'st'
|
34
|
+
when 2: return 'nd'
|
35
|
+
when 3: return 'rd'
|
36
|
+
else return 'th'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Time
|
42
|
+
def pretty
|
43
|
+
return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def convert_syntax(syntax, source)
|
48
|
+
return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
|
49
|
+
end
|
50
|
+
|
51
|
+
if ARGV.length >= 1
|
52
|
+
src, template = ARGV
|
53
|
+
template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
|
54
|
+
else
|
55
|
+
puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
|
56
|
+
exit!
|
57
|
+
end
|
58
|
+
|
59
|
+
template = ERB.new(File.open(template).read)
|
60
|
+
|
61
|
+
title = nil
|
62
|
+
body = nil
|
63
|
+
File.open(src) do |fsrc|
|
64
|
+
title_text = fsrc.readline
|
65
|
+
body_text_template = fsrc.read
|
66
|
+
body_text = ERB.new(body_text_template).result(binding)
|
67
|
+
syntax_items = []
|
68
|
+
body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
|
69
|
+
ident = syntax_items.length
|
70
|
+
element, syntax, source = $1, $2, $3
|
71
|
+
syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
|
72
|
+
"syntax-temp-#{ident}"
|
73
|
+
}
|
74
|
+
title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
|
75
|
+
body = RedCloth.new(body_text).to_html
|
76
|
+
body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
|
77
|
+
end
|
78
|
+
stat = File.stat(src)
|
79
|
+
created = stat.ctime
|
80
|
+
modified = stat.mtime
|
81
|
+
|
82
|
+
$stdout << template.result(binding)
|