rack-golden_frill 0.1.1
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/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +23 -0
- data/Rakefile +9 -0
- data/golden_frill.gemspec +25 -0
- data/lib/golden_frill/version.rb +3 -0
- data/lib/golden_frill.rb +63 -0
- data/lib/rack/golden_frill.rb +30 -0
- data/test/images/.gitignore +1 -0
- data/test/test_frills.rb +16 -0
- metadata +126 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
golden_frill (0.1.0)
|
5
|
+
chunky_png (>= 0.10.4)
|
6
|
+
rack (>= 1.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
chunky_png (0.10.4)
|
12
|
+
rack (1.2.1)
|
13
|
+
test-unit (2.1.1)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
ruby
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
bundler (>= 1.0.0)
|
20
|
+
chunky_png (>= 0.10.4)
|
21
|
+
golden_frill!
|
22
|
+
rack (>= 1.0)
|
23
|
+
test-unit
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path("../lib/golden_frill/version", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "rack-golden_frill"
|
6
|
+
s.version = GoldenFrill::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Alexander Bartlow"]
|
9
|
+
s.email = ["bartlowa@gmail.com"]
|
10
|
+
s.homepage = "http://rubygems.org/gems/golden_frill"
|
11
|
+
s.summary = "Simple Rack-based frils for your website"
|
12
|
+
s.description = "Generates on-demand 'ribbony' links that protrude to the left or right of active links"
|
13
|
+
|
14
|
+
s.required_rubygems_version = ">= 1.3.6"
|
15
|
+
s.rubyforge_project = "rack-golden_frill"
|
16
|
+
|
17
|
+
s.add_dependency "chunky_png", ">= 0.10.4"
|
18
|
+
s.add_dependency "rack", ">= 1.0"
|
19
|
+
s.add_development_dependency "bundler", ">= 1.0.0"
|
20
|
+
s.add_development_dependency "test-unit"
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
23
|
+
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
|
24
|
+
s.require_path = 'lib'
|
25
|
+
end
|
data/lib/golden_frill.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'chunky_png'
|
2
|
+
module GoldenFrill
|
3
|
+
GoldenRatio = 1.618
|
4
|
+
# Requires:
|
5
|
+
# output_path : the path at which to output the requested image
|
6
|
+
# width: the width the rectangle above the frill
|
7
|
+
# height: the height of the rectangle above the frill
|
8
|
+
# base_color: the color of the rectangle above the frill
|
9
|
+
#
|
10
|
+
# Optional:
|
11
|
+
# frill_color: the color of the frill. If not provided, will be a darker color than the base
|
12
|
+
def self.run!(opts)
|
13
|
+
width, height, base_color, output_path = opts[:width], opts[:height], opts[:base_color], opts[:output_path]
|
14
|
+
|
15
|
+
bot_height = height.to_i + (width.to_f * GoldenRatio).to_i
|
16
|
+
png = ChunkyPNG::Image.new(width.to_i, bot_height)
|
17
|
+
|
18
|
+
rc = ChunkyPNG::Color.from_hex(base_color)
|
19
|
+
(1..(height - 1)).each do |h|
|
20
|
+
(1..(width - 1)).each do |w|
|
21
|
+
png[w,h] = rc
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
ribbon_color = if opts[:frill_color]
|
26
|
+
ChunkyPNG::Color.from_hex(opts[:frill_color])
|
27
|
+
else
|
28
|
+
self.darken_color(rc)
|
29
|
+
end
|
30
|
+
|
31
|
+
slope = (height - bot_height).to_f / (1 - width).to_f
|
32
|
+
|
33
|
+
(height..(bot_height - 1)).each do |h|
|
34
|
+
(1..(width - 1)).each do |w|
|
35
|
+
on_line_slope = (w * slope) + height
|
36
|
+
next if on_line_slope.to_i + 1 < h
|
37
|
+
|
38
|
+
alpha_scale = case (on_line_slope.to_i + 1) - h
|
39
|
+
when 1 then 0.8
|
40
|
+
when 0 then 0.5
|
41
|
+
else
|
42
|
+
1.0
|
43
|
+
end
|
44
|
+
a = (0xff.to_f * alpha_scale).to_i
|
45
|
+
|
46
|
+
new_color = ((w + 3) - (width - 1)).times.inject(ribbon_color){|rc, fade|
|
47
|
+
darken_color(rc, 0.95)
|
48
|
+
}
|
49
|
+
new_color = ChunkyPNG::Color.fade(new_color, a)
|
50
|
+
|
51
|
+
# fade the color to a black gradient if in the last couple pixels of the ribbon
|
52
|
+
png[w,h] = new_color
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
png.save(output_path)
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.darken_color(c, scale = 0.8)
|
60
|
+
r, g, b = %w{r g b}.map{|x| (ChunkyPNG::Color.send(x, c).to_f * scale).to_i}
|
61
|
+
ChunkyPNG::Color.rgb(r,g,b)
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Rack
|
2
|
+
class GoldenFrill
|
3
|
+
def initialize app, output_path
|
4
|
+
@app = app
|
5
|
+
@root = ::File.expand_path(output_path)
|
6
|
+
raise ArgumentError, "#{output_path} is not a directory" unless ::File.directory?(@root)
|
7
|
+
end
|
8
|
+
|
9
|
+
def call env
|
10
|
+
unless env["PATH_INFO"] =~ /#{@root}/
|
11
|
+
return @app.call(env)
|
12
|
+
end
|
13
|
+
|
14
|
+
request = ::Rack::Request.new(env)
|
15
|
+
command = env["PATH_INFO"].match(/#{@root}\/frill_(.*)\.png/i)[1]
|
16
|
+
|
17
|
+
image_path = ::File.join(@root,"frill_#{command}.png")
|
18
|
+
if ::File.exist?(image_path)
|
19
|
+
return ::Rack::File.new(@root).call(env)
|
20
|
+
end
|
21
|
+
|
22
|
+
opts = { :output_path => image_path }
|
23
|
+
opts[:base_color], opts[:width], opts[:height], opts[:frill_color] = command.split('.')
|
24
|
+
::GoldenFrill.new(opts).run!
|
25
|
+
|
26
|
+
# Redirect to this URL since it will now be served.
|
27
|
+
return [301, {'Location' => request.url}, 'Redirecting to created image.']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
*.png
|
data/test/test_frills.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'golden_frill'
|
3
|
+
class TestFrills < Test::Unit::TestCase
|
4
|
+
OUTPUT_ROOT = ::File.expand_path('./images', File::dirname(__FILE__))
|
5
|
+
def test_output
|
6
|
+
output_path = File.join(OUTPUT_ROOT,"rectangle.png")
|
7
|
+
GoldenFrill.run!({
|
8
|
+
:output_path => output_path,
|
9
|
+
:base_color => "d4412d",
|
10
|
+
:width => 14,
|
11
|
+
:height => 36
|
12
|
+
})
|
13
|
+
|
14
|
+
assert(::File.exists?(output_path))
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack-golden_frill
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Alexander Bartlow
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-10-20 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: chunky_png
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 10
|
30
|
+
- 4
|
31
|
+
version: 0.10.4
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rack
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 0
|
44
|
+
version: "1.0"
|
45
|
+
type: :runtime
|
46
|
+
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
prerelease: false
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 1
|
56
|
+
- 0
|
57
|
+
- 0
|
58
|
+
version: 1.0.0
|
59
|
+
type: :development
|
60
|
+
version_requirements: *id003
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: test-unit
|
63
|
+
prerelease: false
|
64
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
segments:
|
69
|
+
- 0
|
70
|
+
version: "0"
|
71
|
+
type: :development
|
72
|
+
version_requirements: *id004
|
73
|
+
description: Generates on-demand 'ribbony' links that protrude to the left or right of active links
|
74
|
+
email:
|
75
|
+
- bartlowa@gmail.com
|
76
|
+
executables: []
|
77
|
+
|
78
|
+
extensions: []
|
79
|
+
|
80
|
+
extra_rdoc_files: []
|
81
|
+
|
82
|
+
files:
|
83
|
+
- .gitignore
|
84
|
+
- Gemfile
|
85
|
+
- Gemfile.lock
|
86
|
+
- Rakefile
|
87
|
+
- golden_frill.gemspec
|
88
|
+
- lib/golden_frill.rb
|
89
|
+
- lib/golden_frill/version.rb
|
90
|
+
- lib/rack/golden_frill.rb
|
91
|
+
- test/images/.gitignore
|
92
|
+
- test/test_frills.rb
|
93
|
+
has_rdoc: true
|
94
|
+
homepage: http://rubygems.org/gems/golden_frill
|
95
|
+
licenses: []
|
96
|
+
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
segments:
|
114
|
+
- 1
|
115
|
+
- 3
|
116
|
+
- 6
|
117
|
+
version: 1.3.6
|
118
|
+
requirements: []
|
119
|
+
|
120
|
+
rubyforge_project: rack-golden_frill
|
121
|
+
rubygems_version: 1.3.6
|
122
|
+
signing_key:
|
123
|
+
specification_version: 3
|
124
|
+
summary: Simple Rack-based frils for your website
|
125
|
+
test_files: []
|
126
|
+
|