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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6ec2043f50a5e9ae0b2b036c2d63c8b494774a6
4
- data.tar.gz: 55b076ab99e2448569d5a8b0d3fba090a1586305
3
+ metadata.gz: acd8e7b89961a88b05475aed31e51d4406704f6d
4
+ data.tar.gz: a73c6c26db2fd2998b8d837e803d59a27c8122d1
5
5
  SHA512:
6
- metadata.gz: a3812ee2760a1da7e40a353f49bbad985bcd01f42a0a7296f82eb8aa280ea5b663d07909feb7e97d017fbacd4b2883b33e2c7004b7855f041970714c55203cc4
7
- data.tar.gz: d39aa7fd4452dd3f8196cdc9e2e0381d6a30761f9855565cee24e7549cd744693dfa8086d95dca7ed723571004b016b9f2c81cb0cf9c29c730a4909602292e37
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, site=:sc)
28
- res = OpenURI.open_uri(url){|text| text.read }
29
- case site
30
- when :net, :sc
31
- res.force_encoding("cp932").encode!('utf-8', :undef => :replace)
32
- when :open
33
- res.force_encoding("utf-8")
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/menu/pc_menu.html'
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), type_of_2ch)).empty?
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
- nil
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>\w*)\.)?(?<openflag>open)?2ch\.(?<tld>sc|net)/
102
- { server_name: ($~[:server_name] rescue nil),
103
- board_name: ($~[:board_name] rescue nil),
104
- openflag: ($~[:openflag] rescue nil),
105
- tld: $~[:tld],
106
- thread_key: ($~[:thread_key] rescue nil)
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
@@ -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, @f_kako_log = dat.reses, dat.kako_log?
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
@@ -1,3 +1,3 @@
1
1
  module Simple2ch
2
- VERSION = "0.1.6"
2
+ VERSION = "0.1.7"
3
3
  end
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.6
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-06 00:00:00.000000000 Z
11
+ date: 2015-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler