palettes 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/palettes +14 -0
- data/lib/colourlovers.rb +78 -0
- data/lib/mixin.rb +46 -0
- data/lib/palettes.rb +1 -0
- data/lib/waves/startup.rb +34 -0
- data/lib/waves/views.rb +134 -0
- metadata +97 -0
data/bin/palettes
ADDED
data/lib/colourlovers.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# Gems
|
2
|
+
require 'rubygems'
|
3
|
+
require 'json'
|
4
|
+
require 'net/http'
|
5
|
+
|
6
|
+
|
7
|
+
def Kernel.engine; defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'mri'; end
|
8
|
+
require 'jruby/openssl/gem_only' if Kernel.engine == 'jruby'
|
9
|
+
|
10
|
+
# Application Local
|
11
|
+
require 'mixin'
|
12
|
+
|
13
|
+
module Palettes
|
14
|
+
class ColourLovers
|
15
|
+
|
16
|
+
include Palettes::Mixin
|
17
|
+
|
18
|
+
def initialize(palette_id, names=false)
|
19
|
+
@palette = self.class.get_palette(palette_id, names)
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# Returns { :title => id }
|
24
|
+
def self.search(*keywords)
|
25
|
+
if keywords.respond_to? :assoc
|
26
|
+
words = keywords.inject {|result,keyword| result += "+#{keyword}"}
|
27
|
+
words.gsub!(' ','+')
|
28
|
+
else
|
29
|
+
words = keywords.gsub(' ','+')
|
30
|
+
end
|
31
|
+
|
32
|
+
palettes = ColourLovers.grab_list(words)
|
33
|
+
return nil if palettes.empty?
|
34
|
+
titles = []; ids = []; colors = []; creators = []
|
35
|
+
palettes.each do |palette|
|
36
|
+
titles << palette['title']
|
37
|
+
ids << palette['id']
|
38
|
+
colors << palette['colors']
|
39
|
+
creators << palette['userName']
|
40
|
+
end
|
41
|
+
composites=[]
|
42
|
+
(0..(titles.length-1)).each {|x| composites[x] = {:title => titles[x], :id => ids[x], :colors => colors[x], :creator => creators[x]} }
|
43
|
+
composites
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.get_palette(palette_id, names=false)
|
47
|
+
#raise ArgumentError unless palette_id.is_a? Integer
|
48
|
+
@palette = ColourLovers.grab_single palette_id.to_s
|
49
|
+
colors ||= @palette.pop['colors']
|
50
|
+
|
51
|
+
if names
|
52
|
+
color_names=[]
|
53
|
+
colors.each do |c|
|
54
|
+
response = JSON.load( Net::HTTP.get( URI.parse "http://www.colourlovers.com/api/color/#{c.to_s}?format=json" ))
|
55
|
+
color_names << response.pop['title']
|
56
|
+
end
|
57
|
+
colors.map! { |c| [color_names.shift, c] }
|
58
|
+
else
|
59
|
+
colors
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
def ColourLovers.grab_list(args)
|
65
|
+
if args.is_a? Hash
|
66
|
+
raise ArgumentError if args[:keywords].nil?
|
67
|
+
params = args.inject {|p,(a,v)| p + "#{a}=#{b}&" } # We will always add a format, so don't fear the trailing '&'
|
68
|
+
else
|
69
|
+
params = "keywords=#{args}&" if args.is_a? String
|
70
|
+
end
|
71
|
+
json = JSON.load( Net::HTTP.get( URI.parse 'http://www.colourlovers.com/api/palettes?' + params + 'format=json' ))
|
72
|
+
end
|
73
|
+
|
74
|
+
def ColourLovers.grab_single(palette_id)
|
75
|
+
json = JSON.load( Net::HTTP.get( URI.parse "http://www.colourlovers.com/api/palette/#{palette_id}?format=json" ))
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/mixin.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Palettes::Mixin
|
2
|
+
# Provides basic palette methods.
|
3
|
+
|
4
|
+
module Palettes
|
5
|
+
|
6
|
+
module Mixin
|
7
|
+
attr_reader :colors
|
8
|
+
|
9
|
+
# Palette colors may be supplied as an array of values, or an array of name/value pairs:
|
10
|
+
# Palette.new [ "#eeeeee", "#666600" ]
|
11
|
+
# Palette.new [ ["red", "#ff0000"], ["blue", "#0000ff"] ]
|
12
|
+
|
13
|
+
def fill(color_array)
|
14
|
+
@palette = color_array
|
15
|
+
end
|
16
|
+
|
17
|
+
def colors
|
18
|
+
colors = []
|
19
|
+
# We could use #map here, but then I'd have to use #compact
|
20
|
+
@palette.each { |c| c.respond_to?( :assoc ) ? colors << c.last : colors << c }
|
21
|
+
colors
|
22
|
+
end
|
23
|
+
|
24
|
+
def names
|
25
|
+
n = []
|
26
|
+
# We could use #map here, but then I'd have to use #compact
|
27
|
+
@palette.each { |c| c.respond_to?( :assoc ) ? n << c.first : nil }
|
28
|
+
n.empty? ? nil : n
|
29
|
+
end
|
30
|
+
|
31
|
+
def [](arg)
|
32
|
+
color = arg.is_a?(Integer) ? @palette[arg] : @palette.assoc(arg)
|
33
|
+
color.respond_to?(:last) ? color.last : color
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_hash
|
37
|
+
Hash[ *@palette.flatten ]
|
38
|
+
end
|
39
|
+
|
40
|
+
def raw
|
41
|
+
@palette
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/lib/palettes.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'colourlovers'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'foundations/compact'
|
2
|
+
require 'autocode'
|
3
|
+
|
4
|
+
require 'hoshi'
|
5
|
+
|
6
|
+
require 'views'
|
7
|
+
require 'palettes'
|
8
|
+
|
9
|
+
|
10
|
+
module PaletteApp
|
11
|
+
include Waves::Foundations::Compact
|
12
|
+
|
13
|
+
module Resources
|
14
|
+
class Map
|
15
|
+
|
16
|
+
# Set up our views
|
17
|
+
@index = Views::Index.new
|
18
|
+
assigns = {}
|
19
|
+
|
20
|
+
on(:get, true) { @index = Views::Index.new; @index.show }
|
21
|
+
|
22
|
+
on(:post, []) {
|
23
|
+
result = Palettes::ColourLovers.search( query['keywords'] )
|
24
|
+
@index ||= Views::Index.new
|
25
|
+
if result.nil?
|
26
|
+
@index.not_found query['keywords']
|
27
|
+
else
|
28
|
+
@index.search result, query['keywords']
|
29
|
+
end
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/lib/waves/views.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'hoshi'
|
2
|
+
require 'cassandra'
|
3
|
+
|
4
|
+
module Views
|
5
|
+
class Index < Hoshi::View(:xhtml1)
|
6
|
+
def show
|
7
|
+
doctype
|
8
|
+
html {
|
9
|
+
head {
|
10
|
+
title "Palettes"
|
11
|
+
}
|
12
|
+
body(:bgcolor => "#BCBDAC", :style => "font-family: sans-serif") {
|
13
|
+
h1 "Palettes"
|
14
|
+
h3 "A Simple Interface to Glorious Possibility"
|
15
|
+
form(:action => '/', :method => 'post') {
|
16
|
+
input(:type => 'text', :name => 'keywords')
|
17
|
+
input(:type => 'submit', :value => 'Search')
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
render
|
22
|
+
end
|
23
|
+
|
24
|
+
def not_found(keywords)
|
25
|
+
doctype
|
26
|
+
html {
|
27
|
+
head {
|
28
|
+
title "Palettes: No palettes found :("
|
29
|
+
}
|
30
|
+
body(:bgcolor => "#BCBDAC", :style => "font-family: sans-serif") {
|
31
|
+
h1 "No palettes found for #{keywords} :("
|
32
|
+
}
|
33
|
+
}
|
34
|
+
render
|
35
|
+
end
|
36
|
+
|
37
|
+
def search(result, keywords)
|
38
|
+
doctype
|
39
|
+
html {
|
40
|
+
head {
|
41
|
+
# Begin Cassandra
|
42
|
+
@css = Cssy.new
|
43
|
+
@css.process {
|
44
|
+
|
45
|
+
li.palette_box {
|
46
|
+
border(:solid)
|
47
|
+
margin_bottom('3em')
|
48
|
+
background_color("#DBE6EC")
|
49
|
+
width('780px')
|
50
|
+
height('350px')
|
51
|
+
position(:relative)
|
52
|
+
z_index('1')
|
53
|
+
}
|
54
|
+
|
55
|
+
td.color_bar {
|
56
|
+
vertical_align(:top)
|
57
|
+
font_size('xx-small')
|
58
|
+
}
|
59
|
+
|
60
|
+
table.colors {
|
61
|
+
width('440px');
|
62
|
+
height('330px');
|
63
|
+
border(:solid);
|
64
|
+
margin('10px');
|
65
|
+
position(:relative)
|
66
|
+
z_index('2')
|
67
|
+
}
|
68
|
+
|
69
|
+
div.info_box {
|
70
|
+
position(:absolute)
|
71
|
+
top('0px')
|
72
|
+
left('480px')
|
73
|
+
z_index('2')
|
74
|
+
width("295px")
|
75
|
+
}
|
76
|
+
|
77
|
+
dl.info {
|
78
|
+
margin_top("1.5em")
|
79
|
+
list_style(:none)
|
80
|
+
position(:relative)
|
81
|
+
}
|
82
|
+
|
83
|
+
dd{
|
84
|
+
margin_left('1em')
|
85
|
+
padding('0')
|
86
|
+
}
|
87
|
+
|
88
|
+
ul.colors { list_style(:none); margin("0"); padding("0") }
|
89
|
+
li.colors { margin_left("3px") }
|
90
|
+
ol.palettes { list_style(:none); position(:relative) }
|
91
|
+
body { position(:relative) }
|
92
|
+
a { color(:black); text_decoration(:none) }
|
93
|
+
selector("a:hover") { text_decoration(:underline) }
|
94
|
+
}
|
95
|
+
style @css.to_s, "type"=>"text/css"
|
96
|
+
# End Cassandra
|
97
|
+
|
98
|
+
title "Palette Search: #{keywords}"
|
99
|
+
}
|
100
|
+
body(:bgcolor => "#BCBDAC", :style => "font-family: sans-serif") {
|
101
|
+
h1 "Palettes"
|
102
|
+
h3 "Search results for: #{keywords}"
|
103
|
+
ol(:class => "palettes") {
|
104
|
+
result.each do |r|
|
105
|
+
li(:class => "palette_box") {
|
106
|
+
table(:class => "colors", 'cellspacing' => '0px' ) { tr {
|
107
|
+
r[:colors].each {|color|
|
108
|
+
td(:class => 'color_bar', :title => "##{color}",
|
109
|
+
:style => " width: #{440/r[:colors].length}px;
|
110
|
+
color: ##{color};
|
111
|
+
background-color: ##{color}") { raw "##{color}" }
|
112
|
+
}#td (loop)
|
113
|
+
} }#tr, table.colors
|
114
|
+
div(:class => "info_box") {
|
115
|
+
h3 { a(:href => "http://colourlovers.com/palette/#{r[:id].to_s}") { raw "#{r[:title].to_s}" } }
|
116
|
+
dl(:class => "info") {
|
117
|
+
dt { raw "Creator: " }
|
118
|
+
dd { raw "#{r[:creator]}"}
|
119
|
+
dt { raw "ID: " }
|
120
|
+
dd { raw "#{r[:id]}"}
|
121
|
+
dt { raw "Colors: " }
|
122
|
+
dd { ul(:class => "colors") { r[:colors].each {|color| li(:class=>"colors") { raw "##{color}" } }}}
|
123
|
+
}#dl.info
|
124
|
+
}#div.info_box
|
125
|
+
}#li.palette_box
|
126
|
+
end
|
127
|
+
}#ol.palettes
|
128
|
+
}
|
129
|
+
}
|
130
|
+
render
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: palettes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- ab5tract
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-11-25 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: waves
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: hoshi
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: cassandra
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: json
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
description: Palettes is for making masterpieces.
|
56
|
+
email: john.haltiwanger@gmail.com
|
57
|
+
executables:
|
58
|
+
- palettes
|
59
|
+
extensions: []
|
60
|
+
|
61
|
+
extra_rdoc_files: []
|
62
|
+
|
63
|
+
files:
|
64
|
+
- bin/palettes
|
65
|
+
- lib/palettes.rb
|
66
|
+
- lib/colourlovers.rb
|
67
|
+
- lib/mixin.rb
|
68
|
+
- lib/waves/startup.rb
|
69
|
+
- lib/waves/views.rb
|
70
|
+
has_rdoc: false
|
71
|
+
homepage: http://github.com/ab5tract/palettes
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: "0"
|
82
|
+
version:
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: "0"
|
88
|
+
version:
|
89
|
+
requirements: []
|
90
|
+
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.3.1
|
93
|
+
signing_key:
|
94
|
+
specification_version: 2
|
95
|
+
summary: Palettes accesses the ColourLovers API through a Waves instance.
|
96
|
+
test_files: []
|
97
|
+
|