clippy 0.1.pre → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/clippy +38 -0
- data/lib/clippy.rb +138 -4
- data/rakefile.rb +19 -0
- data/readme.txt +41 -3
- metadata +56 -9
data/bin/clippy
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'clippy'
|
4
|
+
|
5
|
+
##
|
6
|
+
# Opts.
|
7
|
+
do_return = nil
|
8
|
+
did_cmd = nil
|
9
|
+
OptionParser.new do |opts|
|
10
|
+
opts.banner = "Clippy v#{Clippy.version} by Envygeeks"
|
11
|
+
opts.on('--paste', 'Paste') { do_return = Clippy.paste }
|
12
|
+
opts.on('--help', 'This') { do_return = opts }
|
13
|
+
opts.on('--clear', 'Clear') { did_cmd = Clippy.clear }
|
14
|
+
|
15
|
+
opts.on('--copy', 'Copy') do
|
16
|
+
unless ARGV.count > 0
|
17
|
+
text = ARGF.readlines.join.gsub(/\n$/, '')
|
18
|
+
else
|
19
|
+
if ARGV.count > 1
|
20
|
+
raise(RuntimeError, 'More than one arg.', 'Clippy')
|
21
|
+
else
|
22
|
+
text = ARGV.first
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
did_cmd = Clippy.copy(text)
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on('--version', 'version') { do_return = Clippy.version }
|
30
|
+
end.parse!
|
31
|
+
|
32
|
+
if do_return.nil? and did_cmd.nil?
|
33
|
+
system("#{File.expand_path(__FILE__)} --help")
|
34
|
+
else
|
35
|
+
if do_return
|
36
|
+
$stdout.puts do_return
|
37
|
+
end
|
38
|
+
end
|
data/lib/clippy.rb
CHANGED
@@ -1,8 +1,142 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
if RbConfig::CONFIG['host_os'] =~ /mswin/
|
5
|
+
require 'Win32API'
|
6
|
+
end
|
7
|
+
|
1
8
|
class Clippy
|
9
|
+
private_class_method :new
|
10
|
+
|
11
|
+
['UnsupportedOS', 'UnknownClipboard', 'InvalidEncoding'].each do |klass|
|
12
|
+
class_eval <<-CLASS
|
13
|
+
class #{klass} < StandardError
|
14
|
+
self
|
15
|
+
end
|
16
|
+
CLASS
|
17
|
+
end
|
18
|
+
|
19
|
+
class << self
|
20
|
+
|
21
|
+
##
|
22
|
+
# Version.
|
23
|
+
def version
|
24
|
+
'0.1.1'
|
25
|
+
end
|
26
|
+
|
27
|
+
def binary_exist?(bin)
|
28
|
+
system("which #{bin} > /dev/null 2>&1")
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Copy
|
33
|
+
def copy(data)
|
34
|
+
if RbConfig::CONFIG['host_os'] =~ /mswin/
|
35
|
+
if system('clip /? 2>&1 1>&0')
|
36
|
+
begin
|
37
|
+
tmpfile = Tempfile.new('clippy')
|
38
|
+
tmpfile.write(data)
|
39
|
+
tmpfile.flush
|
40
|
+
system("clip < #{tmpfile.path}")
|
41
|
+
ensure
|
42
|
+
tmpfile.close(true)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
raise(UnsupportedOS, 'Your Windows version is too old.')
|
46
|
+
end
|
47
|
+
else
|
48
|
+
case true
|
49
|
+
when binary_exist?('xsel')
|
50
|
+
['-p', '-b', '-s'].each do |opt|
|
51
|
+
Open3.popen3("xsel -i #{opt}") do |stdin|
|
52
|
+
stdin << data
|
53
|
+
end
|
54
|
+
end
|
55
|
+
when binary_exist?('pbcopy')
|
56
|
+
Open3.popen3('pbcopy') do |stdin|
|
57
|
+
stdin << data
|
58
|
+
end
|
59
|
+
when binary_exist?('xclip')
|
60
|
+
['primary', 'secondary', 'clipboard'].each do |opt|
|
61
|
+
Open3.popen3("xclip -i -selection #{opt}") do |stdin|
|
62
|
+
stdin << data
|
63
|
+
end
|
64
|
+
end
|
65
|
+
else
|
66
|
+
raise(UnknownClipboard, 'Could not find a clipboard util.')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
((data.nil? or data.empty?)?(false):(data))
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# Paste
|
75
|
+
def paste(encoding = nil, which = nil)
|
76
|
+
if defined? Encoding and encoding
|
77
|
+
unless Encoding.list.map(&:to_s).include?(encoding)
|
78
|
+
raise(InvalidEncoding, 'The encoding you selected is unsupported')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
if RbConfig::CONFIG['host_os'] =~ /mswin/
|
83
|
+
Win32API.new('user32', 'OpenClipboard', 'L', 'I').call(0)
|
84
|
+
data = Win32API.new('user32', 'GetClipboardData', 'I', 'P').call(1) || ''
|
85
|
+
Win32API.new('user32', 'CloseClipboard', [], 'I').call
|
86
|
+
else
|
87
|
+
case true
|
88
|
+
when binary_exist?('xsel')
|
89
|
+
cmd = 'xsel -o'
|
90
|
+
|
91
|
+
case which
|
92
|
+
when 'clipboard' then cmd+= ' -b'
|
93
|
+
when 'primary' then cmd+= ' -p'
|
94
|
+
when 'secondary' then cmd+= ' -s'
|
95
|
+
end
|
96
|
+
|
97
|
+
Open3.popen3(cmd) do |_, stdout|
|
98
|
+
data = stdout.read
|
99
|
+
end
|
100
|
+
when binary_exist?('pbpaste')
|
101
|
+
Open3.popen('pbpaste') do |_, stdout|
|
102
|
+
data = stdout.read || ''
|
103
|
+
end
|
104
|
+
when binary_exist?('xclip')
|
105
|
+
cmd = 'xclip -o'
|
106
|
+
|
107
|
+
case which
|
108
|
+
when 'clipboard' then cmd+= ' clipboard'
|
109
|
+
when 'primary' then cmd+= ' primary'
|
110
|
+
when 'secondary' then cmd+= ' secondary'
|
111
|
+
end
|
112
|
+
|
113
|
+
Open3.popen3(cmd) do |_, stdout|
|
114
|
+
data = stdout.read || ''
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
if defined? Encoding
|
120
|
+
if data.encoding.name != Encoding.default_external
|
121
|
+
data.encode(encoding ? encoding : Encoding.default_external)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
((data.nil? or data.empty?)?(false):(data))
|
126
|
+
end
|
127
|
+
|
128
|
+
def clear
|
129
|
+
if RbConfig::CONFIG['host_os'] =~ /mswin/
|
130
|
+
Win32API.new('user32', 'OpenClipboard', 'L', 'I').call(0)
|
131
|
+
Win32API.new('user32', 'EmptyClipboard', [], 'I').call
|
132
|
+
Win32API.new('user32', 'CloseClipboard', [], 'I').call
|
133
|
+
else
|
134
|
+
if copy('')
|
135
|
+
return true
|
136
|
+
end
|
137
|
+
end
|
2
138
|
|
3
|
-
|
4
|
-
|
5
|
-
def self.version
|
6
|
-
'0.1.pre'
|
139
|
+
false
|
140
|
+
end
|
7
141
|
end
|
8
142
|
end
|
data/rakefile.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems/package_task'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
task :default => [:test]
|
5
|
+
|
6
|
+
Rake::TestTask.new do |tfile|
|
7
|
+
tfile.verbose = true
|
8
|
+
tfile.pattern = "tests/**/*.rb"
|
9
|
+
end
|
10
|
+
|
11
|
+
if ARGV.include?('features')
|
12
|
+
require 'cucumber'
|
13
|
+
require 'cucumber/rake/task'
|
14
|
+
Cucumber::Rake::Task.new(:features)
|
15
|
+
end
|
16
|
+
|
17
|
+
Gem::PackageTask.new(eval(IO.read('clippy.gemspec'))) do |pkg|
|
18
|
+
pkg.need_tar, pkg.need_zip = true
|
19
|
+
end
|
data/readme.txt
CHANGED
@@ -1,3 +1,41 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
---
|
2
|
+
About:
|
3
|
+
Clippy is a cross-platform clipboard utility and script for Ruby.
|
4
|
+
|
5
|
+
---
|
6
|
+
Requirements:
|
7
|
+
Windows:
|
8
|
+
Ruby1.9
|
9
|
+
Windows Vista+
|
10
|
+
|
11
|
+
Development:
|
12
|
+
cucumber
|
13
|
+
rake
|
14
|
+
rspec
|
15
|
+
minitest
|
16
|
+
|
17
|
+
All other distros should work with 1.8+
|
18
|
+
|
19
|
+
---
|
20
|
+
Usage:
|
21
|
+
Shell:
|
22
|
+
clippy --copy '#1'
|
23
|
+
echo '#2' |clippy --copy
|
24
|
+
clipy --copy < 'file#3.txt'
|
25
|
+
Ruby:
|
26
|
+
require 'clippy'
|
27
|
+
Clippy.copy('#1')
|
28
|
+
Clippy.[paste, clear]
|
29
|
+
|
30
|
+
---
|
31
|
+
Clippy v0.1 by Envygeeks
|
32
|
+
--paste Paste
|
33
|
+
--help This
|
34
|
+
--clear Clear
|
35
|
+
--copy Copy
|
36
|
+
--version Version
|
37
|
+
|
38
|
+
---
|
39
|
+
I want to throw a big thank you to Nathaniel (@firestar) who took the time to
|
40
|
+
also build a Java version of clippy which will soon also be included as a
|
41
|
+
fallback for Windows XP users.
|
metadata
CHANGED
@@ -1,28 +1,76 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clippy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.1
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jordon Bedwell
|
9
|
+
- Nathaniel Davidson
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
13
|
-
dependencies:
|
13
|
+
date: 2011-12-26 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
requirement: &16945060 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *16945060
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rake
|
28
|
+
requirement: &16944420 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *16944420
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: minitest
|
39
|
+
requirement: &16943860 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *16943860
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: cucumber
|
50
|
+
requirement: &16943020 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *16943020
|
14
59
|
description: A utility to access the systems clipboard.
|
15
60
|
email:
|
16
61
|
- jordon@envygeeks.com
|
17
|
-
|
62
|
+
- nathaniel.davidson@gmail.com
|
63
|
+
executables:
|
64
|
+
- clippy
|
18
65
|
extensions: []
|
19
66
|
extra_rdoc_files: []
|
20
67
|
files:
|
68
|
+
- lib/clippy.rb
|
69
|
+
- bin/clippy
|
21
70
|
- readme.txt
|
22
71
|
- license.txt
|
23
72
|
- rakefile.rb
|
24
73
|
- gemfile.rb
|
25
|
-
- lib/clippy.rb
|
26
74
|
homepage: https://github.com/envygeeks/clippy
|
27
75
|
licenses:
|
28
76
|
- MIT
|
@@ -39,9 +87,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
39
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
88
|
none: false
|
41
89
|
requirements:
|
42
|
-
- - ! '
|
90
|
+
- - ! '>='
|
43
91
|
- !ruby/object:Gem::Version
|
44
|
-
version:
|
92
|
+
version: '0'
|
45
93
|
requirements: []
|
46
94
|
rubyforge_project:
|
47
95
|
rubygems_version: 1.8.11
|
@@ -49,4 +97,3 @@ signing_key:
|
|
49
97
|
specification_version: 3
|
50
98
|
summary: A utility to access the systems clipboard.
|
51
99
|
test_files: []
|
52
|
-
has_rdoc: false
|