Class: SleipnirAPI::Sleipnir

Inherits:
Object
  • Object
show all
Includes:
Enumerable, Dialog, FFI::User32, KeyState, Util
Defined in:
lib/sleipnir_api/sleipnir.rb

Overview

このクラスは Sleipnir の COM オブジェクト (Sleipnir.API) の wrapper クラスです。Sleipnir 全体を操作する API を定義しています。

  • このオブジェクトは SleipnirAPI.new または SleipnirAPI.connect で取得します。

  • SleipnirAPI::KeyState と SleipnirAPI::Dialog で定義されているメソッドが利用できます。

  • このクラスは Enumerable を include しています。

例:

pnir = SleipnirAPI.new
pnir.user_agent = "Ruby/SleipnirAPI"
pnir.new_tab
pnir.open("http://www.ruby-lang.org/", true)

pnir.count                         #=> 2
pnir.active_tab.index              #=> 1
pnir.switch_to_tab("about:blank")  #=> #<SleipnirAPI::Tab:24642128>
pnir.active_tab.index              #=> 0
pnir.tabs                          #=> [#<SleipnirAPI::Tab:24642128>, #<SleipnirAPI::Tab:6685682>]
pnir.active_tab.close              #=> nil
pnir.count                         #=> 1

# Enumerable method
read, unread = pnir.partition{|tab| tab.read? }
p read
p unread

alllinks = pnir.inject([]) do |acc,tab|
  links = []
  tab.document.getElementsByTagName("a").each do |a|
    links << a.href if a.href and a.href != ""
  end
  acc + links
end
p alllinks

Constant Summary

Constants included from FFI::User32

FFI::User32::GW_HWNDFIRST, FFI::User32::GW_HWNDLAST, FFI::User32::GW_HWNDNEXT, FFI::User32::GW_HWNDPREV

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from FFI::User32

each_child_window, find_child_window_by_classname, get_class_name, get_first_child, get_first_sibling, get_last_sibling, get_next_sibling, get_prev_sibling, get_top_window, get_window, get_window_process_id, get_window_rect, get_window_thread_id, get_window_thread_process_id, list_window, with_window_dc

Methods included from FFI::Base

#define_ffi_entry

Methods included from Dialog

#beep, #input_box, #message_box, #msgbox

Methods included from KeyState

#alt_down?, #ctrl_down?, #shift_down?

Methods included from Util

#ensure_version, #join_keyword

Constructor Details

#initialize(api) ⇒ Sleipnir

Returns a new instance of Sleipnir.



68
69
70
71
72
# File 'lib/sleipnir_api/sleipnir.rb', line 68

def initialize(api)
  @api = api
  @version = api.Version
  @handle = api.Handle
end

Instance Attribute Details

#apiObject (readonly)

Sleipnir.API WIN32OLE Object



58
59
60
# File 'lib/sleipnir_api/sleipnir.rb', line 58

def api
  @api
end

#handleObject (readonly) Also known as: hwnd

Sleipnir のウィンドウハンドル



61
62
63
# File 'lib/sleipnir_api/sleipnir.rb', line 61

def handle
  @handle
end

#versionObject (readonly)

Sleipnir のバージョン



65
66
67
# File 'lib/sleipnir_api/sleipnir.rb', line 65

def version
  @version
end

Instance Method Details

#active_documentObject

call-seq:

active_document -> DispHTMLDocument or nil

アクティブなドキュメントの DispHTMLDocument (WIN32OLE オブジェクト) を取得します。アクティブなドキュメントが存在しない場合は nil を返します。



242
243
244
245
246
# File 'lib/sleipnir_api/sleipnir.rb', line 242

def active_document
  if t = active_tab
    t.document
  end
end

#active_indexObject

アクティブなドキュメントのタブ位置を取得します。



219
220
221
# File 'lib/sleipnir_api/sleipnir.rb', line 219

def active_index
  api.ActiveIndex
end

#active_index=(index) ⇒ Object

指定されたタブ位置のドキュメントをアクティブにします。



224
225
226
# File 'lib/sleipnir_api/sleipnir.rb', line 224

def active_index=(index)
  api.ActiveIndex=(index) #:nodoc:
end

#active_tabObject

call-seq:

active_tab -> SleipnirAPI::Tab or nil

アクティブなドキュメントの SleipnirAPI::Tab を取得します。アクティブなドキュメントが存在しない場合は nil を返します。



233
234
235
# File 'lib/sleipnir_api/sleipnir.rb', line 233

def active_tab
  tab(active_index)
end

#add_search_bar_historyObject

検索バーの履歴に項目を追加します。文字列がすでに存在する場合は先頭に移動されます。



