simple2ch 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -7
- data/lib/simple2ch.rb +19 -24
- data/lib/simple2ch/dat.rb +6 -0
- data/lib/simple2ch/thre.rb +24 -3
- data/lib/simple2ch/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acd8e7b89961a88b05475aed31e51d4406704f6d
|
4
|
+
data.tar.gz: a73c6c26db2fd2998b8d837e803d59a27c8122d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 215c6e5ab3951dc9f5094c45555639e7050b451408236ca72a1596809cf0aa69e5a090bfb8a191af470b434289e4cee8688e7464049443ca6b362740934f1604
|
7
|
+
data.tar.gz: 38ada2533a803b733f6538d6f62e6c7f4de8ceec6e654189c9c68b954249c0a7285989254189e470455eb5f8fb8d2e2565b00e922aa40809ca380e2315704dac
|
data/README.md
CHANGED
@@ -8,17 +8,15 @@ Ruby用の2chの簡易リーダーです。
|
|
8
8
|
|
9
9
|
## 更新内容
|
10
10
|
|
11
|
+
* [v0.1.7]
|
12
|
+
* 機能追加
|
13
|
+
* Thre#url, Thre#dat_urlの追加
|
14
|
+
* バグ修正
|
15
|
+
* エンコーディング関連
|
11
16
|
* [v0.1.6]
|
12
17
|
* 機能追加
|
13
18
|
* 板一覧の取得に対応
|
14
19
|
* URLからスレの取得に対応
|
15
|
-
* [v0.1.5]
|
16
|
-
* デバッグ
|
17
|
-
* StandardErrorで例外を捕縛できない問題を修正
|
18
|
-
* DatParseException, NotA2chUrlException発生時に与えられたURLを表示するよう変更
|
19
|
-
* 機能追加
|
20
|
-
* おーぷん2ちゃんねる対応
|
21
|
-
|
22
20
|
|
23
21
|
## Installation
|
24
22
|
|
data/lib/simple2ch.rb
CHANGED
@@ -22,18 +22,14 @@ module Simple2ch
|
|
22
22
|
|
23
23
|
# HTTPでGETする
|
24
24
|
# @param [URI] url URL
|
25
|
-
# @param [Symbol] site :net, :sc, :openのいずれか.(2ch.net or 2ch.sc or open2ch.net)
|
26
25
|
# @return [String] 取得本文
|
27
|
-
def self.fetch(url
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
else
|
35
|
-
raise RuntimeError, "Invalid type of 2ch was given: #{site}"
|
36
|
-
end
|
26
|
+
def self.fetch(url)
|
27
|
+
encode = if url.to_s.index('subject.txt') || url.to_s.index('.dat') || url.to_s.index('bbsmenu')
|
28
|
+
'SHIFT_JIS'
|
29
|
+
else
|
30
|
+
'UTF-8'
|
31
|
+
end
|
32
|
+
OpenURI.open_uri(url, 'r:binary').read.force_encoding(encode).encode('utf-8', undef: :replace, invalid: :replace, replace: '〓')
|
37
33
|
end
|
38
34
|
|
39
35
|
# bbsmenuのURLが渡されればセットして,板リストを返す
|
@@ -43,7 +39,7 @@ module Simple2ch
|
|
43
39
|
def self.boards(bbsmenu_url=nil, force_refresh:nil)
|
44
40
|
if bbsmenu_url
|
45
41
|
bbsmenu_urls = {
|
46
|
-
net: 'http://menu.2ch.net/bbsmenu.html', sc: 'http://2ch.sc/bbsmenu.html', open: 'http://open2ch.net/
|
42
|
+
net: 'http://menu.2ch.net/bbsmenu.html', sc: 'http://2ch.sc/bbsmenu.html', open: 'http://open2ch.net/bbsmenu.html'
|
47
43
|
}
|
48
44
|
# http://www.rubular.com/r/u1TJbQAULD
|
49
45
|
board_extract_regex = /<A HREF=http:\/\/(?<subdomain>\w+).(?<openflag>open|)2ch.(?<tld>sc|net)\/(?<board_name>\w+)\/>(?<board_name_ja>.+)<\/A>/
|
@@ -55,22 +51,22 @@ module Simple2ch
|
|
55
51
|
data = nil
|
56
52
|
boards_array = []
|
57
53
|
|
58
|
-
raise RuntimeError, "Failed to fetch #{url}" if (data = fetch(URI.parse(prepared_bbsmenu_url)
|
54
|
+
raise RuntimeError, "Failed to fetch #{url}" if (data = fetch(URI.parse(prepared_bbsmenu_url))).empty?
|
59
55
|
raise RuntimeError, "Failed to parse #{url}" if (boards_array=data.scan(board_extract_regex).uniq).empty?
|
60
56
|
|
61
57
|
boards_array.each do |b|
|
62
58
|
boards << Simple2ch::Board.new(b[4],"http://#{b[0]}.#{b[1]}2ch.#{b[2]}/#{b[3]}/")
|
63
59
|
end
|
64
60
|
@@boards[type_of_2ch] = boards
|
65
|
-
else
|
66
|
-
@@boards[type_of_2ch]
|
67
61
|
end
|
68
62
|
end
|
63
|
+
@@boards[type_of_2ch]
|
69
64
|
end
|
70
65
|
|
71
66
|
# 2chのタイプを返す
|
72
67
|
# @param [String] url URL
|
73
68
|
# @return [Symbol] :open or :net or :sc
|
69
|
+
# @raise [NotA2chUrlException] 2chのURLでないURLが与えられた際に発生
|
74
70
|
def self.type_of_2ch(url)
|
75
71
|
parsed_url = self.parse_url(url)
|
76
72
|
openflag = parsed_url[:openflag]
|
@@ -82,7 +78,7 @@ module Simple2ch
|
|
82
78
|
elsif !openflag && tld=='sc'
|
83
79
|
:sc
|
84
80
|
else
|
85
|
-
|
81
|
+
raise NotA2chUrlException, "Given URL: #{url}"
|
86
82
|
end
|
87
83
|
end
|
88
84
|
|
@@ -92,19 +88,18 @@ module Simple2ch
|
|
92
88
|
# @raise [NotA2chUrlException] 2chのURLでないURLが与えられた際に発生
|
93
89
|
def self.parse_url(url)
|
94
90
|
# http://www.rubular.com/r/h63xdfmQIH
|
95
|
-
case url
|
91
|
+
case url.to_s
|
96
92
|
when /http:\/\/(?<server_name>.+)\.(?<openflag>open)?2ch.(?<tld>net|sc)\/test\/read.cgi\/(?<board_name>.+)\/(?<thread_key>[0-9]+)/,
|
97
93
|
/http:\/\/(?<server_name>.+)\.(?<openflag>open)?2ch.(?<tld>net|sc)\/(?<board_name>.+)\/subject\.txt/,
|
98
94
|
/http:\/\/(?<server_name>.+)\.(?<openflag>open)?2ch\.(?<tld>net|sc)\/(?<board_name>.+)\//,
|
99
95
|
/http:\/\/(?<server_name>.+)\.(?<openflag>open)?2ch\.(?<tld>net|sc)\/(?<board_name>\w+)/,
|
100
96
|
/http:\/\/(?<server_name>.+)\.(?<openflag>open)?2ch.(?<tld>net|sc)\/(.+)\/dat\/(?<thread_key>[0-9]+)\.dat/,
|
101
|
-
/http:\/\/(?:(?<server_name
|
102
|
-
{
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
}
|
97
|
+
/http:\/\/(?:(?<server_name>.*)\.)?(?:(?<openflag>open)?)2ch\.(?<tld>sc|net)/
|
98
|
+
{server_name: ($~[:server_name] rescue nil),
|
99
|
+
board_name: ($~[:board_name] rescue nil),
|
100
|
+
openflag: ($~[:openflag] rescue nil),
|
101
|
+
tld: $~[:tld],
|
102
|
+
thread_key: ($~[:thread_key] rescue nil) }
|
108
103
|
else
|
109
104
|
raise NotA2chUrlException, "Given URL: #{url}"
|
110
105
|
end
|
data/lib/simple2ch/dat.rb
CHANGED
@@ -2,6 +2,8 @@ module Simple2ch
|
|
2
2
|
class Dat
|
3
3
|
# @return [String] スレッドキー
|
4
4
|
attr_reader :thread_key
|
5
|
+
# @return [String] タイトル
|
6
|
+
attr_reader :title
|
5
7
|
|
6
8
|
# @param [Thre] thre スレッド
|
7
9
|
def initialize(thre)
|
@@ -47,6 +49,10 @@ module Simple2ch
|
|
47
49
|
fetch_dat.each_line do |l|
|
48
50
|
res_num += 1
|
49
51
|
begin
|
52
|
+
if res_num==1
|
53
|
+
title = l.split('<>').pop
|
54
|
+
@title = title unless @title
|
55
|
+
end
|
50
56
|
@reses << Res.parse(res_num, l, @thre)
|
51
57
|
rescue KakoLogException
|
52
58
|
@f_kako_log = true
|
data/lib/simple2ch/thre.rb
CHANGED
@@ -42,7 +42,12 @@ module Simple2ch
|
|
42
42
|
def self.create_from_url(url)
|
43
43
|
board = Simple2ch::Board.new('', url, fetch_title: true)
|
44
44
|
thread_key = Simple2ch.parse_url(url)[:thread_key]
|
45
|
-
board.thres.find{|t| t.thread_key == thread_key}
|
45
|
+
thre = board.thres.find{|t| t.thread_key == thread_key}
|
46
|
+
unless thre
|
47
|
+
thre = Thre.new board, thread_key
|
48
|
+
thre.reses
|
49
|
+
end
|
50
|
+
thre
|
46
51
|
end
|
47
52
|
|
48
53
|
# Datを解析して、レスを返す
|
@@ -86,6 +91,20 @@ module Simple2ch
|
|
86
91
|
@board ? @board.type_of_2ch : nil
|
87
92
|
end
|
88
93
|
|
94
|
+
# スレのURLを返す
|
95
|
+
# @return [String] スレのURL
|
96
|
+
def url
|
97
|
+
tld = type_of_2ch == :sc ? :sc : :net
|
98
|
+
"http://#{@board.server_name}.#{type_of_2ch==:open ? 'open' : ''}2ch.#{tld}/test/read.cgi/#{@board.board_name}/#{@thread_key}/"
|
99
|
+
end
|
100
|
+
|
101
|
+
# スレのdatURLを返す
|
102
|
+
# @return [String] スレのdatURL
|
103
|
+
def dat_url
|
104
|
+
tld = type_of_2ch == :sc ? :sc : :net
|
105
|
+
"http://#{@board.server_name}.#{type_of_2ch==:open ? 'open' : ''}2ch.#{tld}/#{@board.board_name}/dat/#{@thread_key}.dat"
|
106
|
+
end
|
107
|
+
|
89
108
|
private
|
90
109
|
# 全てのレスに対し、あるレスへのアンカーが書き込まれているレス番号のハッシュを返す
|
91
110
|
# @return [Hash]{ res_num<Fixnum> => res_nums<Array<Fixnum>> } レス番号のハッシュ
|
@@ -99,12 +118,14 @@ module Simple2ch
|
|
99
118
|
ret
|
100
119
|
end
|
101
120
|
|
102
|
-
|
103
121
|
# Datを取ってきてレスと過去ログかどうかを返す
|
104
122
|
# @return [Boolean] f_kako_log 過去ログか否か
|
105
123
|
def fetch_dat
|
106
124
|
dat = Dat.new(self)
|
107
|
-
@reses
|
125
|
+
@reses = dat.reses
|
126
|
+
@num_of_response = @reses.size
|
127
|
+
@f_kako_log = dat.kako_log?
|
128
|
+
@title = dat.title if !@title || @title.empty?
|
108
129
|
dat = nil
|
109
130
|
@f_kako_log
|
110
131
|
end
|
data/lib/simple2ch/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple2ch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dogwood008
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|