File: openimg.rb

package info (click to toggle)
mikutter 5.0.4%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 9,700 kB
  • sloc: ruby: 21,307; sh: 181; makefile: 19
file content (66 lines) | stat: -rw-r--r-- 2,100 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# -*- coding: utf-8 -*-

require_relative 'model/photo'

module Plugin::Openimg
  ImageOpener = Struct.new(:name, :condition, :open)
end

Plugin.create :openimg do
  # 画像アップロードサービスの画像URLから実際の画像を得る。
  # サービスによってはリファラとかCookieで制御してる場合があるので、
  # "http://twitpic.com/d250g2" みたいなURLから直接画像の内容を返す。
  # String url 画像URL
  # String|nil 画像
  defevent :openimg_raw_image_from_display_url,
           prototype: [String, tcor(IO, nil)]

  # 画像アップロードサービスの画像URLから画像のPixbufを得る。
  defevent :openimg_pixbuf_from_display_url,
           prototype: [String, tcor(:pixbuf, nil), tcor(Thread, nil)]

  # 画像を取得できるURLの条件とその方法を配列で返す
  defevent :openimg_image_openers,
           prototype: [Pluggaloid::COLLECT]

  # 画像を新しいウィンドウで開く
  defevent :openimg_open,
           priority: :ui_response,
           prototype: [String, Diva::Model]

  defdsl :defimageopener do |name, condition, &proc|
    collection :openimg_image_openers do |mutation|
      mutation.add(Plugin::Openimg::ImageOpener.new(name.freeze, condition, proc).freeze)
    end
  end

  filter_openimg_raw_image_from_display_url do |display_url, content|
    unless content
      content = Plugin.collect(:openimg_image_openers).lazy.select{ |opener|
        opener.condition === display_url
      }.map{ |opener|
        opener.open.(display_url)
      }.find(&ret_nth)
      if !content and /\.(?:jpe?g|png|gif|)\z/i.match(display_url)
        begin
          uri = Diva::URI(display_url)
          if uri.scheme == 'file'
            content = File.open(uri.path, 'rb')
          else
            content = URI.open(uri.to_s, 'rb')
          end
        rescue => _
          error _
        end
      end
    end
    [display_url, content]
  end

  on_openimg_open do |display_url|
    Plugin.call(:open, display_url)
  end

  def addsupport(cond, element_rule = {}, &block); end

end