360
361
362
# File 'lib/sleipnir_api/sleipnir.rb', line 360

def add_search_bar_history
  api.AddSearchBarHistory
end

#address_bar_stringObject

アドレスバーの文字列を取得します。



90
91
92
# File 'lib/sleipnir_api/sleipnir.rb', line 90

def address_bar_string
  api.AddressBarString
end

#address_bar_string=(str) ⇒ Object

アドレスバーの文字列を設定します。



95
96
97
# File 'lib/sleipnir_api/sleipnir.rb', line 95

def address_bar_string=(str)
  api.AddressBarString=(str) #:nodoc:
end

#app_pathObject

Sleipnir.exe の存在するディレクトリを取得します。



145
146
147
# File 'lib/sleipnir_api/sleipnir.rb', line 145

def app_path
  api.AppPath
end

#bring_window_to_top(timeout = 3) ⇒ Object

Sleipnir ウィンドウをフォアグランドにする。



465
466
467
468
469
470
471
472
473
474
# File 'lib/sleipnir_api/sleipnir.rb', line 465

def bring_window_to_top(timeout=3)
  timeout(timeout) {
    while GetForegroundWindow() != hwnd
      BringWindowToTop(hwnd)
      CloseWindow(hwnd)
      OpenIcon(hwnd)
      sleep(0.1)
    end
  }
end

#capture_browser(filename) ⇒ Object

Sleipnir ウィンドウ全体のスクリーンショットを指定されたファイルに保存します。

  • ファイル形式は BMP です。

  • Sleipnir のスクロールバーやツールバーも保存されます。

  • ページが複数ページからなる場合、表示中の部分しか保存されません。



402
403
404
405
406
# File 'lib/sleipnir_api/sleipnir.rb', line 402

def capture_browser(filename)
  captor = SleipnirAPI::ScreenCaptor.new(sleipnir, nil)
  bmp = captor.capture_browser
  bmp.save(filename)
end

#countObject

開かれているドキュメントの数を取得します。



166
167
168
# File 'lib/sleipnir_api/sleipnir.rb', line 166

def count
  api.GetCount
end

#document(index) ⇒ Object

call-seq:

document(index) -> DispHTMLDocument or nil

指定されたタブ位置の DispHTMLDocument (WIN32OLE オブジェクト) を取得します。存在しないタブ位置を指定した場合は nil を返します。



254
255
256
257
258
# File 'lib/sleipnir_api/sleipnir.rb', line 254

def document(index)
  if t = tab(index)
    t.document
  end
end

#documentsObject

call-seq:

documents() -> array of DispHTMLDocument

すべてのタブに対応する DispHTMLDocument (WIN32OLE オブジェクト) オブジェクトを返します。



264
265
266
# File 'lib/sleipnir_api/sleipnir.rb', line 264

def documents
  tabs.map{|e| e.document }
end

#each(&block) ⇒ Object

call-seq:

each {|tab| ... }

すべてのタブを走査します。

block の引数には SleipnirAPI::Tab オブジェクトが渡されます。



198
199
200
# File 'lib/sleipnir_api/sleipnir.rb', line 198

def each(&block)
  tabs.each(&block)
end

#each_document(&block) ⇒ Object

call-seq:

each_document {|doc| ... }

すべてのタブのドキュメントオブジェクトを走査します。

block の引数には DispHTMLDocument (WIN32OLE) オブジェクトが渡されます。



274
275
276
# File 'lib/sleipnir_api/sleipnir.rb', line 274

def each_document(&block)
  documents.each(&block)
end

#each_eval(&block) ⇒ Object

call-seq:

each_eval{ ... }

すべてのタブで指定された block を評価します。block は SleipnirAPI::Tab のコンテキストで評価されます (self が SleipnirAPI::Tab です)

pnir.each_eval do
  if location.href =~ /workspace/
    self.navigate_lock = true
  end
end


214
215
216
# File 'lib/sleipnir_api/sleipnir.rb', line 214

def each_eval(&block)
  each {|tab| tab.instance_eval(&block) }
end

#exec_command(command) ⇒ Object

Sleipnir の任意のメニューを command で指定して実行します。

command には以下の値を指定可能です。

  • SleipnirAPI::Command オブジェクト

  • 文字列 or 配列 (メニュー文字列)

    • メニュー文字列のエンコーディングは Shift_JIS です

  • 数値 (コマンド番号)

例:

pnir = SleipnirAPI.connect
pnir.exec_command(57664)
pnir.exec_command("バージョン情報")
pnir.exec_command(SleipnirAPI::Command["バージョン情報"])
pnir.exec_command(["Netscape ブックマーク", "インポート"])


381
382
383
384
385
386
387
388
389
390
391
392
393
394
# File 'lib/sleipnir_api/sleipnir.rb', line 381

