Graphiclious 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +126 -0
- data/Rakefile +28 -0
- data/bin/graphiclious +3 -0
- data/doc/cloud.jpg +0 -0
- data/doc/index.html +32 -0
- data/doc/screenshots/default.css +44 -0
- data/doc/screenshots/original/blue-style-1.html +37 -0
- data/doc/screenshots/original/blue-style-1.jpg +0 -0
- data/doc/screenshots/original/cornflower.html +37 -0
- data/doc/screenshots/original/cornflower.jpg +0 -0
- data/doc/screenshots/original/custom-style.html +37 -0
- data/doc/screenshots/original/custom-style.jpg +0 -0
- data/doc/screenshots/original/sample-graph.html +37 -0
- data/doc/screenshots/original/sample-graph.jpg +0 -0
- data/doc/screenshots/original/user-interface.html +37 -0
- data/doc/screenshots/original/user-interface.jpg +0 -0
- data/doc/screenshots/thumb.html +46 -0
- data/doc/screenshots/thumb/t_blue-style-1.jpg +0 -0
- data/doc/screenshots/thumb/t_cornflower.jpg +0 -0
- data/doc/screenshots/thumb/t_custom-style.jpg +0 -0
- data/doc/screenshots/thumb/t_sample-graph.jpg +0 -0
- data/doc/screenshots/thumb/t_user-interface.jpg +0 -0
- data/doc/style.css +60 -0
- data/gemspec.rb +45 -0
- data/lib/graphiclious.rb +78 -0
- data/lib/graphiclious/delicious2yaml.rb +235 -0
- data/lib/graphiclious/dot_attributes.rb +35 -0
- data/lib/graphiclious/environment.rb +36 -0
- data/lib/graphiclious/gui.rb +260 -0
- data/lib/graphiclious/help.rb +22 -0
- data/lib/graphiclious/require_fox.rb +12 -0
- data/lib/graphiclious/url_graph.rb +135 -0
- data/lib/graphiclious/utf8.rb +19 -0
- data/lib/graphiclious/version.rb +8 -0
- data/lib/graphiclious/yaml-links2html.rb +476 -0
- data/options.yaml +7 -0
- data/styles/blue-style-1/dot-attributes.yaml +21 -0
- data/styles/blue-style-1/extern.gif +0 -0
- data/styles/blue-style-1/style.css +128 -0
- data/styles/cornflower/cornflower.png +0 -0
- data/styles/cornflower/dot-attributes.yaml +21 -0
- data/styles/cornflower/extern.gif +0 -0
- data/styles/cornflower/h3.gif +0 -0
- data/styles/cornflower/menuitem.png +0 -0
- data/styles/cornflower/menuselected.png +0 -0
- data/styles/cornflower/style.css +149 -0
- data/styles/cornflower/tr-edge.png +0 -0
- data/test/test_delicious2yaml.rb +97 -0
- data/wickie +249 -0
- metadata +119 -0
Binary file
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
2
|
+
"http://www.w3.org/TR/html4/strict.dtd">
|
3
|
+
<html>
|
4
|
+
|
5
|
+
<head>
|
6
|
+
<meta name="GENERATOR" content="XnView">
|
7
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
8
|
+
<meta http-equiv="Content-Language" content="en-us">
|
9
|
+
<title>Graphiclious screenshots</title>
|
10
|
+
<link rel="stylesheet" type="text/css" href="default.css">
|
11
|
+
</head>
|
12
|
+
|
13
|
+
<body>
|
14
|
+
<h1>Graphiclious</h1>
|
15
|
+
<p>
|
16
|
+
<a href="../index.html">Back to Homepage</a>
|
17
|
+
</p>
|
18
|
+
<table cellpadding="10" cellspacing="0">
|
19
|
+
<tr><td>
|
20
|
+
<a href="original/blue-style-1.html"><img src="thumb/t_blue-style-1.jpg" alt="blue-style-1.jpg" width="100" height="81"></a>
|
21
|
+
<div>blue-style-1</div>
|
22
|
+
</td>
|
23
|
+
<td>
|
24
|
+
<a href="original/cornflower.html"><img src="thumb/t_cornflower.jpg" alt="cornflower.jpg" width="100" height="63"></a>
|
25
|
+
<div>cornflower</div>
|
26
|
+
</td>
|
27
|
+
<td>
|
28
|
+
<a href="original/custom-style.html"><img src="thumb/t_custom-style.jpg" alt="custom-style.jpg" width="100" height="77"></a>
|
29
|
+
<div>custom-style</div>
|
30
|
+
</td>
|
31
|
+
</tr>
|
32
|
+
<tr>
|
33
|
+
<td>
|
34
|
+
<a href="original/sample-graph.html"><img src="thumb/t_sample-graph.jpg" alt="sample-graph.jpg" width="100" height="61"></a>
|
35
|
+
<div>sample-graph</div>
|
36
|
+
</td>
|
37
|
+
<td>
|
38
|
+
<a href="original/user-interface.html"><img src="thumb/t_user-interface.jpg" alt="user-interface.jpg" width="81" height="100"></a>
|
39
|
+
<div>user-interface</div>
|
40
|
+
</td>
|
41
|
+
</tr>
|
42
|
+
</table>
|
43
|
+
|
44
|
+
<p><i>This thumbnail page was generated by <a href="http://www.xnview.com">XnView</a></i></p>
|
45
|
+
</body>
|
46
|
+
</html>
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/doc/style.css
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
/**
|
2
|
+
#3333AA => dunkel
|
3
|
+
#91B1EE => himmel = 145/177/238
|
4
|
+
#E2EAF9 => hell
|
5
|
+
|
6
|
+
*/
|
7
|
+
|
8
|
+
/** Basic paragraph styles
|
9
|
+
*/
|
10
|
+
body {
|
11
|
+
color:#FFFFFF;
|
12
|
+
background:#91B1EE url(cloud.jpg) no-repeat top left;
|
13
|
+
border-width:medium;
|
14
|
+
border-top-color:#FFFFFF;
|
15
|
+
border-bottom-color:#000000;
|
16
|
+
border-left-color:#FFFFFF;
|
17
|
+
border-right-color:#000000;
|
18
|
+
}
|
19
|
+
h1 {
|
20
|
+
color:#3333AA;
|
21
|
+
padding:20px;
|
22
|
+
}
|
23
|
+
div.main {
|
24
|
+
width:70%;
|
25
|
+
vertical-align:top;
|
26
|
+
color:#000000;
|
27
|
+
background-color:#E2EAF9;
|
28
|
+
margin:0px;
|
29
|
+
margin-left:20px;
|
30
|
+
padding:20px;
|
31
|
+
}
|
32
|
+
img {
|
33
|
+
border-style:none;
|
34
|
+
}
|
35
|
+
ul {
|
36
|
+
list-style-type:square;
|
37
|
+
}
|
38
|
+
/* Basic link style
|
39
|
+
*/
|
40
|
+
a:link {
|
41
|
+
color:black;
|
42
|
+
text-decoration:underline;
|
43
|
+
}
|
44
|
+
a:visited {
|
45
|
+
color:#555555;
|
46
|
+
text-decoration:underline;
|
47
|
+
}
|
48
|
+
a:hover {
|
49
|
+
color:black;
|
50
|
+
text-decoration:underline;
|
51
|
+
}
|
52
|
+
a:active {
|
53
|
+
color:black;
|
54
|
+
text-decoration:none;
|
55
|
+
}
|
56
|
+
|
57
|
+
.extern {
|
58
|
+
background: transparent url(extern.gif) no-repeat top left;
|
59
|
+
padding-left:12px;
|
60
|
+
}
|
data/gemspec.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#$Id: gemspec.rb,v 1.1 2005/04/07 20:41:21 wsdng Exp $
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'lib/graphiclious/version.rb'
|
6
|
+
|
7
|
+
summary = String.new
|
8
|
+
summary <<
|
9
|
+
'Create an html image map pointing to generated
|
10
|
+
static html pages from your del.icio.us links.
|
11
|
+
|
12
|
+
Uses Rubilicious and Graphviz.
|
13
|
+
|
14
|
+
Interface done with FXRuby'
|
15
|
+
|
16
|
+
spec = Gem::Specification.new do |s|
|
17
|
+
s.name = "Graphiclious"
|
18
|
+
s.version = Graphiclious.version
|
19
|
+
s.author = "Sascha D�rdelmann"
|
20
|
+
s.email = "wsdngatrubyforge at hinterkattentuffel.de"
|
21
|
+
s.homepage = "http://rubyforge.org/projects/rgl/"
|
22
|
+
s.platform = Gem::Platform::RUBY
|
23
|
+
s.summary = summary
|
24
|
+
s.files = Dir.glob("**/*").reject { |f|
|
25
|
+
f =~ /~$/ || f =~ /\.gem/
|
26
|
+
}
|
27
|
+
s.require_path = "lib"
|
28
|
+
s.executables = Dir.glob("bin/*").reject { |globFile|
|
29
|
+
globFile =~ /~$/
|
30
|
+
}.collect { |f|
|
31
|
+
File.basename(f)
|
32
|
+
}
|
33
|
+
s.has_rdoc = false
|
34
|
+
s.add_dependency("Rubilicious")
|
35
|
+
s.add_dependency("rgl")
|
36
|
+
end
|
37
|
+
|
38
|
+
if $0 == __FILE__
|
39
|
+
Gem::manage_gems
|
40
|
+
gem = Gem::Builder.new(spec).build
|
41
|
+
cmd = "gem install #{gem}"
|
42
|
+
puts "Please run: #{cmd}"
|
43
|
+
end
|
44
|
+
|
45
|
+
|
data/lib/graphiclious.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#$Id: graphiclious.rb,v 1.9 2006/03/03 22:19:23 monora Exp $
|
3
|
+
|
4
|
+
require 'getoptlong'
|
5
|
+
|
6
|
+
getOpt = GetoptLong.new(["--user", "-u", GetoptLong::REQUIRED_ARGUMENT],
|
7
|
+
["--password", "-p", GetoptLong::REQUIRED_ARGUMENT],
|
8
|
+
["--gui", "-g", GetoptLong::NO_ARGUMENT],
|
9
|
+
["--noupdate", "-l", GetoptLong::NO_ARGUMENT],
|
10
|
+
["--nohtml", "-o", GetoptLong::NO_ARGUMENT],
|
11
|
+
["--bundles", "-b", GetoptLong::NO_ARGUMENT],
|
12
|
+
["--version", "-v", GetoptLong::NO_ARGUMENT],
|
13
|
+
["--delicious", "-d", GetoptLong::NO_ARGUMENT],
|
14
|
+
["--help", "-h", GetoptLong::NO_ARGUMENT])
|
15
|
+
|
16
|
+
opts = Hash.new
|
17
|
+
getOpt.each do |opt, arg|
|
18
|
+
opts[opt] = arg && !arg.empty? ? arg : true
|
19
|
+
end
|
20
|
+
|
21
|
+
# undocumented debug option
|
22
|
+
if $DEBUG # $DEBUG == true ?
|
23
|
+
require 'yaml'
|
24
|
+
File.open("options.yaml", 'w') { |out|
|
25
|
+
YAML.dump(opts, out)
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
if opts["--version"]
|
30
|
+
require 'graphiclious/version'
|
31
|
+
puts Graphiclious.version
|
32
|
+
end
|
33
|
+
|
34
|
+
def printHelpUsageOn(io_stream)
|
35
|
+
require 'graphiclious/help'
|
36
|
+
io_stream.puts Graphiclious.help
|
37
|
+
end
|
38
|
+
|
39
|
+
if opts["--help"]
|
40
|
+
printHelpUsageOn($stdout)
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
|
44
|
+
user = opts["--user"]
|
45
|
+
password = opts["--password"]
|
46
|
+
|
47
|
+
if opts["--gui"]
|
48
|
+
require 'graphiclious/gui'
|
49
|
+
application = Fox::FXApp.new("Graphiclious", "Sascha D?rdelmann")
|
50
|
+
window = GraphicliousMainWindow.new(application, user, password)
|
51
|
+
window.setOptionFetch(!opts["--noupdate"])
|
52
|
+
window.setOptionGenerate(!opts["--nohtml"])
|
53
|
+
window.setOptionDelicious(opts["--delicious"])
|
54
|
+
window.setOptionBundles(opts["--bundles"])
|
55
|
+
application.addSignal("SIGINT", window.method(:onCmdQuit))
|
56
|
+
application.create
|
57
|
+
application.run
|
58
|
+
else
|
59
|
+
unless (user && password) || opts["--noupdate"]
|
60
|
+
printHelpUsageOn($stderr)
|
61
|
+
exit
|
62
|
+
end
|
63
|
+
unless opts["--noupdate"]
|
64
|
+
require 'graphiclious/delicious2yaml'
|
65
|
+
importer = Delicious2Yaml.new(user, password)
|
66
|
+
importer.run
|
67
|
+
importer.fetch_and_store_bundles if opts["--bundles"]
|
68
|
+
end
|
69
|
+
unless opts["--nohtml"]
|
70
|
+
require 'graphiclious/yaml-links2html'
|
71
|
+
exporter = YamlLinksToHtml.new
|
72
|
+
exporter.link_to_delicious_if_possible = opts["--delicious"]
|
73
|
+
exporter.run
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
|
@@ -0,0 +1,235 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#$Id: delicious2yaml.rb,v 1.8 2006/03/07 23:39:04 wsdng Exp $
|
3
|
+
|
4
|
+
require_gem 'Rubilicious'
|
5
|
+
|
6
|
+
if(Rubilicious::VERSION == '0.1.5')
|
7
|
+
class Rubilicious
|
8
|
+
def all(tag = nil)
|
9
|
+
args = [(tag ? "tag=#{tag.uri_escape}" : nil)]
|
10
|
+
get('posts/all?' << args.compact.join('&'), 'post').map do |e|
|
11
|
+
e['time'] = Time::from_iso8601(e['time'])
|
12
|
+
e['tags'] = e['tag'].split(/\s/) # wrong in 1.5
|
13
|
+
e # missing in 1.5
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'yaml'
|
20
|
+
require 'graphiclious/utf8'
|
21
|
+
|
22
|
+
class Delicious2Yaml
|
23
|
+
|
24
|
+
MODES = {:a_recent => 'update recent', :b_all => 'fetch all' }
|
25
|
+
|
26
|
+
def initialize(user_string, password_string)
|
27
|
+
@working_dir = Dir.getwd
|
28
|
+
@user = user_string
|
29
|
+
@password = password_string
|
30
|
+
@interface = create_interface
|
31
|
+
@mode = :b_all
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_interface
|
35
|
+
@interface = Rubilicious.new(@user, @password)
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_working_dir(new_working_dir)
|
39
|
+
@working_dir = new_working_dir
|
40
|
+
end
|
41
|
+
|
42
|
+
def set_mode(new_mode)
|
43
|
+
unless MODES.has_key?(new_mode)
|
44
|
+
raise("Sorry, this mode is not possible")
|
45
|
+
return
|
46
|
+
end
|
47
|
+
@mode = new_mode
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_protocol_block(aProc)
|
51
|
+
@protocol_block = aProc
|
52
|
+
end
|
53
|
+
|
54
|
+
def writeLineOnProtokoll(lineString)
|
55
|
+
if @protocol_block.nil?
|
56
|
+
puts(lineString)
|
57
|
+
else
|
58
|
+
@protocol_block.call(lineString)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# this is the main doit, just like update but with
|
63
|
+
# basic exception handling
|
64
|
+
# returns true if update was necessary and successful
|
65
|
+
def run
|
66
|
+
begin
|
67
|
+
update
|
68
|
+
true
|
69
|
+
rescue StandardError => bang
|
70
|
+
writeLineOnProtokoll "Error: #{bang}"
|
71
|
+
false
|
72
|
+
rescue
|
73
|
+
writeLineOnProtokoll "Error, maybe try again later?"
|
74
|
+
false
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# get links from del.icio.us and add them to the
|
79
|
+
# locally stored links
|
80
|
+
# you'll have to edit the delicious*.yaml file to delete a link
|
81
|
+
# (or delete the file to get a clean copy next time)
|
82
|
+
def update
|
83
|
+
fetch_and_store_links
|
84
|
+
fetch_and_store_bundles
|
85
|
+
end
|
86
|
+
|
87
|
+
protected
|
88
|
+
|
89
|
+
def file_base
|
90
|
+
File.join(output_path, 'delicious')
|
91
|
+
end
|
92
|
+
|
93
|
+
def output_path
|
94
|
+
File.join(@working_dir, @user)
|
95
|
+
end
|
96
|
+
|
97
|
+
# wait a constant time between two requests to del.icio.us
|
98
|
+
def delay
|
99
|
+
sleep(1)
|
100
|
+
end
|
101
|
+
|
102
|
+
# create output-directory if necessary
|
103
|
+
def create_output_dir
|
104
|
+
Dir.mkdir(output_path) unless File.directory?(output_path)
|
105
|
+
end
|
106
|
+
|
107
|
+
# compare the last change time given by del.icio.us against
|
108
|
+
# the last update time which is stored in a yaml-file
|
109
|
+
def update_necessary?
|
110
|
+
writeLineOnProtokoll("Check for updates for #{@user} now.")
|
111
|
+
|
112
|
+
@time = @interface.update
|
113
|
+
if File.exists?("#{file_base}.time")
|
114
|
+
last_time = File.open("#{file_base}.time", 'r') { |io|
|
115
|
+
YAML.load(io)
|
116
|
+
}
|
117
|
+
end
|
118
|
+
writeLineOnProtokoll "Last entry was #{@time.to_s}"
|
119
|
+
writeLineOnProtokoll "Last update was #{last_time.to_s}"
|
120
|
+
!last_time || @time > last_time
|
121
|
+
end
|
122
|
+
|
123
|
+
# will write the file *.time containing member @time in yaml format
|
124
|
+
def store_time
|
125
|
+
create_output_dir
|
126
|
+
File.open("#{file_base}.time", 'w') { |out|
|
127
|
+
YAML.dump(@time, out)
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
# Get some or all the user's links from del.icio.us depending
|
132
|
+
# on the chosen mode
|
133
|
+
def fetch_and_store_links
|
134
|
+
method(@mode).call
|
135
|
+
end
|
136
|
+
|
137
|
+
# Get the user's bundles from del.icio.us, a bundle is a group of
|
138
|
+
# tags. Note that, this method will not fetch any link.
|
139
|
+
def fetch_and_store_bundles
|
140
|
+
delay
|
141
|
+
bundles = @interface.bundles
|
142
|
+
create_output_dir
|
143
|
+
File.open(File.join(output_path, 'bundles.yaml'), 'w') { |out|
|
144
|
+
YAML.dump(bundles, out)
|
145
|
+
}
|
146
|
+
writeLineOnProtokoll "#{bundles.keys.size.to_s} bundles availiable"
|
147
|
+
true
|
148
|
+
end
|
149
|
+
|
150
|
+
# each mode is one method
|
151
|
+
|
152
|
+
# Mode a_recent will use the recent method to fetch the newest
|
153
|
+
# links and add them to the previously stored ones.
|
154
|
+
# It will fetch the links without caring if there is anything
|
155
|
+
# new to fetch since last time.
|
156
|
+
# It might overwrite but will not delete any previously stored links
|
157
|
+
def a_recent
|
158
|
+
writeLineOnProtokoll "Requesting recent changes"
|
159
|
+
store_new(@interface.recent, false)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Mode b_all will use the all method to fetch all
|
163
|
+
# links and replace the previously stored ones.
|
164
|
+
# It will fetch the links only if there is anything
|
165
|
+
# new since the last fetch with this method.
|
166
|
+
def b_all
|
167
|
+
return false unless update_necessary?
|
168
|
+
writeLineOnProtokoll "Requesting all at once"
|
169
|
+
return false unless store_new(@interface.all, true)
|
170
|
+
store_time if @time
|
171
|
+
true
|
172
|
+
end
|
173
|
+
|
174
|
+
# store links as yaml file, delete previously stored links
|
175
|
+
# if overwrite == true (default)
|
176
|
+
def store_new(newLinks, overwrite=true)
|
177
|
+
return false if !newLinks || newLinks.empty?
|
178
|
+
cache = overwrite ? Hash.new : get_locally_stored_links
|
179
|
+
newLinks.each do
|
180
|
+
|link|
|
181
|
+
# writeLineOnProtokoll "\tGot #{link['href']}"
|
182
|
+
cache[link['hash']] = Graphiclious.link_with_utf8_strings(link)
|
183
|
+
end
|
184
|
+
store_links(cache)
|
185
|
+
true
|
186
|
+
end
|
187
|
+
|
188
|
+
# get all of the user's links from delicious*.yaml file
|
189
|
+
def get_locally_stored_links
|
190
|
+
cache = Hash.new
|
191
|
+
if File.exist?("#{file_base}.yaml")
|
192
|
+
cache = File.open("#{file_base}.yaml", 'r') { |io|
|
193
|
+
YAML.load(io)
|
194
|
+
}
|
195
|
+
end
|
196
|
+
cache
|
197
|
+
end
|
198
|
+
|
199
|
+
# store given links into delicious*.yaml file
|
200
|
+
def store_links(cache)
|
201
|
+
create_output_dir
|
202
|
+
File.open("#{file_base}.yaml", 'w') { |out|
|
203
|
+
YAML.dump(cache, out)
|
204
|
+
}
|
205
|
+
writeLineOnProtokoll "#{cache.keys.size.to_s} links availiable"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
if $0 == __FILE__
|
210
|
+
def get_string_from_user
|
211
|
+
gets[0..-2]
|
212
|
+
end
|
213
|
+
|
214
|
+
def get_password_from_user
|
215
|
+
get_string_from_user
|
216
|
+
end
|
217
|
+
|
218
|
+
if ARGV.size > 0
|
219
|
+
user = ARGV[0]
|
220
|
+
else
|
221
|
+
puts "del.icio.us user?"
|
222
|
+
user = get_string_from_user
|
223
|
+
end
|
224
|
+
exit(1) if !user || user.empty?
|
225
|
+
|
226
|
+
if ARGV.size > 1
|
227
|
+
password = ARGV[1]
|
228
|
+
else
|
229
|
+
puts "password for #{user}?\n(Attention: will be shown)"
|
230
|
+
password = get_password_from_user
|
231
|
+
end
|
232
|
+
exit(1) if !password || password.empty?
|
233
|
+
|
234
|
+
Delicious2Yaml.new(user, password).run
|
235
|
+
end
|