rhaiker 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,113 @@
1
+ #!ruby -Ku
2
+ require 'uri'
3
+ require 'net/http'
4
+ require 'rexml/document'
5
+ require 'time'
6
+
7
+ class Rhaiker
8
+
9
+ =begin rdoc
10
+ Utility Module for Rhaiker.
11
+ This module include URI, Net::HTTP, REXML::Document, and Time.
12
+ =end
13
+ module Utils
14
+
15
+ =begin rdoc
16
+ Description::
17
+ create Net::HTTPRequest instance.
18
+
19
+ Params::
20
+ type (:post|:get),
21
+ uri URI-Instance,
22
+ use_basic_auth (booleans)
23
+
24
+ Return::
25
+ Net::HTTPRequest-Instance
26
+
27
+ RelatedMethods::
28
+ create_uri,
29
+ http_access
30
+ =end
31
+ def create_request(type, uri, use_basic_auth = false)
32
+ case type
33
+ when :get
34
+ request = Net::HTTP::Get.new(uri.request_uri)
35
+ when :post
36
+ request = Net::HTTP::Post.new(uri.request_uri)
37
+ end
38
+ request['User-Agent'] = @user_agent
39
+ request.basic_auth @user_id, @api_key if use_basic_auth
40
+ return request
41
+ end
42
+
43
+ =begin rdoc
44
+ Description::
45
+ create URI instance.
46
+
47
+ Params::
48
+ url_string
49
+
50
+ Return::
51
+ URI-Instance
52
+
53
+ RelatedMethods::
54
+ parse_options,
55
+ create_request,
56
+ http_access
57
+ =end
58
+ def create_uri(url_string)
59
+ return URI.parse(URI.escape(url_string))
60
+ end
61
+
62
+ =begin rdoc
63
+ Description::
64
+ access to Hatena::Haiku::API[http://h.hatena.ne.jp/api]
65
+
66
+ Params::
67
+ uri (URI-Instance),
68
+ request (Net::HTTPRequest-Instance)
69
+
70
+ Return::
71
+ REXML::Document-Instance or false
72
+
73
+ RelatedMethods::
74
+ create_uri,
75
+ create_request
76
+ =end
77
+ def http_access(uri, request)
78
+ Net::HTTP.start(uri.host, uri.port){|http|
79
+ response = http.request(request)
80
+ if response.code == '200'
81
+ return REXML::Document.new(response.body)
82
+ else
83
+ return false
84
+ end
85
+ }
86
+ end
87
+
88
+ =begin rdoc
89
+ Description::
90
+ parse option parametors
91
+
92
+ Params::
93
+ options ({:param_name => value, [...]})
94
+
95
+ Return::
96
+ parsed-options ('?param_name=value&...')
97
+
98
+ RelatedMethods::
99
+ create_uri
100
+ =end
101
+ def parse_options(options)
102
+ result = ''
103
+ if options[:since]
104
+ options[:since] = Time.parse(options[:since].to_s).httpdate
105
+ end
106
+ options = options.find_all{|option|option.last}
107
+ result = '?' + options.collect{|option|
108
+ option.join('=')
109
+ }.join('&') unless options.empty?
110
+ return result
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,9 @@
1
+ class Rhaiker
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,211 @@
1
+ #!ruby -Ku
2
+ require 'rexml/document'
3
+ require 'date'
4
+ require 'uri'
5
+
6
+ class Rhaiker
7
+
8
+ =begin rdoc
9
+ XML Parser Module for
10
+ Hatena::Haiku::API[http://h.hatena.ne.jp/api] Response.
11
+ =end
12
+ module XML_Parser
13
+
14
+ =begin rdoc
15
+ Description::
16
+ XML-Document-Parse for timeline
17
+
18
+ Params::
19
+ document (REXML::Document-Instance)
20
+
21
+ Return::
22
+ [{:id => 12345, ...}, ...]
23
+
24
+ RelatedMethods::
25
+ parse_status
26
+ =end
27
+ def parse_timeline(document)
28
+ document.elements.collect('//statuses/status'){|status|
29
+ parse_status(status)
30
+ }
31
+ end
32
+
33
+ =begin rdoc
34
+ Description::
35
+ XML-Element-Parse for status
36
+
37
+ Params::
38
+ status (REXML::Element-Instance)
39
+
40
+ Return::
41
+ {:id => 12345, ...}
42
+
43
+ RelatedMethods::
44
+ parse_timeline,
45
+ parse_user,
46
+ parse_reply
47
+ =end
48
+ def parse_status(status)
49
+ result = {
50
+ :id =>
51
+ status.elements['id'].text.to_i,
52
+ :text =>
53
+ status.elements['text'].text,
54
+ :link =>
55
+ URI.parse(status.elements['link'].text),
56
+ :created_at =>
57
+ DateTime.parse(status.elements['created_at'].text),
58
+ :favorited =>
59
+ status.elements['favorited'].text.to_i,
60
+ :source =>
61
+ status.elements['source'].text,
62
+ :user =>
63
+ parse_user(status.elements['user'])
64
+ }
65
+ in_reply_to = {
66
+ :in_reply_to => {
67
+ :status_id =>
68
+ status.elements['in_reply_to_status_id'].text.to_i,
69
+ :user_id =>
70
+ status.elements['in_reply_to_user_id'].text
71
+ }
72
+ } if status.elements['in_reply_to_status_id'].has_text?
73
+ result.merge!(in_reply_to) if in_reply_to
74
+ replies = status.elements.collect('replies'){|reply|
75
+ parse_reply(reply)
76
+ }
77
+ result.merge!({:replies => replies}) unless replies.empty?
78
+ return result
79
+ end
80
+
81
+ =begin rdoc
82
+ Description::
83
+ XML-Element-Parse for reply
84
+
85
+ Params::
86
+ reply (REXML::Element-Instance)
87
+
88
+ Return::
89
+ {:id => 12345, ...}
90
+
91
+ RelatedMethods::
92
+ parse_status,
93
+ parse_user
94
+ =end
95
+ def parse_reply(reply)
96
+ {
97
+ :id =>
98
+ reply.elements['id'].text.to_i,
99
+ :created_at =>
100
+ DateTime.parse(reply.elements['created_at'].text),
101
+ :favorited =>
102
+ reply.elements['favorited'].text.to_i,
103
+ :source =>
104
+ reply.elements['source'].text,
105
+ :text =>
106
+ reply.elements['text'].text,
107
+ :user =>
108
+ parse_user(reply.elements['user'])
109
+ }
110
+ end
111
+
112
+ =begin rdoc
113
+ Description::
114
+ XML-Document-Parse for users
115
+
116
+ Params::
117
+ users (REXML::Document-Insetance)
118
+
119
+ Return::
120
+ [{:id => 'hoge', ...}, ...]
121
+
122
+ RelatedMethods::
123
+ parse_user
124
+ =end
125
+ def parse_users(document)
126
+ document.elements.collect('//users/user'){|user|
127
+ parse_user(user)
128
+ }
129
+ end
130
+
131
+ =begin rdoc
132
+ Description::
133
+ XML-Element-Parse for user
134
+
135
+ Params::
136
+ user (REXML::Element-Instance)
137
+
138
+ Return::
139
+ {:id => 'hoge', ...}
140
+
141
+ RelatedMethods::
142
+ parse_users,
143
+ parse_status,
144
+ parse_reply
145
+ =end
146
+ def parse_user(user)
147
+ {
148
+ :id =>
149
+ user.elements['id'].text,
150
+ :name =>
151
+ user.elements['name'].text,
152
+ :screen_name =>
153
+ user.elements['screen_name'].text,
154
+ :followers_count =>
155
+ user.elements['followers_count'].text.to_i,
156
+ :url =>
157
+ URI.parse(user.elements['url'].text),
158
+ :profile_image_url =>
159
+ URI.parse(user.elements['profile_image_url'].text)
160
+ }
161
+ end
162
+
163
+ =begin rdoc
164
+ Description::
165
+ XML-Document-Parse for keywords
166
+
167
+ Params::
168
+ document (REXML::Document-Instance)
169
+
170
+ Return::
171
+ [{:title => 'hoge', ...}, ...]
172
+
173
+ RelatedMethods::
174
+ parse_keyword
175
+ =end
176
+ def parse_keywords(document)
177
+ document.elements.collect('//keywords/keyword'){|keyword|
178
+ parse_keyword(keyword)
179
+ }
180
+ end
181
+
182
+ =begin rdoc
183
+ Description::
184
+ XML-Element-Parse for keyword
185
+
186
+ Params::
187
+ keyword (REXML::Element-Instance)
188
+
189
+ Return::
190
+ timeline ({:title => 'hoge', ...})
191
+
192
+ RelatedMethods::
193
+ parse_keywords
194
+ =end
195
+ def parse_keyword(keyword)
196
+ {
197
+ :title =>
198
+ keyword.elements['title'].text,
199
+ :entry_count =>
200
+ keyword.elements['entry_count'].text.to_i,
201
+ :followers_count =>
202
+ keyword.elements['followers_count'].text.to_i,
203
+ :link =>
204
+ URI.parse(keyword.elements['link'].text),
205
+ :related_keywords =>
206
+ keyword.elements.to_a('related_keywords')
207
+ }
208
+ end
209
+ end
210
+ end
211
+
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/rhaiker.rb'}"
9
+ puts "Loading rhaiker 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 = 'rhaiker' # what ppl will type to install your gem
4
+ RUBYFORGE_PROJECT = 'rhaiker'
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 = Rhaiker::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)