def exec_command(command)
  case command
  when String, Array
    c = SleipnirAPI::Command[*Array(command)]
    raise ArgumentError, "No such command: #{command}" unless c
    exec_command(c.command_id)
  when SleipnirAPI::Command
    exec_command(command.command_id)
  when Integer
    api.ExecCommand(command)
  else
    raise ArgumentError, "Illegal command: #{command.inspect}"
  end
end

#favorite_fileObject

お気に入りファイルを取得します。



120
121
122
# File 'lib/sleipnir_api/sleipnir.rb', line 120

def favorite_file
  api.FavoriteFile
end

#favorite_file=(filename) ⇒ Object

お気に入りファイルを設定します。



125
126
127
# File 'lib/sleipnir_api/sleipnir.rb', line 125

def favorite_file=(filename)
  api.FavoriteFile=(filename) #:nodoc:
end

#get_url_tab(url) ⇒ Object

call-seq:

get_url_tab(url) -> SleipnirAPI::Tab

指定された url を表示している最初の SleipnirAPI::Tab を返します。



308
309
310
# File 'lib/sleipnir_api/sleipnir.rb', line 308

def get_url_tab(url)
  tabs.find {|tab| tab.document.location.href == url }
end

#new_tab(url = "about:blank", active = true) ⇒ Object

call-seq:

new_tab(url = "about:blank", active = true) -> SleipnirAPI::Tab

新しいタブを作成し SleipnirAPI::Tab を返します。

  • url に nil を指定した場合は about:blank を開きます。

  • active に true を指定した場合、作成したタブがアクティブになります。



287
288
289
290
# File 'lib/sleipnir_api/sleipnir.rb', line 287

def new_tab(url = "about:blank", active = true)
  docid = api.NewWindow(url || "about:blank", active)
  SleipnirAPI::Tab.new(self, docid)
end

#open(url, active = true) ⇒ Object

call-seq:

open(url, active = true) -> SleipnirAPI::Tab

新しいタブで指定された url を開き SleipnirAPI::Tab を返します。

url を省略できない new_tab です。



299
300
301
# File 'lib/sleipnir_api/sleipnir.rb', line 299

def open(url, active = true)
  new_tab(url, active)
end

#outputObject

アウトプットバーを操作するオブジェクトを取得します。

See Also: SleipnirAPI::Output



412
413
414
# File 'lib/sleipnir_api/sleipnir.rb', line 412

def output
  SleipnirAPI::Output.new(self)
end

#profile(ini = nil, opts = nil) ⇒ Object

call-seq:

profile()
profile(ini_filename)
profile(:default => "default value")
profile(:cipher => true)
profile(:cipher => true, :default => "default value")
profile(:ini => ini_filename, :default => "default value")
profile(:ini => ini_filename, :cipher => true)
profile(:ini => ini_filename, :cipher => true, :default => "default value")

ini ファイルを操作するオブジェクトを取得します。

引数には ini ファイル名、SleipnirAPI::Profile#get_string などに指定するオプションのデフォルト値を指定します。ここで指定したオプションは各メソッドの引数で上書きすることができます。

なお、SleipnirAPI::Profile#delete はオプション引数を取らないのでここで指定した値は完全に無視されます。

ini ファイル名を指定した場合、SleipnirAPI::Profile::Ini オブジェクトを返します。指定しない場合は SleipnirAPI::Profile オブジェクトを返します。

ex)

prof = pnir.profile                #=> #<SleipnirAPI::Profile:0xdeadbeaf ...>
proxy = pnir.profile("Proxy.ini")  #=> #<SleipnirAPI::Profile::Ini:0xdeadbeaf: Proxy.ini, opts={}>

See Also: SleipnirAPI::Profile, SleipnirAPI::Profile::Ini



443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
# File 'lib/sleipnir_api/sleipnir.rb', line 443

def profile(ini = nil, opts = nil)
  if ini
    case ini
    when Hash
      t = ini.delete(:ini)
      ini, opts = t, ini
    when String, Symbol
      ini = ini.to_s
    else
      raise ArgumentError, "Invalid ini filename `#{ini.inspect}':#{ini.class} (expected String or Symbol)"
    end
  end

  r = SleipnirAPI::Profile.new(self, opts)
  if ini
    r.ini(ini)
  else
    r
  end
end

#quitObject

Sleipnir を終了します。



85
86
87
# File 'lib/sleipnir_api/sleipnir.rb', line 85

def quit
  SleipnirAPI::Process.terminate!(self.handle)
end

#reload_closed_urlObject

ClosedURL.ini を再度読み込みます。



354
355
356
# File 'lib/sleipnir_api/sleipnir.rb', line 354

