tdiary-contrib 5.0.13 → 5.1.4

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
  SHA256:
3
- metadata.gz: '009c64dc97147efc63990a7ec5fa8983f91cb178d0387ac6e0386fe55063f610'
4
- data.tar.gz: '093f3a82c16051eceef19bd33510e340e9f7c6a4a5d4acedf7070339e2158f9b'
3
+ metadata.gz: f7589d91925dead78181297d0bfb4e994d79d2d362cbc822084367b85a593b56
4
+ data.tar.gz: 424a594824fad56caf9c40825d96c1c7eac62857dd0b04bad7028f4a7a7a5685
5
5
  SHA512:
6
- metadata.gz: 1be1619494878bffa267f790e6ce32a93219ced0b67d1da7423f39ac5facaa2d3bc223fca5757b2f09e431363da0eb6a19262b2fd2a6f9c06bb8dc50e489b98a
7
- data.tar.gz: a8fa7adf819b51d781c53a75e3596b9464194215401f8a6e5ce2d173bc4523d20f0772eef8b243e47ecd0b6ff9bc54f5c8693dcc31e6db7dfd3d056ae4688a10
6
+ metadata.gz: 656e6bdfc9982c2744c0a323e7b46037dbcf0eab0750add8b4b84807cf1ba99e6ce82f6f130c1e26139ee74dff629bdc7a14390f23537741680a0185ecef7925
7
+ data.tar.gz: '0463607988a55b8575c9fa62e16786e7f51e139f3f3cf9c461a7b3930d2efa9b782afaf52a08279e499bcc027399e4040f9a4f221cb306bcfcc7dba1d56e84a8'
@@ -0,0 +1,23 @@
1
+ /*
2
+ * gyazo.js: gyazo plugin for tDiary
3
+ *
4
+ * SPDX-License-Identifier: GPL-2.0-or-later
5
+ */
6
+ $(function() {
7
+ $('.gyazo-images img')
8
+ .on({
9
+ 'mouseenter': function(){
10
+ $(this).css('cursor', 'pointer');
11
+ },
12
+ 'mouseleave': function(){
13
+ $(this).css('cursor', 'default');
14
+ },
15
+ 'click': function(){
16
+ var url = $(this).attr('data-url');
17
+ var text = $.makePluginTag('gyazo', function(){
18
+ return ["'" + url + "'", "'[description]'"]
19
+ })
20
+ $('#body').insertAtCaret(text);
21
+ }
22
+ })
23
+ })
@@ -1,5 +1,5 @@
1
1
  module TDiary
2
2
  class Contrib
3
- VERSION = "5.0.13"
3
+ VERSION = "5.1.4"
4
4
  end
5
5
  end
@@ -20,7 +20,7 @@ add_subtitle_proc do |date, index, subtitle|
20
20
  section_url = @conf.base_url + anchor(date.strftime('%Y%m%d')) + '#p' + ('%02d' % index)
21
21
 
22
22
  if @conf['add.bookmark.delicious'] == 't' then
