scruffy 0.2.0 → 0.2.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/CHANGES +8 -0
- data/Rakefile +9 -2
- data/lib/scruffy.rb +13 -0
- data/lib/scruffy/components.rb +10 -0
- data/lib/scruffy/components/viewport.rb +29 -17
- data/lib/scruffy/formatters.rb +156 -91
- data/lib/scruffy/graph.rb +22 -24
- data/lib/scruffy/helpers.rb +8 -0
- data/lib/scruffy/helpers/canvas.rb +25 -22
- data/lib/scruffy/helpers/layer_container.rb +20 -2
- data/lib/scruffy/layers.rb +15 -1
- data/lib/scruffy/layers/all_smiles.rb +121 -97
- data/lib/scruffy/layers/area.rb +38 -30
- data/lib/scruffy/layers/average.rb +52 -35
- data/lib/scruffy/layers/bar.rb +35 -22
- data/lib/scruffy/layers/base.rb +138 -126
- data/lib/scruffy/layers/line.rb +15 -9
- data/lib/scruffy/layers/sparkline_bar.rb +38 -0
- data/lib/scruffy/layers/stacked.rb +74 -59
- data/lib/scruffy/rasterizers.rb +13 -1
- data/lib/scruffy/rasterizers/batik_rasterizer.rb +35 -21
- data/lib/scruffy/rasterizers/rmagick_rasterizer.rb +19 -22
- data/lib/scruffy/renderers.rb +17 -1
- data/lib/scruffy/renderers/base.rb +39 -31
- data/lib/scruffy/renderers/cubed.rb +39 -31
- data/lib/scruffy/renderers/cubed3d.rb +53 -0
- data/lib/scruffy/renderers/empty.rb +23 -0
- data/lib/scruffy/renderers/sparkline.rb +11 -0
- data/lib/scruffy/themes.rb +81 -61
- data/lib/scruffy/version.rb +1 -1
- metadata +16 -4
data/lib/scruffy/rasterizers.rb
CHANGED
@@ -1,2 +1,14 @@
|
|
1
|
+
# ===Scruffy Rasterizers
|
2
|
+
#
|
3
|
+
# Author:: Brasten Sager
|
4
|
+
# Date:: August 10th, 2006
|
5
|
+
#
|
6
|
+
# These handle the job of rasterizing SVG images to other image formats.
|
7
|
+
# At the moment, only RMagickRasterizer exists, but others may soon follow.
|
8
|
+
#
|
9
|
+
# I'm somewhat interesting in finding a way to integrate Apache Batik, as it's
|
10
|
+
# SVG rendering seems to be superior to ImageMagick's.
|
11
|
+
module Scruffy::Rasterizers; end
|
12
|
+
|
1
13
|
require 'scruffy/rasterizers/rmagick_rasterizer.rb'
|
2
|
-
require 'scruffy/rasterizers/batik_rasterizer.rb'
|
14
|
+
require 'scruffy/rasterizers/batik_rasterizer.rb'
|
@@ -1,25 +1,39 @@
|
|
1
|
-
module Scruffy
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
module Scruffy::Rasterizers
|
2
|
+
# == Scruffy::Rasterizers::BatikRasterizer
|
3
|
+
#
|
4
|
+
# Author:: Brasten Sager
|
5
|
+
# Date:: August 14th, 2006
|
6
|
+
#
|
7
|
+
# Purely experimental. Can be used to rasterize SVG graphs with
|
8
|
+
# Apache Batik.
|
9
|
+
class BatikRasterizer
|
10
|
+
# Returns new BatikRasterizer.
|
11
|
+
#
|
12
|
+
# Options:
|
13
|
+
# command:: Command needed to execute Batik. (ie: 'java -classpath {...}')
|
14
|
+
# temp_folder:: Folder for storing temporary files being passed between Scruffy and Batik.
|
15
|
+
def initialize(options={})
|
16
|
+
@command = options[:command]
|
17
|
+
@temp_folder = options[:temp_folder]
|
18
|
+
end
|
19
|
+
|
20
|
+
# Rasterize graph.
|
21
|
+
#
|
22
|
+
# Options:
|
23
|
+
# as:: Image format to generate (PNG, JPG, et al.)
|
24
|
+
def rasterize(svg, options={})
|
25
|
+
File.open(@temp_folder + '/temp_svg.svg', 'w') { |file|
|
26
|
+
file.write(svg)
|
27
|
+
}
|
28
|
+
|
29
|
+
`#{@command} -d #{@temp_folder} -m image/#{options[:as].downcase} #{@temp_folder}/temp_svg.svg`
|
30
|
+
|
31
|
+
image = ""
|
32
|
+
File.open(@temp_folder + '/temp_svg.' + options[:as].downcase, 'r') { |file|
|
33
|
+
image = file.read
|
34
|
+
}
|
8
35
|
|
9
|
-
|
10
|
-
File.open(@temp_folder + '/temp_svg.svg', 'w') { |file|
|
11
|
-
file.write(svg)
|
12
|
-
}
|
13
|
-
|
14
|
-
`#{@command} -d #{@temp_folder} -m image/#{options[:as].downcase} #{@temp_folder}/temp_svg.svg`
|
15
|
-
|
16
|
-
image = ""
|
17
|
-
File.open(@temp_folder + '/temp_svg.' + options[:as].downcase, 'r') { |file|
|
18
|
-
image = file.read
|
19
|
-
}
|
20
|
-
|
21
|
-
image
|
22
|
-
end
|
36
|
+
image
|
23
37
|
end
|
24
38
|
end
|
25
39
|
end
|
@@ -1,31 +1,28 @@
|
|
1
|
-
module Scruffy
|
2
|
-
|
1
|
+
module Scruffy::Rasterizers
|
2
|
+
|
3
|
+
# == RMagickRasterizer
|
3
4
|
#
|
4
5
|
# Author:: Brasten Sager
|
5
|
-
# Date:: August
|
6
|
-
#
|
7
|
-
# These handle the job of rasterizing SVG images to other image formats.
|
8
|
-
# At the moment, only RMagickRasterizer exists, but others may soon follow.
|
6
|
+
# Date:: August 14th, 2006
|
9
7
|
#
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
# I didn't want RMagick required unless absolutely necessary.
|
18
|
-
require 'RMagick'
|
8
|
+
# The RMagickRasterizer converts SVG graphs to images using ImageMagick.
|
9
|
+
class RMagickRasterizer
|
10
|
+
def rasterize(svg, options={})
|
11
|
+
|
12
|
+
# I know this seems weird, I'm open to suggestions.
|
13
|
+
# I didn't want RMagick required unless absolutely necessary.
|
14
|
+
require 'RMagick'
|
19
15
|
|
20
|
-
|
21
|
-
|
22
|
-
image.resize!(options[:size][0], options[:size][1], Magick::BoxFilter, 1.25) if options[:actual_size]
|
23
|
-
if options[:to]
|
24
|
-
image.write(options[:to]) { self.format = options[:as] }
|
25
|
-
end
|
16
|
+
image = Magick::Image::from_blob(svg)[0]
|
26
17
|
|
27
|
-
|
18
|
+
# Removed for now
|
19
|
+
# image.resize!(options[:size][0], options[:size][1], Magick::BoxFilter, 1.25) if options[:actual_size]
|
20
|
+
|
21
|
+
if options[:to]
|
22
|
+
image.write(options[:to]) { self.format = options[:as] }
|
28
23
|
end
|
24
|
+
|
25
|
+
image.to_blob { self.format = options[:as] }
|
29
26
|
end
|
30
27
|
end
|
31
28
|
end
|
data/lib/scruffy/renderers.rb
CHANGED
@@ -1,5 +1,21 @@
|
|
1
|
+
# ===Scruffy Renderers
|
2
|
+
#
|
3
|
+
# Author:: Brasten Sager
|
4
|
+
# Date:: August 14th, 2006
|
5
|
+
#
|
6
|
+
# Renderers piece the entire graph together from a collection
|
7
|
+
# of components. Creating new renderers allows you to create
|
8
|
+
# entirely new layouts for your graphs.
|
9
|
+
#
|
10
|
+
# Scruffy::Renderers::Base contains the basic functionality needed
|
11
|
+
# by a layout. The easiest way to create a new layout is by subclassing
|
12
|
+
# Base.
|
13
|
+
module Scruffy::Renderers; end
|
14
|
+
|
1
15
|
require 'scruffy/renderers/base'
|
16
|
+
require 'scruffy/renderers/empty'
|
2
17
|
require 'scruffy/renderers/standard'
|
3
18
|
require 'scruffy/renderers/reversed'
|
4
19
|
require 'scruffy/renderers/cubed'
|
5
|
-
require 'scruffy/renderers/split'
|
20
|
+
require 'scruffy/renderers/split'
|
21
|
+
require 'scruffy/renderers/cubed3d'
|
@@ -1,37 +1,45 @@
|
|
1
|
-
module Scruffy
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
module Scruffy::Renderers
|
2
|
+
# ===Scruffy::Renderers::Base
|
3
|
+
#
|
4
|
+
# Author:: Brasten Sager
|
5
|
+
# Date:: August 14th, 2006
|
6
|
+
#
|
7
|
+
# Provides all the base functionality needed to render a graph, but
|
8
|
+
# does not provide a default layout.
|
9
|
+
#
|
10
|
+
# For a basic layout, see Scruffy::Renderers::Standard.
|
11
|
+
class Base
|
12
|
+
include Scruffy::Helpers::Canvas
|
13
|
+
|
14
|
+
attr_accessor :components
|
7
15
|
|
8
|
-
|
9
|
-
|
10
|
-
|
16
|
+
# Renders the graph and all components.
|
17
|
+
def render(options = {})
|
18
|
+
options[:graph_id] ||= 'scruffy_graph'
|
19
|
+
options[:complexity] ||= (global_complexity || :normal)
|
11
20
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
}
|
23
|
-
}
|
24
|
-
svg.target!
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
def global_complexity
|
29
|
-
if Kernel.const_defined? "SCRUFFY_COMPLEXITY"
|
30
|
-
SCRUFFY_COMPLEXITY
|
31
|
-
else
|
32
|
-
nil
|
21
|
+
svg = Builder::XmlMarkup.new(:indent => 2)
|
22
|
+
svg.instruct!
|
23
|
+
svg.instruct! 'DOCTYPE', 'svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" type'
|
24
|
+
svg.svg(:xmlns => "http://www.w3.org/2000/svg", 'xmlns:xlink' => "http://www.w3.org/1999/xlink", :width => options[:size].first, :height => options[:size].last) {
|
25
|
+
svg.g(:id => options[:graph_id]) {
|
26
|
+
self.components.each do |component|
|
27
|
+
component.render(svg,
|
28
|
+
bounds_for( options[:size], component.position, component.size ),
|
29
|
+
options)
|
33
30
|
end
|
34
|
-
|
31
|
+
}
|
32
|
+
}
|
33
|
+
svg.target!
|
35
34
|
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def global_complexity
|
38
|
+
if Kernel.const_defined? "SCRUFFY_COMPLEXITY"
|
39
|
+
SCRUFFY_COMPLEXITY
|
40
|
+
else
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
36
44
|
end
|
37
45
|
end
|
@@ -1,36 +1,44 @@
|
|
1
|
-
module Scruffy
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
module Scruffy::Renderers
|
2
|
+
# ===Scruffy::Renderers::Cubed
|
3
|
+
#
|
4
|
+
# Author:: Brasten Sager
|
5
|
+
# Date:: August 14th, 2006
|
6
|
+
#
|
7
|
+
# Graph layout consisting of four separate graphs arranged in a 2x2 grid.
|
8
|
+
class Cubed < Empty
|
9
|
+
VIEWPORT_SIZE = [35, 30]
|
10
|
+
VIEWPORTS = { :top_left => [10, 25],
|
11
|
+
:top_right => [55, 25],
|
12
|
+
:bottom_left => [10, 65],
|
13
|
+
:bottom_right => [55, 65] }
|
14
|
+
|
15
|
+
# Returns a Cubed instance.
|
16
|
+
def initialize
|
17
|
+
super do |components|
|
18
|
+
components << Scruffy::Components::Title.new(:title, :position => [5, 2], :size => [90, 7])
|
19
|
+
|
20
|
+
VIEWPORTS.each_pair do |category, position|
|
21
|
+
components << Scruffy::Components::Viewport.new(category, :position => position,
|
22
|
+
:size => VIEWPORT_SIZE, &graph_block(category))
|
23
|
+
end
|
9
24
|
|
10
|
-
|
11
|
-
self.components << Scruffy::Components::Viewport.new(:top_left, :position => [10, 25],
|
12
|
-
:size => [35, 30], &graph_block(:top_left))
|
13
|
-
self.components << Scruffy::Components::Viewport.new(:top_left, :position => [55, 25],
|
14
|
-
:size => [35, 30], &graph_block(:top_right))
|
15
|
-
self.components << Scruffy::Components::Viewport.new(:top_left, :position => [10, 65],
|
16
|
-
:size => [35, 30], &graph_block(:bottom_left))
|
17
|
-
self.components << Scruffy::Components::Viewport.new(:top_left, :position => [55, 65],
|
18
|
-
:size => [35, 30], &graph_block(:bottom_right))
|
19
|
-
|
20
|
-
self.components << Scruffy::Components::Legend.new(:legend, :position => [5, 13], :size => [90, 5])
|
25
|
+
components << Scruffy::Components::Legend.new(:legend, :position => [5, 13], :size => [90, 5])
|
21
26
|
end
|
22
|
-
|
23
|
-
private
|
24
|
-
def graph_block(graph_filter)
|
25
|
-
block = Proc.new { |components|
|
26
|
-
components << Scruffy::Components::Grid.new(:grid, :position => [10, 0], :size => [90, 89])
|
27
|
-
components << Scruffy::Components::ValueMarkers.new(:value_markers, :position => [0, 2], :size => [8, 89])
|
28
|
-
components << Scruffy::Components::DataMarkers.new(:data_markers, :position => [10, 92], :size => [90, 8])
|
29
|
-
components << Scruffy::Components::Graphs.new(:graphs, :position => [10, 0], :size => [90, 89], :only => graph_filter)
|
30
|
-
}
|
31
|
-
|
32
|
-
block
|
33
|
-
end
|
34
27
|
end
|
28
|
+
|
29
|
+
private
|
30
|
+
# Returns a typical graph layout.
|
31
|
+
#
|
32
|
+
# These are squeezed into viewports.
|
33
|
+
def graph_block(graph_filter)
|
34
|
+
block = Proc.new { |components|
|
35
|
+
components << Scruffy::Components::Grid.new(:grid, :position => [10, 0], :size => [90, 89])
|
36
|
+
components << Scruffy::Components::ValueMarkers.new(:value_markers, :position => [0, 2], :size => [8, 89])
|
37
|
+
components << Scruffy::Components::DataMarkers.new(:data_markers, :position => [10, 92], :size => [90, 8])
|
38
|
+
components << Scruffy::Components::Graphs.new(:graphs, :position => [10, 0], :size => [90, 89], :only => graph_filter)
|
39
|
+
}
|
40
|
+
|
41
|
+
block
|
42
|
+
end
|
35
43
|
end
|
36
44
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Scruffy::Renderers
|
2
|
+
# ===Scruffy::Renderers::Cubed3d
|
3
|
+
#
|
4
|
+
# Author:: Brasten Sager
|
5
|
+
# Date:: August 17th, 2006
|
6
|
+
#
|
7
|
+
# A 3-dimensional cube effect.
|
8
|
+
class Cubed3d < Empty
|
9
|
+
VIEWPORT_SIZE = [25, 45]
|
10
|
+
VIEWPORTS = { :top_left => [10, 25],
|
11
|
+
:top_right => [55, 25],
|
12
|
+
:bottom_left => [10, 65],
|
13
|
+
:bottom_right => [55, 65] }
|
14
|
+
|
15
|
+
# Returns a Cubed instance.
|
16
|
+
def initialize
|
17
|
+
super do |components|
|
18
|
+
components << Scruffy::Components::Title.new(:title, :position => [5, 2], :size => [90, 7])
|
19
|
+
|
20
|
+
components << Scruffy::Components::Viewport.new(:one, :position => [10, 50],
|
21
|
+
:size => VIEWPORT_SIZE, :skewY => '-25',
|
22
|
+
&graph_block(:one))
|
23
|
+
components << Scruffy::Components::Viewport.new(:two, :position => [30, 50],
|
24
|
+
:size => VIEWPORT_SIZE, :skewY => '-25',
|
25
|
+
&graph_block(:two))
|
26
|
+
components << Scruffy::Components::Viewport.new(:three, :position => [50, 50],
|
27
|
+
:size => VIEWPORT_SIZE, :skewY => '-25',
|
28
|
+
&graph_block(:three))
|
29
|
+
components << Scruffy::Components::Viewport.new(:four, :position => [70, 50],
|
30
|
+
:size => VIEWPORT_SIZE, :skewY => '-25',
|
31
|
+
&graph_block(:four))
|
32
|
+
|
33
|
+
|
34
|
+
components << Scruffy::Components::Legend.new(:legend, :position => [5, 13], :size => [90, 5])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
# Returns a typical graph layout.
|
40
|
+
#
|
41
|
+
# These are squeezed into viewports.
|
42
|
+
def graph_block(graph_filter)
|
43
|
+
block = Proc.new { |components|
|
44
|
+
components << Scruffy::Components::Grid.new(:grid, :position => [10, 0], :size => [90, 89])
|
45
|
+
components << Scruffy::Components::ValueMarkers.new(:value_markers, :position => [0, 2], :size => [8, 89])
|
46
|
+
components << Scruffy::Components::DataMarkers.new(:data_markers, :position => [10, 92], :size => [90, 8])
|
47
|
+
components << Scruffy::Components::Graphs.new(:graphs, :position => [10, 0], :size => [90, 89], :only => graph_filter)
|
48
|
+
}
|
49
|
+
|
50
|
+
block
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Scruffy::Renderers
|
2
|
+
# ===Scruffy::Renderers::Empty
|
3
|
+
#
|
4
|
+
# Author:: Brasten Sager
|
5
|
+
# Date:: August 17th, 2006
|
6
|
+
#
|
7
|
+
# An Empty graph isn't completely empty, it adds a background componenet
|
8
|
+
# to itself before handing other all other layout responsibilities to it's
|
9
|
+
# subclasses or caller.
|
10
|
+
class Empty < Base
|
11
|
+
|
12
|
+
# Returns a renderer with just a background.
|
13
|
+
#
|
14
|
+
# If a block is provided, the components array is passed to
|
15
|
+
# the block, allowing callers to add components during initialize.
|
16
|
+
def initialize
|
17
|
+
self.components = []
|
18
|
+
self.components << Scruffy::Components::Background.new(:background, :position => [0,0], :size =>[100, 100])
|
19
|
+
|
20
|
+
yield(components) if block_given?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Scruffy
|
2
|
+
module Renderers
|
3
|
+
# Experimental, do not use.
|
4
|
+
class Sparkline < Base
|
5
|
+
def initialize
|
6
|
+
self.components = []
|
7
|
+
self.components << Scruffy::Components::Graphs.new(:sparkline, :position => [0, 0], :size => [100, 100])
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/scruffy/themes.rb
CHANGED
@@ -1,70 +1,90 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
# ===Scruffy Themes
|
2
|
+
#
|
3
|
+
# Author:: Brasten Sager
|
4
|
+
# Date:: August 10th, 2006
|
5
|
+
#
|
6
|
+
# Scruffy Themes allow you to alter the colors and appearances of
|
7
|
+
# your graph.
|
8
|
+
module Scruffy::Themes
|
9
|
+
# ==Scruffy::Themes::Base
|
10
|
+
#
|
11
|
+
# Author:: Brasten Sager
|
12
|
+
# Date:: August 14th, 2006
|
13
|
+
#
|
14
|
+
# The base theme class. Most themes can be constructed simply
|
15
|
+
# by instantiating a new Base object with a hash of color values.
|
16
|
+
#
|
17
|
+
# See Scruffy::Themes::Base#instantiate for examples.
|
18
|
+
class Base
|
19
|
+
attr_accessor :background
|
20
|
+
attr_accessor :colors
|
21
|
+
attr_accessor :marker
|
22
|
+
attr_accessor :font_family
|
8
23
|
|
9
|
-
|
10
|
-
self.background = descriptor[:background]
|
11
|
-
self.colors = descriptor[:colors]
|
12
|
-
self.marker = descriptor[:marker]
|
13
|
-
self.font_family = descriptor[:font_family]
|
14
|
-
end
|
15
|
-
|
16
|
-
def next_color
|
17
|
-
@previous_color = 0 if @previous_color.nil?
|
18
|
-
@previous_color += 1
|
19
|
-
|
20
|
-
self.colors[(@previous_color-1) % self.colors.size]
|
21
|
-
end
|
22
|
-
|
23
|
-
def darken(color, shift=20)
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
def lighten(color, shift=20)
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# Keynote theme, based on Apple's Keynote presentation software.
|
24
|
+
# Returns a new Scruffy::Themes::Base object.
|
33
25
|
#
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
# Roughly, roughly based on the color scheme of www.mephistoblog.com.
|
46
|
-
class Mephisto < Base
|
47
|
-
def initialize
|
48
|
-
super({
|
49
|
-
:background => ['#101010', '#999977'],
|
50
|
-
:marker => :white,
|
51
|
-
:colors => %w(#DD3300 #66AABB #225533 #992200)
|
52
|
-
})
|
53
|
-
|
54
|
-
end
|
26
|
+
# Hash options:
|
27
|
+
# background:: background color.
|
28
|
+
# colors:: an array of color values to use for graphs.
|
29
|
+
# marker:: color used for grid lines, values, data points, etc.
|
30
|
+
# font_family:: in general, allows you to change the font used in the graph.
|
31
|
+
# This is not yet supported in most graph elements.
|
32
|
+
def initialize(descriptor)
|
33
|
+
self.background = descriptor[:background]
|
34
|
+
self.colors = descriptor[:colors]
|
35
|
+
self.marker = descriptor[:marker]
|
36
|
+
self.font_family = descriptor[:font_family]
|
55
37
|
end
|
56
38
|
|
57
|
-
#
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
:colors => %w(#007777 #444477 #994444 #77FFBB #D75A20)
|
64
|
-
})
|
65
|
-
end
|
39
|
+
# Returns the next available color in the color array.
|
40
|
+
def next_color
|
41
|
+
@previous_color = 0 if @previous_color.nil?
|
42
|
+
@previous_color += 1
|
43
|
+
|
44
|
+
self.colors[(@previous_color-1) % self.colors.size]
|
66
45
|
end
|
46
|
+
|
47
|
+
# todo: Implement darken function.
|
48
|
+
def darken(color, shift=20); end
|
67
49
|
|
50
|
+
# todo: Implement lighten function.
|
51
|
+
def lighten(color, shift=20); end
|
68
52
|
|
69
53
|
end
|
54
|
+
|
55
|
+
# Keynote theme, based on Apple's Keynote presentation software.
|
56
|
+
#
|
57
|
+
# Color values used from Gruff's default theme.
|
58
|
+
class Keynote < Base
|
59
|
+
def initialize
|
60
|
+
super({
|
61
|
+
:background => [:black, '#4A465A'],
|
62
|
+
:marker => :white,
|
63
|
+
:colors => %w(#6886B4 #FDD84E #72AE6E #D1695E #8A6EAF #EFAA43 white)
|
64
|
+
})
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Roughly, roughly based on the color scheme of www.mephistoblog.com.
|
69
|
+
class Mephisto < Base
|
70
|
+
def initialize
|
71
|
+
super({
|
72
|
+
:background => ['#101010', '#999977'],
|
73
|
+
:marker => :white,
|
74
|
+
:colors => %w(#DD3300 #66AABB #225533 #992200)
|
75
|
+
})
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Based on the color scheme used by almost every Ruby blogger.
|
81
|
+
class RubyBlog < Base
|
82
|
+
def initialize
|
83
|
+
super({
|
84
|
+
:background => ['#670A0A', '#831515'],
|
85
|
+
:marker => '#DBD1C1',
|
86
|
+
:colors => %w(#007777 #444477 #994444 #77FFBB #D75A20)
|
87
|
+
})
|
88
|
+
end
|
89
|
+
end
|
70
90
|
end
|