sleipnir-api 0.2.1 → 0.3.0
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.
- data/History.txt +32 -0
- data/Manifest.txt +20 -3
- data/Rakefile +11 -1
- data/TODO.txt +4 -10
- data/bin/grepnir +1 -1
- data/examples/close_dup.rb +1 -1
- data/examples/close_err.rb +12 -0
- data/examples/command_list.rb +135 -0
- data/examples/open_last_url_by_firefox.rb +44 -0
- data/examples/open_selected_links.rb +40 -0
- data/helper/rake.rb +3 -57
- data/helper/rake/rake.rb +58 -0
- data/helper/{rake_sh_filter.rb → rake/rake_sh_filter.rb} +0 -0
- data/helper/{util.rb → rake/util.rb} +0 -0
- data/lib/sleipnir_api/cli/grepnir.rb +2 -3
- data/lib/sleipnir_api/command.rb +126 -0
- data/lib/sleipnir_api/commands.rb +264 -0
- data/lib/sleipnir_api/profile.rb +166 -27
- data/lib/sleipnir_api/profile/ini.rb +202 -0
- data/lib/sleipnir_api/profile/key.rb +120 -0
- data/lib/sleipnir_api/profile/section.rb +147 -0
- data/lib/sleipnir_api/profile/util.rb +82 -0
- data/lib/sleipnir_api/searcher.rb +133 -0
- data/lib/sleipnir_api/security.rb +88 -18
- data/lib/sleipnir_api/sleipnir.rb +91 -7
- data/lib/sleipnir_api/tab.rb +68 -2
- data/lib/sleipnir_api/tabbed_ie.rb +33 -0
- data/lib/sleipnir_api/util.rb +25 -0
- data/lib/sleipnir_api/version.rb +2 -2
- data/scripts/gesture2rb.rb +42 -0
- data/scripts/make_gesture.rb +271 -0
- data/scripts/subcategory.csv +253 -0
- data/spec/sleipnir_api/profile_mock_spec.rb +80 -6
- data/spec/sleipnir_api/profile_section_mock_spec.rb +143 -0
- data/spec/sleipnir_api/profile_spec.rb +191 -0
- data/spec/sleipnir_api/security_spec.rb +58 -0
- data/spec/sleipnir_api/tab_mock_spec.rb +0 -5
- data/spec/sleipnir_api/tab_spec.rb +27 -0
- data/spec/spec_helper.rb +20 -0
- metadata +22 -5
- data/helper/helper.rb +0 -3
data/History.txt
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
== 0.3.0 / 2007-09-23
|
2
|
+
|
3
|
+
* API changes:
|
4
|
+
* SleipnirAPI::Tab
|
5
|
+
+search+:: support Sleipnir 2.x.
|
6
|
+
* SleipnirAPI::Security
|
7
|
+
+enable?+:: support multiple arguments.
|
8
|
+
+disable?+:: ditto.
|
9
|
+
* SleipnirAPI::Sleipnir
|
10
|
+
+profile+:: support default keyword arguments.
|
11
|
+
+exec_command+:: support SleipnirAPI::Command object.
|
12
|
+
* New API:
|
13
|
+
* SleipnirAPI::Command
|
14
|
+
* new class to represent Sleipnir menu commands.
|
15
|
+
it can specify SleipnirAPI::Sleipnir#exec_command.
|
16
|
+
* SleipnirAPI::Profile::Ini
|
17
|
+
* new class to represent ini file.
|
18
|
+
* SleipnirAPI::Profile::Seciton
|
19
|
+
* new class to represent ini section.
|
20
|
+
* SleipnirAPI::Profile::Key
|
21
|
+
* new class to represent ini section key.
|
22
|
+
* SleipnirAPI::Profile
|
23
|
+
+ini+:: get SleipnirAPI::Profile::Ini object.
|
24
|
+
* SleipnirAPI::Tab
|
25
|
+
+watir+:: get Watir object [experimental].
|
26
|
+
+elem_by_tag+:: get IHTMLElement. (shortcut of document.getElementsByTagName).
|
27
|
+
+base_uri+:: get document base (<base> or location.href).
|
28
|
+
+base_uris+:: get base uri in <head>.
|
29
|
+
* SleipnirAPI::Security
|
30
|
+
+enable!+:: set security config.
|
31
|
+
+disable!+:: ditto.
|
32
|
+
|
1
33
|
== 0.2.1 / 2007-07-30
|
2
34
|
|
3
35
|
* grepnir:
|
data/Manifest.txt
CHANGED
@@ -6,27 +6,42 @@ Rakefile
|
|
6
6
|
TODO.txt
|
7
7
|
bin/grepnir
|
8
8
|
examples/close_dup.rb
|
9
|
+
examples/close_err.rb
|
10
|
+
examples/command_list.rb
|
11
|
+
examples/open_last_url_by_firefox.rb
|
12
|
+
examples/open_selected_links.rb
|
9
13
|
examples/reload.rb
|
10
|
-
helper/helper.rb
|
11
14
|
helper/rake.rb
|
12
|
-
helper/
|
13
|
-
helper/
|
15
|
+
helper/rake/rake.rb
|
16
|
+
helper/rake/rake_sh_filter.rb
|
17
|
+
helper/rake/util.rb
|
14
18
|
lib/sleipnir_api.rb
|
15
19
|
lib/sleipnir_api/cli/base.rb
|
16
20
|
lib/sleipnir_api/cli/grepnir.rb
|
21
|
+
lib/sleipnir_api/command.rb
|
22
|
+
lib/sleipnir_api/commands.rb
|
17
23
|
lib/sleipnir_api/dialog.rb
|
18
24
|
lib/sleipnir_api/key_state.rb
|
19
25
|
lib/sleipnir_api/output.rb
|
20
26
|
lib/sleipnir_api/process.rb
|
21
27
|
lib/sleipnir_api/profile.rb
|
28
|
+
lib/sleipnir_api/profile/ini.rb
|
29
|
+
lib/sleipnir_api/profile/key.rb
|
30
|
+
lib/sleipnir_api/profile/section.rb
|
31
|
+
lib/sleipnir_api/profile/util.rb
|
22
32
|
lib/sleipnir_api/registry.rb
|
33
|
+
lib/sleipnir_api/searcher.rb
|
23
34
|
lib/sleipnir_api/security.rb
|
24
35
|
lib/sleipnir_api/sleipnir.rb
|
25
36
|
lib/sleipnir_api/tab.rb
|
37
|
+
lib/sleipnir_api/tabbed_ie.rb
|
26
38
|
lib/sleipnir_api/util.rb
|
27
39
|
lib/sleipnir_api/version.rb
|
28
40
|
lib/sleipnir_api/win32api.rb
|
41
|
+
scripts/gesture2rb.rb
|
42
|
+
scripts/make_gesture.rb
|
29
43
|
scripts/rdoc_filter.rb
|
44
|
+
scripts/subcategory.csv
|
30
45
|
setup.rb
|
31
46
|
spec/dsl/behaviour_eval.rb
|
32
47
|
spec/matchers/exit_with.rb
|
@@ -36,6 +51,8 @@ spec/sleipnir_api/dialog_mock_spec.rb
|
|
36
51
|
spec/sleipnir_api/key_state_mock_spec.rb
|
37
52
|
spec/sleipnir_api/output_spec.rb
|
38
53
|
spec/sleipnir_api/profile_mock_spec.rb
|
54
|
+
spec/sleipnir_api/profile_section_mock_spec.rb
|
55
|
+
spec/sleipnir_api/profile_spec.rb
|
39
56
|
spec/sleipnir_api/registry_spec.rb
|
40
57
|
spec/sleipnir_api/security_mock_spec.rb
|
41
58
|
spec/sleipnir_api/security_spec.rb
|
data/Rakefile
CHANGED
@@ -18,7 +18,7 @@ rescue LoadError
|
|
18
18
|
exit
|
19
19
|
end
|
20
20
|
|
21
|
-
require 'helper/
|
21
|
+
require 'helper/rake'
|
22
22
|
|
23
23
|
include FileUtils
|
24
24
|
require File.join(File.dirname(__FILE__), 'lib', 'sleipnir_api', 'version')
|
@@ -28,8 +28,12 @@ EMAIL = "miyamuko@gmail.com"
|
|
28
28
|
DESCRIPTION = "Ruby interface to the Sleipnir COM API"
|
29
29
|
GEM_NAME = 'sleipnir-api' # what ppl will type to install your gem
|
30
30
|
RDOC_DIR = "./html"
|
31
|
+
EXAMPLES_DIR = "#{RDOC_DIR}/examples"
|
31
32
|
NEWS_FILE = "news.txt"
|
32
33
|
|
34
|
+
|
35
|
+
directory EXAMPLES_DIR
|
36
|
+
|
33
37
|
@config_file = "~/.rubyforge/user-config.yml"
|
34
38
|
@config = nil
|
35
39
|
def rubyforge_username
|
@@ -148,6 +152,12 @@ Rake::RDocTask.new(:docs) do |rd|
|
|
148
152
|
rd.options << '--charset=UTF-8'
|
149
153
|
end
|
150
154
|
|
155
|
+
desc "Build the command list HTML Files."
|
156
|
+
task :example => [EXAMPLES_DIR] do
|
157
|
+
sh "ruby examples/command_list.rb > #{EXAMPLES_DIR}/exec_command.html"
|
158
|
+
end
|
159
|
+
task :docs => [:example]
|
160
|
+
|
151
161
|
# remove HTML comment and so on.
|
152
162
|
task :docs do
|
153
163
|
ruby "scripts/rdoc_filter.rb #{RDOC_DIR}/**/*.html"
|
data/TODO.txt
CHANGED
@@ -1,16 +1,12 @@
|
|
1
1
|
== TODO
|
2
2
|
|
3
|
-
*
|
3
|
+
* hilight を自前で実装する
|
4
4
|
* Sleipnir 2.x じゃサポートしていない
|
5
5
|
* 1.66 で hilight を同じページに対して何回も実行するとだんだん重くなる
|
6
6
|
* watir サポート
|
7
|
-
*
|
8
|
-
|
9
|
-
|
10
|
-
* ie.document == DispHTMLDocument == pnir.document
|
11
|
-
* ie.parentWindow == DispHTMLWindow2 == pnir.window
|
12
|
-
* ipnir
|
13
|
-
* intaractive sleipnir shell
|
7
|
+
* test
|
8
|
+
* pnirsh
|
9
|
+
* sleipnir shell
|
14
10
|
* JavaScript の実行
|
15
11
|
* Sleipnir の起動・終了を WMI を使わずに実装。
|
16
12
|
* Sleipnir の終了時に Window Handle をちゃんと見る。
|
@@ -23,6 +19,4 @@
|
|
23
19
|
* dRuby
|
24
20
|
* Rinda
|
25
21
|
* Gearman
|
26
|
-
* ExecCommand
|
27
|
-
* コマンドの一覧
|
28
22
|
* Sleipnir 2.x のサポート
|
data/bin/grepnir
CHANGED
data/examples/close_dup.rb
CHANGED
@@ -3,7 +3,7 @@ require "set"
|
|
3
3
|
$LOAD_PATH << File.join(File.dirname(__FILE__), "../lib")
|
4
4
|
require "sleipnir_api"
|
5
5
|
|
6
|
-
SleipnirAPI.
|
6
|
+
SleipnirAPI.connect do |pnir|
|
7
7
|
url2tab = pnir.to_set.classify{|e| e.document.URL }.select{|url,tabs| tabs.size > 1 }
|
8
8
|
url2tab.each do |url,tabs|
|
9
9
|
tabs.sort_by{|e|
|
@@ -0,0 +1,135 @@
|
|
1
|
+
$KCODE = "s"
|
2
|
+
|
3
|
+
require "erb"
|
4
|
+
require "optparse"
|
5
|
+
|
6
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), "../lib")
|
7
|
+
require "sleipnir_api"
|
8
|
+
|
9
|
+
puts ERB.new(DATA.read, 0, "%<>").result(binding)
|
10
|
+
|
11
|
+
__END__
|
12
|
+
<html>
|
13
|
+
<head>
|
14
|
+
<title>Sleipnir.API - ExecCommand �Ɏw��\�ȃR�}���h�̈ꗗ</title>
|
15
|
+
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS" />
|
16
|
+
<style type="text/css">
|
17
|
+
<!--
|
18
|
+
body {
|
19
|
+
color: #16160e;
|
20
|
+
background: #fffffc;
|
21
|
+
}
|
22
|
+
input {
|
23
|
+
width: 10em;
|
24
|
+
}
|
25
|
+
table, th, td {
|
26
|
+
border-collapse: collapse;
|
27
|
+
border: 1px solid #e9dfe5;
|
28
|
+
}
|
29
|
+
th {
|
30
|
+
background: #fdeff2;
|
31
|
+
}
|
32
|
+
th, td {
|
33
|
+
padding: 4px;
|
34
|
+
}
|
35
|
+
#search {
|
36
|
+
color: #393f4c;
|
37
|
+
width: 100%;
|
38
|
+
}
|
39
|
+
-->
|
40
|
+
</style>
|
41
|
+
|
42
|
+
<script type="text/javascript">
|
43
|
+
<!--
|
44
|
+
var data = {};
|
45
|
+
% SleipnirAPI::Command.each_with_index do |cmd,i|
|
46
|
+
data["c<%= i %>"] = ["<%= cmd.command_id %>", <%= cmd.path.map{|e| e.downcase.inspect }.join(", ") %>];
|
47
|
+
<% end %>
|
48
|
+
var cache = {};
|
49
|
+
|
50
|
+
function lookup(names, q) {
|
51
|
+
var queries = q.toLowerCase().split(/\s+/);
|
52
|
+
for (var i = 0; i < queries.length; i++) {
|
53
|
+
if (!lookup1(names, queries[i])) {
|
54
|
+
return false;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
return true;
|
58
|
+
}
|
59
|
+
|
60
|
+
function lookup1(names, query) {
|
61
|
+
for (var i = 0; i < names.length; i++) {
|
62
|
+
if (names[i].indexOf(query) > -1) {
|
63
|
+
return true;
|
64
|
+
}
|
65
|
+
}
|
66
|
+
return false;
|
67
|
+
}
|
68
|
+
|
69
|
+
function do_search(q) {
|
70
|
+
for (var key in data) {
|
71
|
+
var names = data[key];
|
72
|
+
var e = cache[key] = cache[key] || document.getElementById(key);
|
73
|
+
if (e != undefined && lookup(names, q)) {
|
74
|
+
e.style.display = "";
|
75
|
+
} else {
|
76
|
+
e.style.display = "none";
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
function setup_event() {
|
82
|
+
var input = document.getElementById("search");
|
83
|
+
input.onfocus = function() {
|
84
|
+
if (input.value == "Search...") {
|
85
|
+
input.value = "";
|
86
|
+
input.style.color = "black";
|
87
|
+
}
|
88
|
+
};
|
89
|
+
input.onblur = function() {
|
90
|
+
if (input.value == "") {
|
91
|
+
input.value = "search";
|
92
|
+
input.style.color = "#393f4c";
|
93
|
+
}
|
94
|
+
};
|
95
|
+
|
96
|
+
var form = document.getElementById("search_box");
|
97
|
+
form.onsubmit = function() {
|
98
|
+
var q = input.value;
|
99
|
+
input.style.backgroundColor = "#f6bfbc";
|
100
|
+
window.setTimeout(function () {
|
101
|
+
do_search(q);
|
102
|
+
input.style.backgroundColor = "";
|
103
|
+
input.focus();
|
104
|
+
}, 100);
|
105
|
+
|
106
|
+
return false;
|
107
|
+
};
|
108
|
+
}
|
109
|
+
-->
|
110
|
+
</script>
|
111
|
+
|
112
|
+
</head>
|
113
|
+
<body onload="setup_event();">
|
114
|
+
<h1>Sleipnir.API - ExecCommand �Ɏw��\�ȃR�}���h�̈ꗗ</h1>
|
115
|
+
|
116
|
+
<p>Sleipnir 1.66 �p�ł��B2.x �� ExecCommand ���T�|�[�g���Ă��܂���B</p>
|
117
|
+
|
118
|
+
<form id="search_box">
|
119
|
+
<input accesskey="a" id="search" value="Search..."/>
|
120
|
+
</form>
|
121
|
+
|
122
|
+
<table style="width: 100%">
|
123
|
+
<tr>
|
124
|
+
<th style="width: 20%">�R�}���h ID</th>
|
125
|
+
<th style="width: 80%">�R�}���h</th>
|
126
|
+
</tr>
|
127
|
+
% SleipnirAPI::Command.each_with_index do |cmd,i|
|
128
|
+
<tr id="c<%= i %>">
|
129
|
+
<td><%= cmd.command_id %></td>
|
130
|
+
<td><%= cmd.path.join(" �� ") %></td>
|
131
|
+
</tr>
|
132
|
+
% end
|
133
|
+
</table>
|
134
|
+
</body>
|
135
|
+
</html>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "timeout"
|
2
|
+
require "win32ole"
|
3
|
+
require "win32/registry"
|
4
|
+
|
5
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), "../lib")
|
6
|
+
require "sleipnir_api"
|
7
|
+
|
8
|
+
class Firefox
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@exe = find_exe
|
12
|
+
@wsh = WIN32OLE.new("WScript.Shell")
|
13
|
+
end
|
14
|
+
|
15
|
+
def open(url, wait = true)
|
16
|
+
@wsh.Exec("#{@exe} #{url}")
|
17
|
+
wait_for_activate if wait
|
18
|
+
end
|
19
|
+
|
20
|
+
def wait_for_activate(timeout = 30)
|
21
|
+
timeout(timeout) {
|
22
|
+
sleep(0.2) until @wsh.AppActivate(" - Mozilla Firefox")
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def find_exe
|
27
|
+
Win32::Registry.open(Win32::Registry::HKEY_LOCAL_MACHINE, "SOFTWARE\\Mozilla\\Mozilla Firefox") do |reg|
|
28
|
+
curr = reg.read_s("CurrentVersion")
|
29
|
+
reg.open("#{curr}\\Main") do |r|
|
30
|
+
return r.read_s("PathToExe")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
SleipnirAPI.connect do |pnir|
|
37
|
+
last_url = pnir.profile.LastWnd.LastWindow2.Item0_URL.list
|
38
|
+
break if last_url.empty?
|
39
|
+
firefox = Firefox.new
|
40
|
+
last_url.each do |url|
|
41
|
+
firefox.open(url)
|
42
|
+
sleep(0.5)
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "uri"
|
2
|
+
|
3
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), "../lib")
|
4
|
+
require "sleipnir_api"
|
5
|
+
|
6
|
+
def traverse_elem(elem, &block)
|
7
|
+
elem.childNodes.each do |child|
|
8
|
+
case child.nodeName
|
9
|
+
when "#text"
|
10
|
+
# ignore
|
11
|
+
else
|
12
|
+
block.call(child)
|
13
|
+
traverse_elem(child, &block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
SleipnirAPI.connect do |pnir|
|
19
|
+
links = []
|
20
|
+
pnir.active_tab.document {|doc|
|
21
|
+
selection = doc.Selection
|
22
|
+
break if selection.Type == "None"
|
23
|
+
div = doc.createElement("div")
|
24
|
+
div.innerHTML = selection.createRange.HtmlText
|
25
|
+
base = URI(pnir.active_tab.base_uri)
|
26
|
+
traverse_elem(div) do |e|
|
27
|
+
case e.nodeName
|
28
|
+
when "BASE"
|
29
|
+
base = URI(e["href"])
|
30
|
+
when "A"
|
31
|
+
links << (base + e["href"]).to_s
|
32
|
+
end
|
33
|
+
end
|
34
|
+
}
|
35
|
+
|
36
|
+
(links - pnir.map{|e| e.location.href }).uniq.each do |link|
|
37
|
+
puts "open #{link}"
|
38
|
+
pnir.open(link, false)
|
39
|
+
end
|
40
|
+
end
|
data/helper/rake.rb
CHANGED
@@ -1,58 +1,4 @@
|
|
1
|
-
require "
|
2
|
-
require "rake"
|
1
|
+
require "helper/rake/util"
|
2
|
+
require "helper/rake/rake"
|
3
|
+
require "helper/rake/rake_sh_filter"
|
3
4
|
|
4
|
-
def tasks
|
5
|
-
Rake.application.instance_eval { @tasks }
|
6
|
-
end
|
7
|
-
|
8
|
-
def current_scope
|
9
|
-
Rake.application.instance_eval { @scope.last }
|
10
|
-
end
|
11
|
-
|
12
|
-
def task_defined?(task_name)
|
13
|
-
Rake::Task.task_defined?(task_name)
|
14
|
-
end
|
15
|
-
|
16
|
-
def remove_tasks(*task_names)
|
17
|
-
task_names.flatten.each do |task_name|
|
18
|
-
remove_task(task_name)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def remove_task(task_name)
|
23
|
-
tasks.delete(task_name.to_s)
|
24
|
-
end
|
25
|
-
|
26
|
-
def lookup_task(task_name)
|
27
|
-
Rake::Task[task_name] rescue nil
|
28
|
-
end
|
29
|
-
|
30
|
-
def rakecall(task_name)
|
31
|
-
lookup_task(task_name).invoke
|
32
|
-
end
|
33
|
-
|
34
|
-
def override_task(task_args, &block)
|
35
|
-
task_name, deps = Rake.application.resolve_args(task_args)
|
36
|
-
original = lookup_task(task_name)
|
37
|
-
orgproc = lambda {} # nop
|
38
|
-
if original
|
39
|
-
Rake.application.last_comment = original.comment
|
40
|
-
deps |= original.prerequisites
|
41
|
-
orgproc = lambda{ original.execute }
|
42
|
-
end
|
43
|
-
|
44
|
-
remove_task(task_name)
|
45
|
-
Rake::Task.define_task(task_name => deps) do |t|
|
46
|
-
block.call(t, orgproc)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def task_for_windows(task_args, &block)
|
51
|
-
override_task(task_args) do |t, org|
|
52
|
-
if windows?
|
53
|
-
block.call(t)
|
54
|
-
else
|
55
|
-
org.call
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|