def reload_closed_url
  api.ReloadClosedURL
end

#resource_pathObject

リソースの読み込まれるディレクトリを取得します。



155
156
157
# File 'lib/sleipnir_api/sleipnir.rb', line 155

def resource_path
  api.ResourcePath
end

#resultObject

Sleipni API の結果を取得します。



140
141
142
# File 'lib/sleipnir_api/sleipnir.rb', line 140

def result
  api.Result
end

#save_active_tabObject

現在アクティブなタブを保存して block を実行します。



331
332
333
334
335
336
337
338
# File 'lib/sleipnir_api/sleipnir.rb', line 331

def save_active_tab
  actived = active_tab
  begin
    yield
  ensure
    actived.activate unless actived.closed?
  end
end

#save_closed_urlObject

最近閉じたページをファイルに上書き保存します。



349
350
351
# File 'lib/sleipnir_api/sleipnir.rb', line 349

def save_closed_url
  api.SaveClosedURL
end

#save_favorite(filename) ⇒ Object

指定されたファイルにお気に入りを保存します。

保存できた場合 true を返します。



344
345
346
# File 'lib/sleipnir_api/sleipnir.rb', line 344

def save_favorite(filename)
  api.SaveFavorite(filename)
end

#script_pathObject

スクリプトの読み込まれるディレクトリを取得します。



150
151
152
# File 'lib/sleipnir_api/sleipnir.rb', line 150

def script_path
  api.ScriptPath
end

#search_bar_stringObject

検索バーの文字列を取得します。



100
101
102
# File 'lib/sleipnir_api/sleipnir.rb', line 100

def search_bar_string
  api.SearchBarString
end

#search_bar_string=(str) ⇒ Object

検索バーの文字列を設定します。



105
106
107
# File 'lib/sleipnir_api/sleipnir.rb', line 105

def search_bar_string=(str)
  api.SearchBarString=(str) #:nodoc:
end

#sleipnirObject

self を返します。



75
76
77
# File 'lib/sleipnir_api/sleipnir.rb', line 75

def sleipnir
  self
end

#switch_to_tab(tab_or_url) ⇒ Object

call-seq:

switch_to_tab(tab_or_url) -> SleipnirAPI::Tab

指定された url を表示している最初の SleipnirAPI::Tab をアクティブにして返します。



317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/sleipnir_api/sleipnir.rb', line 317

def switch_to_tab(tab_or_url)
  case tab_or_url
  when SleipnirAPI::Tab
    t = tab_or_url
  else
    t = get_url_tab(tab_or_url.to_s)
  end
  if t
    t.activate
    t
  end
end

#tab(index) ⇒ Object

call-seq:

tab(index) -> SleipnirAPI::Tab or nil

指定されたタブ位置のドキュメントを返します。存在しないタブ位置を指定した場合は nil を返します。

See Also: SleipnirAPI::Tab



178
179
180
181
182
# File 'lib/sleipnir_api/sleipnir.rb', line 178

def tab(index)
  if (0...count).include?(index)
    SleipnirAPI::Tab.new(self, api.GetDocumentId(index))
  end
end

#tabsObject

call-seq:

tabs() -> array of SleipnirAPI::Tab

すべてのタブに対応する SleipnirAPI::Tab オブジェクトを返します。



188
189
190
# File 'lib/sleipnir_api/sleipnir.rb', line 188

def tabs
  (0...count).map{|i| tab(i) }
end

#urlObject

アクティブなドキュメントの URL を取得します。



110
111
112
# File 'lib/sleipnir_api/sleipnir.rb', line 110

def url
  api.URL
end

#url=(url) ⇒ Object

アクティブなドキュメントの URL を設定します。



115
116
117
# File 'lib/sleipnir_api/sleipnir.rb', line 115

def url=(url)
  api.URL=(url) #:nodoc:
end

#user_agentObject

UserAgent を取得します。



130
131
132
# File 'lib/sleipnir_api/sleipnir.rb', line 130

def user_agent
  api.UserAgent
end

#user_agent=(ua) ⇒ Object

UserAgent を設定します。



135
136
137
# File 'lib/sleipnir_api/sleipnir.rb', line 135

def user_agent=(ua)
  api.UserAgent=(ua) #:nodoc:
end

#user_pathObject

各種設定の保存するディレクトリを取得します。



160
161
162
# File 'lib/sleipnir_api/sleipnir.rb', line 160

def user_path
  api.UserPath
end

#v2?Boolean

Sleipnir 2.xx なら true

Returns:

  • (Boolean)


80
81
82
# File 'lib/sleipnir_api/sleipnir.rb', line 80

def v2?
  self.version >= 200
end