23
- escaped_url = URI.escape(section_url, /[^-.!~*'()\w]/n)
23
+ escaped_url = CGI.escape(section_url)
24
24
  caption += %Q|<a href="http://delicious.com/save?url=#{escaped_url}" onclick="window.open('http://delicious.com/save?v=5;noui;jump=close;url=#{escaped_url};title='+encodeURIComponent(document.title), 'delicious', 'toolbar=no,width=550,height=550'); return false">|
25
25
  caption += %Q|<img src="http://static.delicious.com/img/delicious.small.gif" width="10" height="10" style="border: 0 none;vertical-align: middle;" alt="#{@caption_delicious}">|
26
26
  caption += %Q|</a> |
@@ -0,0 +1,90 @@
1
+ #
2
+ # gyazo.rb: gyazo plugin for tDiary
3
+ #
4
+ # SPDX-License-Identifier: GPL-2.0-or-later
5
+ #
6
+ require 'net/http'
7
+ require 'json'
8
+
9
+ if /^(form|edit|formplugin|showcomment)$/ =~ @mode then
10
+ enable_js('gyazo.js')
11
+ end
12
+
13
+ def gyazo(permalink_url, alt = '[description]', style = 'photo')
14
+ size = @conf['gyazo_max_size'] || 512
15
+ begin
16
+ oembed = JSON.parse(Net::HTTP.get(URI("https://api.gyazo.com/api/oembed?url=#{permalink_url}")), symbolize_names: true)
17
+ rescue => e
18
+ @logger.error(e)
19
+ return ''
20
+ end
21
+ url = oembed[:url].gsub(%r|/thumb/\d+/|, "/thumb/#{size}/")
22
+ width = oembed[:width].to_i
23
+ height = oembed[:height].to_i
24
+ if width > 0 && height > 0
25
+ if width > height
26
+ height = size * height / width
27
+ width = size
28
+ else
29
+ width = size * width / height
30
+ height = size
31
+ end
32
+ %Q[<img src="#{url}" class="#{style}" width=#{width} height=#{height} alt="#{alt}" title="#{alt}">]
33
+ else # no size informations in API
34
+ %Q[<img src="#{url}" class="#{style}" width=#{size} alt="#{alt}" title="#{alt}">]
35
+ end
36
+ end
37
+
38
+ def gyazo_right(permalink_url, alt = '[description]')
39
+ gyazo(permalink_url, alt, 'right')
40
+ end
41
+
42
+ def gyazo_left(permalink_url, alt = '[description]')
43
+ gyazo(permalink_url, alt, 'left')
44
+ end
45
+
46
+ def gyazo_list
47
+ endpoint = "https://api.gyazo.com/api/images"
48
+ access_token = @conf['gyazo_token']
49
+ return [] if access_token == nil || access_token.empty?
50
+ per_page = @conf['gyazo_max_images'] || 5
51
+ uri = "#{endpoint}?access_token=#{access_token};per_page=#{per_page}"
52
+ begin
53
+ JSON.parse(Net::HTTP.get(URI(uri)), symbolize_names: true).map{|i|
54
+ [i[:permalink_url], i[:thumb_url]]
55
+ }.delete_if{|is|
56
+ is[1].empty?
57
+ }
58
+ rescue => e
59
+ @logger.error(e)
60
+ return []
61
+ end
62
+ end
63
+
64
+ add_form_proc() do |date|
65
+ '<div class="form"><div class="caption">Gyazo</div><div class="gyazo-images">' +
66
+ gyazo_list.map{|i|
67
+ %Q[<img src="#{i[1]}" data-url="#{i[0]}"> ]
68
+ }.join +
69
+ '</div></div>'
70
+ end
71
+
72
+ add_conf_proc('gyazo', 'Gyazo') do
73
+ if @mode == 'saveconf'
74
+ @conf['gyazo_token'] = @cgi.params['gyazo_token'][0]
75
+ @conf['gyazo_max_images'] = @cgi.params['gyazo_max_images'][0].to_i
76
+ @conf['gyazo_max_size'] = @cgi.params['gyazo_max_size'][0].to_i
77
+ end
78
+ @conf['gyazo_max_images'] = 5 if @conf['gyazo_max_images'].to_i < 1
79
+ @conf['gyazo_max_size'] = 512 if @conf['gyazo_max_size'].to_i < 1
80
+
81
+ r = ''
82
+ r << %Q|<h3 class="subtitle">Gyazo API Access Token</h3>|
83
+ r << %Q|<p>Get your token from <a href="https://gyazo.com/oauth/applications">Gyazo Applications</a></p>|
84
+ r << %Q|<p><input name="gyazo_token" value="#{h @conf['gyazo_token']}" size=64></p>|
85
+ r << %Q|<h3 class="subtitle">Max images in list</h3>|
86
+ r << %Q|<p><input name="gyazo_token" value="#{h @conf['gyazo_max_images']}" size=3></p>|
87
+ r << %Q|<h3 class="subtitle">Max image size</h3>|
88
+ r << %Q|<p><input name="gyazo_token" value="#{h @conf['gyazo_max_size']}" size=4> px</p>|
89
+ r
90
+ end
@@ -8,7 +8,7 @@
8
8
  # Author: ishinao <ishinao@ishinao.net>
9
9
  #
10
10
 
11
- add_body_leave_proc(Proc.new do |date|
11
+ add_body_leave_proc do |date|
12
12
  if @mode == 'day' or @mode == 'latest'
13
13
  diary = @diaries[date.strftime('%Y%m%d')]
14
14
  pnum = 1
@@ -33,7 +33,7 @@ add_body_leave_proc(Proc.new do |date|
33
33
  else
34
34
  ''
35
35
  end
36
- end)
36
+ end
37
37
 
38
38
  # rss-recent.rb: RSS recent plugin
39
39
  #
@@ -1,3 +1,4 @@
1
+ # coding: utf-8
1
2
  # image_plugin_ex.rb
2
3
  # version 0.3
3
4
  # -pv-
@@ -86,11 +87,11 @@
86
87
 
87
88
  enable_js("image_ex.js")
88
89
 
89
- add_body_enter_proc(Proc.new do |date|
90
+ add_body_enter_proc do |date|
90
91
  @image_date = date.strftime("%Y%m%d")
91
92
  @image_year = date.strftime("%Y")
92
93
  ""
93
- end)
94
+ end
94
95
 
95
96
 
96
97
  def image( id, alt = "image", id2 = nil, width = nil, place="none" )
@@ -199,7 +200,7 @@ add_form_proc do |date|
199
200
  imageex_convertedsize = %Q[#{imageex_convertedheight}x#{imageex_convertedwidth}]
200
201
  imageex_convertedsize
201
202
  end
202
- system(imageex_convertpath , "-geometry", imageex_convertedsize , orig, new)
203
+ system(imageex_convertpath , "-auto-orient", "-geometry", imageex_convertedsize , orig, new)
203
204
  if FileTest::size?( new ) == 0
204
205
  File::delete( new )
205
206
  end
@@ -373,7 +374,7 @@ add_form_proc do |date|
373
374
  posttable << %Q[</TR></TABLE>]
374
375
  end
375
376
 
376
- if @conf.respond_to?(:style) and @conf.style =~ /Wiki$/i
377
+ if @conf.respond_to?(:style) and @conf.style =~ /(Wiki|GFM)$/i
377
378
  image_plugin_tag1 = "{{"
378
379
  image_plugin_tag2 = "}}"
379
380
  elsif @conf.respond_to?(:style) and @conf.style =~ /RD$/i
@@ -10,7 +10,6 @@ require 'uri'
10
10
  require 'net/http'
11
11
  require 'open-uri'
12
12
 
13
-
14
13
  def instagram(*args)
15
14
  uri = URI::parse(args[0])
16
15
  return instagram_iframe(*args) if uri.scheme.nil?
@@ -19,7 +18,9 @@ end
19
18
 
20
19
  def instagram_iframe(code, width=612, height=700)
21
20
  return <<-BODY
22
- <iframe src="//instagram.com/p/#{code}/embed/" width="#{width}" height="#{height}" frameborder="0" scrolling="no" allowtransparency="true"></iframe>
21
+ <div class="embed embed-instagram">
22
+ <iframe src="//instagram.com/p/#{code}/embed/" width="#{width}" height="#{height}" frameborder="0" scrolling="no" allowtransparency="true"></iframe>
23
+ </div>
23
24
  BODY
24
25
  end
25
26
 
@@ -0,0 +1,40 @@
1
+ #
2
+ # Japanese resource of openBD plugin
3
+ #
4
+ # Copyright (C) 2020 OGAWA KenIchi <kenichi@ice.email.ne.jp>
5
+ # You can redistribute it and/or modify it under GPL2 or any later version.
6
+ #
7
+
8
+ @openbd_label_title = 'isbn_imageプラグインで商品名を'
9
+ @openbd_label_title_hide = '表示しない'
10
+ @openbd_label_title_show = '表示する'
11
+ @openbd_label_clearcache = 'キャッシュの削除'
12
+ @openbd_label_clearcache_desc = '書籍情報のキャッシュを削除する'
13
+
14
+ @openbd_label_default_image = 'デフォルトの画像ファイル'
15
+ @openbd_label_default_image_desc =
16
+ '書影がない場合に表示する画像ファイルのパスを指定します。' \
17
+ '未指定の場合はデフォルトの画像が表示されます。'
18
+
19
+ @openbd_label_image_width = '書影の表示幅'
20
+ @openbd_label_image_width_desc =
21
+ '数値を指定すると書影を表すimg要素のwidth属性に値が出力されます。'
22
+
23
+ @openbd_label_image_height = '書影の表示高'
24
+ @openbd_label_image_height_desc =
25
+ '数値を指定すると書影を表すimg要素のheight属性に値が出力されます。'
26
+
27
+ @openbd_label_detail_image_width = 'isbn_detail使用時の書影の表示幅'
28
+ @openbd_label_detail_image_width_desc =
29
+ '数値を指定すると書影を表すimg要素のwidth属性に値が出力されます。'
30
+
31
+ @openbd_label_detail_image_height = 'isbn_detail使用時の書影の表示高'
32
+ @openbd_label_detail_image_height_desc =
33
+ '数値を指定すると書影を表すimg要素のheight属性に値が出力されます。'
34
+
35
+ # Local Variables:
36
+ # mode: ruby
37
+ # indent-tabs-mode: t
38
+ # tab-width: 3
39
+ # ruby-indent-level: 3
40
+ # End:
@@ -9,7 +9,7 @@
9
9
 
10
10
  require 'nkf'
11
11
 
12
- add_body_leave_proc(Proc.new do |date|
12
+ add_body_leave_proc do |date|
13
13
 
14
14
  oldest_date = Time.local(2005, 1, 11)
15
15
  if date > oldest_date
@@ -38,7 +38,7 @@ add_body_leave_proc(Proc.new do |date|
38
38
  ''
39
39
  end
40
40
  end
41
- end)
41
+ end
42
42
 
43
43
  require "rss/rss"
44
44
 
@@ -39,7 +39,7 @@ class MyHotEntry
39
39
  # RSSを取得
40
40
  rss = nil
41
41
  rss_url = 'http://b.hatena.ne.jp/entrylist?mode=rss&url='
42
- rss_url << URI.escape(base_url, /[^-.!~*'()\w]/n)
42
+ rss_url << CGI.escape(base_url)
43
43
  rss_url << "&sort=#{options[:sort]}&threshold=#{options[:threshold]}"
44
44
  begin
45
45
  Timeout.timeout(5) do
@@ -53,7 +53,7 @@ def notify_miniblog
53
53
 
54
54
  # strip category
55
55
  sectitle.gsub!(/\[[^\]]+\] */, '')
56
- url = URI.encode(@conf.base_url + anchor("#{date}p%02d" % index), /[^-.!~*'()\w]/n)
56
+ url = CGI.escape(@conf.base_url + anchor("#{date}p%02d" % index))
57
57
  prefix = @conf['miniblog.notify.prefix']
58
58
  format = @conf['miniblog.notify.format']
59
59
  source = 'tdiary/notify_miniblog.rb'
@@ -0,0 +1,306 @@
1
+ # openbd.rb
2
+ #
3
+ # Copyright (C) 2020 OGAWA KenIchi <kenichi@ice.email.ne.jp>
4
+ # You can redistribute it and/or modify it under GPL2 or any later version.
5
+ #
6
+
7
+ require "net/http"
8
+ require "json"
9
+ require "uri"
10
+
11
+ module OpenBD
12
+ class Item
13
+ attr_reader :isbn
14
+
15
+ def initialize(isbn, json)
16
+ @isbn = isbn
17
+ @data = JSON.parse(json)[0] || {}
18
+ end
19
+
20
+ def normalized_isbn
21
+ nil_if_empty(@data.dig("summary", "isbn"))
22
+ end
23
+
24
+ def image_url
25
+ nil_if_empty(@data.dig("summary", "cover"))
26
+ end
27
+
28
+ def title
29
+ nil_if_empty(@data.dig("summary", "title"))
30
+ end
31
+
32
+ def author
33
+ nil_if_empty(@data.dig("summary", "author"))
34
+ end
35
+
36
+ def title_and_author
37
+ author ? "#{title}(#{author})" : title
38
+ end
39
+
40
+ def publisher
41
+ nil_if_empty(@data.dig("summary", "publisher"))
42
+ end
43
+
44
+ def price
45
+ price = @data.dig("onix", "ProductSupply", "SupplyDetail", "Price", 0)
46
+ return nil unless price
47
+ value = price["PriceAmount"]
48
+ currency_code = price["CurrencyCode"]
49
+ case currency_code
50
+ when "JPY"
51
+ "#{value}円"
52
+ else
53
+ "#{currency_code} #{value}"
54
+ end
55
+ end
56
+
57
+ private def nil_if_empty(s)
58
+ s&.empty? ? nil : s
59
+ end
60
+ end
61
+
62
+ class Cache
63
+ def initialize(cache_path)
64
+ @dir = File.join(cache_path, "openbd")
65
+ end
66
+
67
+ def load(isbn)
68
+ File.read(path_for(isbn))
69
+ rescue Errno::ENOENT
70
+ nil
71
+ end
72
+
73
+ def save(isbn, json)
74
+ Dir.mkdir(@dir) unless File.directory?(@dir)
75
+ File.write(path_for(isbn), json)
76
+ end
77
+
78
+ def clear
79
+ Dir.glob("#{@dir}/*").each { |f| File.delete(f) }
80
+ end
81
+
82
+ private def path_for(isbn)
83
+ File.join(@dir, "#{isbn}.json")
84
+ end
85
+ end
86
+
87
+ module_function
88
+
89
+ def get_item(isbn, cache_path, mode)
90
+ cache = OpenBD::Cache.new(cache_path)
91
+ json = cache.load(isbn) if mode != "preview"
92
+ unless json
93
+ uri = URI("https://api.openbd.jp/v1/get?isbn=#{isbn}")
94
+ response = Net::HTTP.get_response(uri)
95
+ response.value # raise on errors
96
+ json = response.body
97
+ cache.save(isbn, json)
98
+ end
99
+ OpenBD::Item.new(isbn, json)
100
+ end
101
+
102
+ def reference_url(item)
103
+ isbn13 = item.normalized_isbn
104
+ if isbn13
105
+ "https://www.hanmoto.com/bd/isbn/#{isbn13}"
106
+ else
107
+ isbn = item.isbn.length == 13 ? isbn13to10(item.isbn) : item.isbn
108
+ "https://www.amazon.co.jp/dp/#{isbn}"
109
+ end
110
+ end
111
+
112
+ def image_info(item, conf)
113
+ width = conf["openbd.image_width"]
114
+ height = conf["openbd.image_height"]
115
+ url = item.image_url || conf["openbd.default_image"]
116
+ if !url || url.empty?
117
+ url = <<~EOS
118
+ data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAECAIAAADETxJQAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
119
+ jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAXSURBVBhXYzx8+DADGDBBKCDAZDEwAABXngJR
120
+ 1c/tyAAAAABJRU5ErkJggg==
121
+ EOS
122
+ url.rstrip!
123
+ width = 200 if !width && !height
124
+ end
125
+ { url: url, width: width, height: height }
126
+ end
127
+
128
+ # from tdiary-core/lib/aws/pa_api.rb
129
+ def isbn13to10(isbn13)
130
+ sum, = isbn13[3, 9].split(//).map(&:to_i).reduce([0,10]){|s,d|[s[0] + d * s[1], s[1]-1]}
131
+ return isbn13[3, 9] + %w(0 1 2 3 4 5 6 7 8 9 X 0)[11 - sum % 11]
132
+ end
133
+ end
134
+
135
+ def openbd_image(item, label, css_class)
136
+ label ||= item.title_and_author || item.isbn
137
+ href = OpenBD.reference_url(item)
138
+ if @mode == "categoryview"
139
+ img = ""
140
+ else
141
+ alt = ""
142
+ if @conf["amazon.hidename"] || css_class != "amazon"
143
+ label, alt = alt, label
144
+ end
145
+ image = OpenBD.image_info(item, @conf)
146
+ width = image[:width]
147
+ height = image[:height]
148
+ img_width = width && %Q|width="#{h width}"|
149
+ img_height = height && %Q|height="#{h height}"|
150
+ img = <<~EOS
151
+ <img class="#{h css_class}"
152
+ src="#{h image[:url]}" #{img_width} #{img_height}
153
+ alt="#{h alt}">
154
+ EOS
155
+ end
156
+ %Q|<a href="#{h href}">#{img.rstrip}#{h label}</a>|
157
+ end
158
+
159
+ def openbd_process(isbn, &block)
160
+ isbn = isbn.to_s.strip.gsub("-", "")
161
+ block.call(OpenBD.get_item(isbn, @cache_path, @mode))
162
+ rescue => e
163
+ @logger.error "openbd.rb: isbn=#{isbn}, message=#{e.message}"
164
+ message = "[openBD plugin error]"
165
+ if @mode == "preview"
166
+ message << %Q|<span class="message">(#{h e.message})</span>|
167
+ end
168
+ message
169
+ end
170
+
171
+ def isbn_image(isbn, label = nil )
172
+ openbd_process(isbn) do |item|
173
+ openbd_image(item, label, "amazon")
174
+ end
175
+ end
176
+
177
+ def isbn_image_left(isbn, label = nil)
178
+ openbd_process(isbn) do |item|
179
+ openbd_image(item, label, "left")
180
+ end
181
+ end
182
+
183
+ def isbn_image_right(isbn, label = nil)
184
+ openbd_process(isbn) do |item|
185
+ openbd_image(item, label, "right")
186
+ end
187
+ end
188
+
189
+ def isbn(isbn, label = nil)
190
+ openbd_process(isbn) do |item|
191
+ label ||= item.title_and_author || item.isbn
192
+ %Q|<a href="#{h OpenBD.reference_url(item)}">#{h label}</a>|
193
+ end
194
+ end
195
+
196
+ def isbn_detail(isbn)
197
+ openbd_process(isbn) do |item|
198
+ image = OpenBD.image_info(item, @conf)
199
+ width = @conf["openbd.detail_image_width"]
200
+ height = @conf["openbd.detail_image_height"]
201
+ width = 57 if !width && !height
202
+ img_width = width && %Q|width="#{h width}"|
203
+ img_height = height && %Q|height="#{h height}"|
204
+ url = OpenBD.reference_url(item)
205
+ <<-EOS
206
+ <a class="amazon-detail" href="#{h url}"><span class="amazon-detail">
207
+ <img class="amazon-detail left"
208
+ src="#{h image[:url]}" #{img_width} #{img_height} alt="">
209
+ <span class="amazon-detail-desc">
210
+ <span class="amazon-title">#{h item.title}</span><br>
211
+ <span class="amazon-author">#{h item.author || "-"}</span><br>
212
+ <span class="amazon-label">#{h item.publisher || "-"}</span><br>
213
+ <span class="amazon-price">#{h item.price || "-"}</span>
214
+ </span>
215
+ </span></a>
216
+ EOS
217
+ end
218
+ end
219
+
220
+ # for compatibility
221
+ alias isbnImgLeft isbn_image_left
222
+ alias isbnImgRight isbn_image_right
223
+ alias isbnImg isbn_image
224
+ alias amazon isbn_image
225
+
226
+ add_conf_proc("openbd", "openBD") do
227
+ if @mode == "saveconf" then
228
+ @conf["amazon.hidename"] = (@cgi.params["openbd.hidename"][0] == "true")
229
+ @conf["openbd.default_image"] = @cgi.params["openbd.default_image"][0]
230
+
231
+ to_px = lambda do |v|
232
+ i = v.to_i
233
+ i > 0 ? i : nil
234
+ end
235
+ @conf["openbd.image_width"] =
236
+ to_px[@cgi.params["openbd.image_width"][0]]
237
+ @conf["openbd.image_height"] =
238
+ to_px[@cgi.params["openbd.image_height"][0]]
239
+ @conf["openbd.detail_image_width"] =
240
+ to_px[@cgi.params["openbd.detail_image_width"][0]]
241
+ @conf["openbd.detail_image_height"] =
242
+ to_px[@cgi.params["openbd.detail_image_height"][0]]
243
+
244
+ if @cgi.params["openbd.clearcache"][0] == "true"
245
+ OpenBD::Cache.new(@cache_path).clear
246
+ end
247
+ end
248
+
249
+ hidename = @conf["amazon.hidename"]
250
+ <<-EOS
251
+ <h3>#{h @openbd_label_title}</h3>
252
+ <p><select name="openbd.hidename">
253
+ <option value="true"#{" selected" if hidename}>
254
+ #{h @openbd_label_title_hide}
255
+ </option>
256
+ <option value="false"#{" selected" unless hidename}>
257
+ #{h @openbd_label_title_show}
258
+ </option>
259
+ </select></p>
260
+
261
+ <h3>#{h @openbd_label_clearcache}</h3>
262
+ <p><label for="openbd.clearcache">
263
+ <input type="checkbox" id="openbd.clearcache" name="openbd.clearcache" value="true">
264
+ #{h @openbd_label_clearcache_desc}
265
+ </label></p>
266
+
267
+ <h3>#{h @openbd_label_default_image}</h3>
268
+ <p>#{h @openbd_label_default_image_desc}</p>
269
+ <p><input type="text" name="openbd.default_image" value="#{h @conf["openbd.default_image"]}" size="70"></p>
270
+
271
+ <h3>#{h @openbd_label_image_width}</h3>
272
+ <p>#{h @openbd_label_image_width_desc}</p>
273
+ <p>
274
+ <input type="text" name="openbd.image_width" value="#{h @conf["openbd.image_width"]}" size="5">
275
+ <label for="openbd.image_width">px</label>
276
+ </p>
277
+
278
+ <h3>#{h @openbd_label_image_height}</h3>
279
+ <p>#{h @openbd_label_image_height_desc}</p>
280
+ <p>
281
+ <input type="text" name="openbd.image_height" value="#{h @conf["openbd.image_height"]}" size="5">
282
+ <label for="openbd.image_height">px</label>
283
+ </p>
284
+
285
+ <h3>#{h @openbd_label_detail_image_width}</h3>
286
+ <p>#{h @openbd_label_detail_image_width_desc}</p>
287
+ <p>
288
+ <input type="text" name="openbd.detail_image_width" value="#{h @conf["openbd.detail_image_width"]}" size="5">
289
+ <label for="openbd.detail_image_width">px</label>
290
+ </p>
291
+
292
+ <h3>#{h @openbd_label_detail_image_height}</h3>
293
+ <p>#{h @openbd_label_detail_image_height_desc}</p>
294
+ <p>
295
+ <input type="text" name="openbd.detail_image_height" value="#{h @conf["openbd.detail_image_height"]}" size="5">
296
+ <label for="openbd.detail_image_height">px</label>
297
+ </p>
298
+ EOS
299
+ end
300
+
301
+ # Local Variables:
302
+ # mode: ruby
303
+ # indent-tabs-mode: t
304
+ # tab-width: 3
305
+ # ruby-indent-level: 3
306
+ # End:
@@ -3,7 +3,7 @@
3
3
  # Original code from tatsu_zine.rb by KADO Masanori <kdmsnr@gmail.com>
4
4
  # You can redistribute it and/or modify it under GPL.
5
5
  #
6
- # display book info in http://p.booklog.jp/ like amazon.rb
6
+ # display book info in https://puboo.jp/ like amazon.rb
7
7
  # USAGE: {{puboo 9999}}
8
8
 
9
9
  require 'open-uri'
@@ -33,12 +33,12 @@ def puboo( id, doc = nil )
33
33
  return result
34
34
  end
35
35
 
36
- link = "http://p.booklog.jp/book/#{id}"
37
- doc ||= open( link ).read.force_encoding('UTF-8')
38
- title = doc.match(%r|<meta property="og:title"\s*content="(.*)"|).to_a[1]
36
+ link = "https://puboo.jp/book/#{id}"
37
+ doc ||= URI.open( link ).read.force_encoding('UTF-8')
38
+ title = doc.match(%r|<meta property="og:title"\s*content="(.*)"|).to_a[1].split(/|/)[0]
39
39
  image = doc.match(%r|<meta property="og:image"\s*content="(.*)"|).to_a[1]
40
- price = doc.match(%r|<th class="th_2">価格</th>.*?<span>(.*?)</span>.*?<br />|m).to_a[1]
41
- author = doc.match(%r|<th>作者</th>(.*?)</td>|m).to_a[1].gsub(/<.*?>/, '').strip
40
+ price = doc.match(%r|<span\s*class="h2">(.*?)</span>|m).to_a[1]
41
+ author = doc.match(%r|著: <a.*?>(.*?)</a>|m).to_a[1]
42
42
 
43
43
  result = <<-EOS
44
44
  <a class="amazon-detail" href="#{h link}"><span class="amazon-detail">
@@ -61,7 +61,7 @@ end
61
61
 
62
62
  if __FILE__ == $0
63
63
  require 'test/unit'
64
- class TestTatsuZine < Test::Unit::TestCase
64
+ class TestPuboo < Test::Unit::TestCase
65
65
  def setup
66
66
  @conf = Struct.new("Conf", :secure).new(true)
67
67
  def h(str); str; end
@@ -69,14 +69,14 @@ if __FILE__ == $0
69
69
 
70
70
  def test_puboo
71
71
  expect = <<-EOS
72
- <a class="amazon-detail" href="http://p.booklog.jp/book/70667"><span class="amazon-detail">
73
- <img class="amazon-detail left" src="http://img.booklog.jp/667BDD9E-B13E-11E2-82F3-6425FFDA975F_l.jpg"
72
+ <a class="amazon-detail" href="https://puboo.jp/book/70667"><span class="amazon-detail">
73
+ <img class="amazon-detail left" src="https://img.puboo.jp/667BDD9E-B13E-11E2-82F3-6425FFDA975F_l.jpg"
74
74
  height="150" width="100"
75
75
  alt="入門Puppet - Automate Your Infrastructure">
76
76
  <span class="amazon-detail-desc">
77
77
  <span class="amazon-title">入門Puppet - Automate Your Infrastructure</span><br>
78
78
  <span class="amazon-author">栗林健太郎</span><br>
79
- <span class="amazon-price">890円(税込)</span>
79
+ <span class="amazon-price">890円</span>
80
80
  </span><br style="clear: left">
81
81
  </span></a>
82
82
  EOS
@@ -52,9 +52,9 @@ end
52
52
  if @mode =~ /^(latest|day|month|nyear)$/
53
53
  socialbutton_footer = Proc.new { %Q|<div class="socialbuttons"></div>| }
54
54
  if respond_to?(:blogkit?) && blogkit?
55
- add_body_leave_proc(socialbutton_footer)
55
+ add_body_leave_proc(&socialbutton_footer)
56
56
  else
57
- add_section_leave_proc(socialbutton_footer)
57
+ add_section_leave_proc(&socialbutton_footer)
58
58
  end
59
59
 
60
60
  # load javascript
@@ -29,7 +29,6 @@ end
29
29
 
30
30
  def twitter_statuses_show_api( tweet_id )
31
31
  url = "https://api.twitter.com/1.1/statuses/show.json"
32
- unsafe = /[^a-zA-Z0-9\-\.\_\~]/
33
32
  parameters = {
34
33
  :id => tweet_id
35
34
  }
@@ -41,11 +40,11 @@ def twitter_statuses_show_api( tweet_id )
41
40
  :oauth_token => @conf["twitter_quote.oauth_token"],
42
41
  :oauth_version => "1.0"
43
42
  }
44
- data = "GET&#{URI.escape( url, unsafe )}&"
45
- data << URI.escape( oauth_parameters.merge( parameters ).sort.map{|k, v| "#{k}=#{v}" }.join( "&" ), unsafe )
43
+ data = "GET&#{CGI.escape( url )}&"
44
+ data << CGI.escape( oauth_parameters.merge( parameters ).sort.map{|k, v| "#{k}=#{v}" }.join( "&" ) )
46
45
  oauth_parameters[:oauth_signature] = [OpenSSL::HMAC.digest(
47
46
  OpenSSL::Digest::SHA1.new,
48
- URI.escape( "#{@conf["twitter_quote.oauth_consumer_secret"]}&#{@conf["twitter_quote.oauth_token_secret"]}" ),
47
+ CGI.escape( "#{@conf["twitter_quote.oauth_consumer_secret"]}&#{@conf["twitter_quote.oauth_token_secret"]}" ),
49
48
  data
50
49
  )].pack( "m" ).chomp
51
50
 
@@ -53,7 +52,7 @@ def twitter_statuses_show_api( tweet_id )
53
52
  proxy = 'http://' + proxy if proxy
54
53
 
55
54
  headers = {
56
- "Authorization" => %Q[OAuth #{oauth_parameters.map{|k ,v| "#{URI.escape( k.to_s, unsafe )}=\"#{URI.escape( v, unsafe )}\""}.join( "," )}],
55
+ "Authorization" => %Q[OAuth #{oauth_parameters.map{|k ,v| "#{CGI.escape( k.to_s )}=\"#{CGI.escape( v )}\""}.join( "," )}],
57
56
  :proxy => proxy
58
57
  }
59
58
  Timeout.timeout( 20 ) do
@@ -1,45 +1,9 @@
1
- # twitter.rb $Revision: 1.1 $
2
- # Copyright (C) 2007 Michitaka Ohno <elpeo@mars.dti.ne.jp>
3
- # You can redistribute it and/or modify it under GPL2.
4
-
5
- require 'timeout'
6
- require 'time'
7
- require 'open-uri'
8
- require 'rexml/document'
9
-
10
- @twitter_statuses = []
11
-
12
- if /^(latest|day)$/ =~ @mode then
13
- add_header_proc do
14
- xml = nil
15
- Timeout.timeout( 5 ) do
16
- begin
17
- xml = open( "http://twitter.com/statuses/user_timeline/#{@conf['twitter.user']}.xml" ){|f| f.read}
18
- rescue Exception
19
- end
20
- end
21
- doc = REXML::Document.new( xml ).root if xml
22
- if doc then
23
- doc.elements.each( 'status' ) do |e|
24
- @twitter_statuses << [@conf.to_native( e.elements['text'].text ), Time.parse( e.elements['created_at'].text ).localtime]
25
- end
26
- end
27
- ''
28
- end
29
- end
30
-
1
+ #
2
+ # twitter plugin is deprecate
3
+ #
31
4
  add_body_leave_proc do |date|
32
- today_statuses = []
33
- @twitter_statuses.each do |t, d|
34
- today_statuses << [t, d] if d.to_a[3,3] == date.to_a[3,3]
35
- end
36
- if !today_statuses.empty?
37
- r = %Q[<div class="section">]
38
- r << %Q[<h3><a href="http://twitter.com/#{@conf['twitter.user']}">Twitter statuses</a></h3>]
39
- today_statuses.sort{|a, b| b.last<=>a.last}.each do |t, d|
40
- r << %Q[<p><strong>#{CGI::escapeHTML( t )}</strong> (#{d.strftime( '%H:%M:%S' )})</p>]
41
- end
42
- r << %Q[</div>]
5
+ if @mode == 'preview'
6
+ %Q[<p class="message">twitter plugin was deprecated.</p>]
43
7
  else
44
8
  ''
45
9
  end
@@ -1,59 +1,10 @@
1
- # twitter_js.rb $Revision: 1.1 $
2
- # Copyright (C) 2007 Michitaka Ohno <elpeo@mars.dti.ne.jp>
3
- # You can redistribute it and/or modify it under GPL2.
4
-
5
- if /\A(?:latest|day)\z/ =~ @mode then
6
- if @conf['twitter.user'] then
7
- twitter_user = @conf['twitter.user']
8
- add_header_proc do
9
- result = <<-HTML
10
- <script type="text/javascript"><!--
11
- function twitter_cb(a){
12
- var f=function(n){return (n<10?'0':'')+n};
13
- for(var i=0,l=a.length;i<l;i++){
14
- var d=new Date(a[i]['created_at'].replace('+0000','UTC'));
15
- var id='twitter_statuses_'+f(d.getFullYear())+f(d.getMonth()+1)+f(d.getDate());
16
- var e=document.getElementById(id);
17
- if(!e) continue;
18
- if(!e.innerHTML) e.innerHTML='<h3><a href="http://twitter.com/#{h twitter_user}">Twitter statuses</a></h3>';
19
- e.innerHTML+='<p><strong>'+a[i]['text']+'</strong> ('+f(d.getHours())+':'+f(d.getMinutes())+':'+f(d.getSeconds())+')</p>';
20
- }
21
- }
22
- function twitter_js(){
23
- var e=document.createElement('script');
24
- e.type='text/javascript';
25
- e.src='http://twitter.com/statuses/user_timeline/#{h twitter_user}.json?callback=twitter_cb&amp;count=20';
26
- document.documentElement.appendChild(e);
27
- }
28
- if(window.addEventListener){
29
- window.addEventListener('load',twitter_js,false);
30
- }else if(window.attachEvent){
31
- window.attachEvent('onload',twitter_js);
32
- }else{
33
- window.onload=twitter_js;
34
- }
35
- // --></script>
36
- HTML
37
- result.gsub( /^\t\t/, '' )
38
- end
39
-
40
- add_body_leave_proc do |date|
41
- result = <<-HTML
42
- <div id="twitter_statuses_#{date.strftime( "%Y%m%d" )}" class="section"></div>
43
- HTML
44
- result.gsub( /^\t\t/, '' )
45
- end
1
+ #
2
+ # twitter_js plugin is deprecate
3
+ #
4
+ add_body_leave_proc do |date|
5
+ if @mode == 'preview'
6
+ %Q[<p class="message">twitter_js plugin was deprecated.</p>]
7
+ else
8
+ ''
46
9
  end
47
10
  end
48
-
49
- add_conf_proc( 'twitter_js', 'Twitter' ) do
50
-
51
- if @mode == 'saveconf' then
52
- @conf['twitter.user'] = @cgi.params['twitter.user'][0]
53
- end
54
-
55
- <<-HTML
56
- <h3 class="subtitle">Account Name</h3>
57
- <p><input name="twitter.user" value="#{h @conf['twitter.user']}"></p>
58
- HTML
59
- end
@@ -26,7 +26,7 @@ Net::HTTP.version_1_2
26
26
  def kousei_api( sentence )
27
27
  appid = @conf['yahoo_kousei.appid']
28
28
 
29
- query = "appid=#{appid}&sentence=#{URI.encode( sentence.gsub( /\n/, '' ) )}"
29
+ query = "appid=#{appid}&sentence=#{CGI.escape( sentence.gsub( /\n/, '' ) )}"
30
30
  query << "&filter_group=" + @conf['yahoo_kousei.filter_group'] if @conf['yahoo_kousei.filter_group']
31
31
  query << "&no_filter=" + @conf['yahoo_kousei.no_filter'] if @conf['yahoo_kousei.no_filter']
32
32
 
@@ -100,7 +100,7 @@ def yo_update_subscribers_count
100
100
  raise YoUpdateError, "Yo API Key is not set"
101
101
  end
102
102
  req = Net::HTTP::Get.new(
103
- URI("http://api.justyo.co/subscribers_count/?api_token=#{URI.escape(api_key)}")
103
+ URI("http://api.justyo.co/subscribers_count/?api_token=#{CGI.escape(api_key)}")
104
104
  )
105
105
  res = yo_update_access_api(req)
106
106
  data = res.body
@@ -49,19 +49,19 @@ class PluginFake
49
49
  @conf_procs << block
50
50
  end
51
51
 
52
- def add_edit_proc( block = Proc::new )
52
+ def add_edit_proc(&block)
53
53
  @edit_procs << block
54
54
  end
55
55
 
56
- def add_header_proc( block = Proc::new )
56
+ def add_header_proc(&block)
57
57
  @header_procs << block
58
58
  end
59
59
 
60
- def add_footer_proc( block = Proc::new )
60
+ def add_footer_proc(&block)
61
61
  @footer_procs << block
62
62
  end
63
63
 
64
- def add_update_proc( block = Proc::new )
64
+ def add_update_proc(&block)
65
65
  @update_procs << block
66
66
  end
67
67
 
@@ -89,7 +89,7 @@ class PluginFake
89
89
  r.join.chomp
90
90
  end
91
91
 
92
- def add_body_enter_proc( block = Proc::new )
92
+ def add_body_enter_proc(&block)
93
93
  @body_enter_procs << block
94
94
  end
95
95
 
@@ -101,7 +101,7 @@ class PluginFake
101
101
  r.join.chomp
102
102
  end
103
103
 
104
- def add_body_leave_proc( block = Proc::new )
104
+ def add_body_leave_proc(&block)
105
105
  @body_leave_procs << block
106
106
  end
107
107
 
@@ -200,7 +200,7 @@ def fake_plugin( name_sym, cgi=nil, base=nil, &block )
200
200
  plugin.instance_variable_set(:@cache_path, @cache_path)
201
201
 
202
202
  plugin.instance_eval do
203
- eval( File.read( file_path ), binding,
203
+ eval( File.open(file_path, 'r:utf-8').read, binding,
204
204
  "(#{File.basename(file_path)})", 1 )
205
205
  end
206
206
  plugin_sym = plugin_name.to_sym
@@ -844,7 +844,7 @@ class Hatena::Google
844
844
  end
845
845
 
846
846
  def convert(mode)
847
- uri = 'http://www.google.com/search?q=%s&amp;ie=euc-jp&amp;oe=euc-jp' % URI.escape(@str, /[^-_.!~*'()a-zA-Z0-9]/)
847
+ uri = 'http://www.google.com/search?q=%s&amp;ie=euc-jp&amp;oe=euc-jp' % CGI.escape(@str)
848
848
  return uri unless @tag_p
849
849
  template=nil
850
850
  if mode == :CHTML
@@ -889,7 +889,7 @@ class Hatena::Keyword
889
889
  end
890
890
 
891
891
  def convert(mode)
892
- uri = '%skeyword/%s' % [@group, URI.escape(@str, /[^-_.!~*'()a-zA-Z0-9]/)]
892
+ uri = '%skeyword/%s' % [@group, CGI.escape(@str)]
893
893
  return uri unless @tag_p
894
894
  template=nil
895
895
  if mode == :CHTML
@@ -958,7 +958,7 @@ class Hatena::AmazonSearch
958
958
  end
959
959
 
960
960
  def convert(mode)
961
- uri = 'http://www.amazon.co.jp/exec/obidos/external-search?mode=blended&amp;tag=%s&amp;encoding-string-jp=%%c6%%fc%%cb%%dc%%b8%%ec&amp;keyword=%s' % [Hatena.conf['amazon.aid'] || '', URI.escape(@str, /[^-_.!~*'()a-zA-Z0-9]/)]
961
+ uri = 'http://www.amazon.co.jp/exec/obidos/external-search?mode=blended&amp;tag=%s&amp;encoding-string-jp=%%c6%%fc%%cb%%dc%%b8%%ec&amp;keyword=%s' % [Hatena.conf['amazon.aid'] || '', CGI.escape(@str)]
962
962
  return uri unless @tag_p
963
963
  template=nil
964
964
  if mode == :CHTML
@@ -259,10 +259,10 @@ end
259
259
  # Callback Functions
260
260
 
261
261
  # this is for view_exif().
262
- add_body_enter_proc(Proc.new do |date|
262
+ add_body_enter_proc do |date|
263
263
  @image_date_exif = date.strftime("%Y%m%d")
264
264
  ""
265
- end)
265
+ end
266
266
 
267
267
  # Update Proc of the plugin
268
268
  add_update_proc do
@@ -49,7 +49,7 @@ end
49
49
 
50
50
  # Callback Functions
51
51
 
52
- add_body_enter_proc(Proc.new do |date|
52
+ add_body_enter_proc do |date|
53
53
  @image_date_exif = date.strftime("%Y%m%d")
54
54
  ""
55
- end)
55
+ end
@@ -439,7 +439,7 @@ def escape(str)
439
439
  end
440
440
 
441
441
  def escape_url(u)
442
- escape(URI.encode(u))
442
+ escape(CGI.escape(u))
443
443
  end
444
444
 
445
445
  main
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tdiary-contrib
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.13
4
+ version: 5.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - tDiary contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-28 00:00:00.000000000 Z
11
+ date: 2020-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tdiary
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coderay
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -115,7 +129,21 @@ dependencies:
115
129
  - !ruby/object:Gem::Version
116
130
  version: '0'
117
131
  - !ruby/object:Gem::Dependency
118
- name: pry
132
+ name: ruby-debug-ide
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: debase
119
147
  requirement: !ruby/object:Gem::Requirement
120
148
  requirements:
121
149
  - - ">="
@@ -194,6 +222,7 @@ files:
194
222
  - js/editor.js
195
223
  - js/flickr.js
196
224
  - js/google_photos.js
225
+ - js/gyazo.js
197
226
  - js/hide_sidebar_smartphone.js
198
227
  - js/image_ex.js
199
228
  - js/jquery.socialbutton.js
@@ -268,6 +297,7 @@ files:
268
297
  - plugin/google_sitemaps.rb
269
298
  - plugin/google_universal_analytics.rb
270
299
  - plugin/google_webmaster.rb
300
+ - plugin/gyazo.rb
271
301
  - plugin/hatena_bookmark_nocomment.rb
272
302
  - plugin/hatena_star.rb
273
303
  - plugin/hb_footer.rb
@@ -290,6 +320,7 @@ files:
290
320
  - plugin/ja/livedoor_weather.rb
291
321
  - plugin/ja/microsummary.rb
292
322
  - plugin/ja/nicovideo.rb
323
+ - plugin/ja/openbd.rb
293
324
  - plugin/ja/openid.rb
294
325
  - plugin/ja/section_footer.rb
295
326
  - plugin/ja/section_footer2.rb
@@ -319,6 +350,7 @@ files:
319
350
  - plugin/notify_miniblog.rb
320
351
  - plugin/ogp.rb
321
352
  - plugin/ohmsha_estore.rb
353
+ - plugin/openbd.rb
322
354
  - plugin/openid.rb
323
355
  - plugin/opensearch_ad.rb
324
356
  - plugin/picasa.rb
@@ -401,7 +433,6 @@ files:
401
433
  - spec/rcov.opts
402
434
  - spec/spec_helper.rb
403
435
  - spec/title_anchor_spec.rb
404
- - spec/twitter_js_spec.rb
405
436
  - spec/youtube_spec.rb
406
437
  - style/hatena_style.rb
407
438
  - style/markdown_style.rb
@@ -513,7 +544,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
513
544
  - !ruby/object:Gem::Version
514
545
  version: '0'
515
546
  requirements: []
516
- rubygems_version: 3.0.3
547
+ rubygems_version: 3.1.4
517
548
  signing_key:
518
549
  specification_version: 4
519
550
  summary: tDiary contributions package
@@ -541,5 +572,4 @@ test_files:
541
572
  - spec/rcov.opts
542
573
  - spec/spec_helper.rb
543
574
  - spec/title_anchor_spec.rb
544
- - spec/twitter_js_spec.rb
545
575
  - spec/youtube_spec.rb
@@ -1,116 +0,0 @@
1
- $:.unshift(File.dirname(__FILE__))
2
- require 'spec_helper'
3
- require 'time'
4
-
5
- describe "twitter_js plugin" do
6
- def setup_twitter_js_plugin(mode, user_id)
7
- fake_plugin(:twitter_js) { |plugin|
8
- plugin.mode = mode
9
- plugin.conf['twitter.user'] = user_id
10
- plugin.date = Time.parse("20080124")
11
- }
12
- end
13
-
14
- describe "should render javascript and div tag in day" do
15
- before do
16
- @plugin = setup_twitter_js_plugin("day", "123456789")
17
- end
18
-
19
- it "for header" do
20
- snippet = @plugin.header_proc
21
- expect(snippet).to eq(expected_html_header_snippet("123456789"))
22
- end
23
-
24
- it "for body leave" do
25
- snippet = @plugin.body_leave_proc(Time.parse("20080124"))
26
- expect(snippet).to eq(expected_html_body_snippet)
27
- end
28
- end
29
-
30
- describe "should render javascript and div tag in latest" do
31
- before do
32
- @plugin = setup_twitter_js_plugin("latest", "123456789")
33
- end
34
-
35
- it "for header" do
36
- snippet = @plugin.header_proc
37
- expect(snippet).to eq(expected_html_header_snippet("123456789"))
38
- end
39
-
40
- it "for body leave" do
41
- snippet = @plugin.body_leave_proc(Time.parse("20080124"))
42
- expect(snippet).to eq(expected_html_body_snippet)
43
- end
44
- end
45
-
46
- describe "should not render in edit" do
47
- before do
48
- @plugin = setup_twitter_js_plugin("edit", "123456789")
49
- end
50
-
51
- it "for header" do
52
- snippet = @plugin.header_proc
53
- expect(snippet).to be_empty
54
- end
55
-
56
- it "for body leave" do
57
- snippet = @plugin.body_leave_proc(Time.parse("20080124"))
58
- expect(snippet).to be_empty
59
- end
60
- end
61
-
62
- describe "should not render when user_id is empty" do
63
- before do
64
- @plugin = setup_twitter_js_plugin("edit", "")
65
- end
66
-
67
- it "for header" do
68
- snippet = @plugin.header_proc
69
- expect(snippet).to be_empty
70
- end
71
-
72
- it "for body leave" do
73
- snippet = @plugin.body_leave_proc(Time.parse("20080124"))
74
- expect(snippet).to be_empty
75
- end
76
- end
77
-
78
- def expected_html_header_snippet(user_id)
79
- expected = <<-EXPECTED
80
- <script type="text/javascript"><!--
81
- function twitter_cb(a){
82
- var f=function(n){return (n<10?'0':'')+n};
83
- for(var i=0,l=a.length;i<l;i++){
84
- var d=new Date(a[i]['created_at'].replace('+0000','UTC'));
85
- var id='twitter_statuses_'+f(d.getFullYear())+f(d.getMonth()+1)+f(d.getDate());
86
- var e=document.getElementById(id);
87
- if(!e) continue;
88
- if(!e.innerHTML) e.innerHTML='<h3><a href="http://twitter.com/#{user_id}">Twitter statuses</a></h3>';
89
- e.innerHTML+='<p><strong>'+a[i]['text']+'</strong> ('+f(d.getHours())+':'+f(d.getMinutes())+':'+f(d.getSeconds())+')</p>';
90
- }
91
- }
92
- function twitter_js(){
93
- var e=document.createElement('script');
94
- e.type='text/javascript';
95
- e.src='http://twitter.com/statuses/user_timeline/#{user_id}.json?callback=twitter_cb&amp;count=20';
96
- document.documentElement.appendChild(e);
97
- }
98
- if(window.addEventListener){
99
- window.addEventListener('load',twitter_js,false);
100
- }else if(window.attachEvent){
101
- window.attachEvent('onload',twitter_js);
102
- }else{
103
- window.onload=twitter_js;
104
- }
105
- // --></script>
106
- EXPECTED
107
- expected.gsub(/^\t/, '').chomp
108
- end
109
-
110
- def expected_html_body_snippet
111
- expected = <<-HTML
112
- <div id="twitter_statuses_20080124" class="section"></div>
113
- HTML
114
- expected.gsub( /^\t/, '' ).chomp
115
- end
116
- end