simple2ch 0.1.6 → 0.1.7

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.
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