frank 0.3.2 → 0.4.0

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/frank.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{frank}
8
- s.version = "0.3.2"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["blahed", "nwah"]
12
- s.date = %q{2010-07-06}
12
+ s.date = %q{2010-09-02}
13
13
  s.description = %q{Rapidly develop static sites using any supported templating language}
14
14
  s.email = %q{travis.dunn@thisismedium.com}
15
15
  s.executables = ["frank", "frankout", "frankup"]
@@ -20,6 +20,8 @@ Gem::Specification.new do |s|
20
20
  s.files = [
21
21
  ".gitignore",
22
22
  "Featurelist",
23
+ "Gemfile",
24
+ "Gemfile.lock",
23
25
  "LICENSE",
24
26
  "README.md",
25
27
  "Rakefile",
@@ -35,6 +37,7 @@ Gem::Specification.new do |s|
35
37
  "lib/frank/middleware/statik.rb",
36
38
  "lib/frank/output.rb",
37
39
  "lib/frank/rescue.rb",
40
+ "lib/frank/settings.rb",
38
41
  "lib/frank/template_helpers.rb",
39
42
  "lib/frank/templates/404.haml",
40
43
  "lib/frank/templates/500.haml",
@@ -50,12 +53,14 @@ Gem::Specification.new do |s|
50
53
  "lib/frank/templates/imager/frank7.jpg",
51
54
  "lib/frank/templates/imager/frank8.jpg",
52
55
  "lib/frank/templates/imager/frank9.jpg",
53
- "lib/frank/tilt.rb",
56
+ "lib/frank/tilt_setup.rb",
57
+ "lib/frank/upgrades.rb",
54
58
  "lib/template/dynamic/css/frank.sass",
55
59
  "lib/template/dynamic/index.haml",
56
60
  "lib/template/helpers.rb",
57
61
  "lib/template/layouts/default.haml",
58
- "lib/template/settings.yml",
62
+ "lib/template/setup.rb",
63
+ "lib/template/static/favicon.ico",
59
64
  "lib/template/static/images/frank-med.png",
60
65
  "lib/template/static/js/frank.js",
61
66
  "spec/base_spec.rb",
@@ -82,19 +87,22 @@ Gem::Specification.new do |s|
82
87
  "spec/template/dynamic/partial_test.haml",
83
88
  "spec/template/dynamic/redcloth.textile",
84
89
  "spec/template/dynamic/refresh.haml",
85
- "spec/template/dynamic/sass.sass",
90
+ "spec/template/dynamic/setting_in_layout.haml",
91
+ "spec/template/dynamic/stylesheets/sass.sass",
92
+ "spec/template/dynamic/stylesheets/sass_with_compass.sass",
93
+ "spec/template/dynamic/stylesheets/scss_with_compass.scss",
86
94
  "spec/template/helpers.rb",
87
95
  "spec/template/layouts/default.haml",
88
96
  "spec/template/layouts/explicit/layout2.haml",
89
97
  "spec/template/layouts/nested/default.haml",
90
- "spec/template/settings.yml",
98
+ "spec/template/setup.rb",
91
99
  "spec/template/static/files/static.html",
92
100
  "spec/template_helpers_spec.rb"
93
101
  ]
94
102
  s.homepage = %q{http://github.com/blahed/frank}
95
103
  s.rdoc_options = ["--charset=UTF-8"]
96
104
  s.require_paths = ["lib"]
97
- s.rubygems_version = %q{1.3.6}
105
+ s.rubygems_version = %q{1.3.7}
98
106
  s.summary = %q{Static Site Non-Framework}
99
107
  s.test_files = [
100
108
  "spec/base_spec.rb",
@@ -102,6 +110,7 @@ Gem::Specification.new do |s|
102
110
  "spec/output_spec.rb",
103
111
  "spec/render_spec.rb",
104
112
  "spec/template/helpers.rb",
113
+ "spec/template/setup.rb",
105
114
  "spec/template_helpers_spec.rb"
106
115
  ]
107
116
 
@@ -109,24 +118,24 @@ Gem::Specification.new do |s|
109
118
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
110
119
  s.specification_version = 3
111
120
 
112
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
121
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
113
122
  s.add_runtime_dependency(%q<rack>, [">= 1.0"])
114
- s.add_runtime_dependency(%q<mongrel>, [">= 1.0"])
115
- s.add_runtime_dependency(%q<haml>, [">= 2.0"])
116
- s.add_development_dependency(%q<rspec>, [">= 0"])
123
+ s.add_runtime_dependency(%q<haml>, [">= 3.0"])
124
+ s.add_runtime_dependency(%q<tilt>, ["= 0.9"])
125
+ s.add_development_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
117
126
  s.add_development_dependency(%q<rack-test>, [">= 0.5"])
118
127
  else
119
128
  s.add_dependency(%q<rack>, [">= 1.0"])
120
- s.add_dependency(%q<mongrel>, [">= 1.0"])
121
- s.add_dependency(%q<haml>, [">= 2.0"])
122
- s.add_dependency(%q<rspec>, [">= 0"])
129
+ s.add_dependency(%q<haml>, [">= 3.0"])
130
+ s.add_dependency(%q<tilt>, ["= 0.9"])
131
+ s.add_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
123
132
  s.add_dependency(%q<rack-test>, [">= 0.5"])
124
133
  end
125
134
  else
126
135
  s.add_dependency(%q<rack>, [">= 1.0"])
127
- s.add_dependency(%q<mongrel>, [">= 1.0"])
128
- s.add_dependency(%q<haml>, [">= 2.0"])
129
- s.add_dependency(%q<rspec>, [">= 0"])
136
+ s.add_dependency(%q<haml>, [">= 3.0"])
137
+ s.add_dependency(%q<tilt>, ["= 0.9"])
138
+ s.add_dependency(%q<rspec>, [">= 2.0.0.beta.19"])
130
139
  s.add_dependency(%q<rack-test>, [">= 0.5"])
131
140
  end
132
141
  end
data/lib/frank/base.rb CHANGED
@@ -1,37 +1,30 @@
1
- require 'frank/tilt'
1
+ require 'frank/tilt_setup'
2
2
  require 'frank/template_helpers'
3
3
  require 'frank/rescue'
4
+ require 'frank/upgrades'
4
5
  require 'frank/middleware/statik'
5
- require 'frank/middleware/imager'
6
6
  require 'frank/middleware/refresh'
7
7
 
8
8
  module Frank
9
- VERSION = '0.3.2'
10
-
9
+ VERSION = '0.4.0'
10
+ extend Frank::Upgrades
11
+
11
12
  module Render; end
12
-
13
+
13
14
  class Base
14
15
  include Rack::Utils
15
16
  include Frank::Rescue
16
17
  include Frank::TemplateHelpers
17
18
  include Frank::Render
18
-
19
- attr_accessor :environment
20
- attr_accessor :proj_dir
21
- attr_accessor :server
22
- attr_accessor :static_folder
23
- attr_accessor :dynamic_folder
24
- attr_accessor :layouts_folder
25
- attr_accessor :templates
26
-
19
+
27
20
  def initialize(&block)
28
- instance_eval &block
21
+ instance_eval(&block) if block_given?
29
22
  end
30
23
 
31
24
  def call(env)
32
25
  dup.call!(env)
33
26
  end
34
-
27
+
35
28
  def call!(env)
36
29
  @env = env
37
30
  @request = Rack::Request.new(env)
@@ -40,20 +33,20 @@ module Frank
40
33
  @response.close
41
34
  @response.finish
42
35
  end
43
-
36
+
44
37
  private
45
-
38
+
46
39
  # setter for options
47
- def set(option, value)
40
+ def set(option, value)
48
41
  if respond_to?("#{option}=")
49
42
  send "#{option}=", value
50
43
  end
51
44
  end
52
-
45
+
53
46
  # attempt to render with the request path,
54
47
  # if it cannot be found, render error page
55
48
  def process
56
- load_helpers
49
+ load_helpers
57
50
  @response['Content-Type'] = Rack::Mime.mime_type(File.extname(@request.path), 'text/html')
58
51
  @response.write render(@request.path)
59
52
  rescue Frank::TemplateError
@@ -61,53 +54,52 @@ module Frank
61
54
  rescue Exception => e
62
55
  render_500 e
63
56
  end
64
-
57
+
65
58
  # prints requests and errors to STDOUT
66
59
  def log_request(status, excp = nil)
67
60
  out = "\033[1m[#{Time.now.strftime('%Y-%m-%d %H:%M')}]\033[22m (#{@request.request_method}) http://#{@request.host}:#{@request.port}#{@request.fullpath} - #{status}"
68
61
  out << "\n\n#{excp.message}\n\n#{excp.backtrace.join("\n")} " if excp
69
62
  puts out
70
63
  end
71
-
64
+
72
65
  def load_helpers
73
- helpers = File.join(@proj_dir, 'helpers.rb')
66
+ helpers = File.join(Frank.root, 'helpers.rb')
74
67
  if File.exist? helpers
75
- load helpers
68
+ load helpers
76
69
  Frank::TemplateHelpers.class_eval("include FrankHelpers")
77
70
  end
78
71
  end
79
-
80
72
  end
81
-
73
+
82
74
  module Render
83
-
84
- TMPL_EXTS = {
75
+
76
+ TMPL_EXTS = {
85
77
  :html => %w[haml erb rhtml builder liquid mustache textile md mkd markdown],
86
78
  :css => %w[sass less scss]
87
79
  }
88
-
80
+
89
81
  LAYOUT_EXTS = %w[.haml .erb .rhtml .liquid .mustache]
90
-
82
+
91
83
  # render request path or template path
92
84
  def render(path, partial = false, local_vars = nil)
93
85
  @current_path = path unless partial
94
-
86
+
95
87
  # normalize the path
96
88
  path.sub!(/^\/?(.*)$/, '/\1')
97
89
  path.sub!(/\/$/, '/index.html')
98
90
  path.sub!(/(\/[\w-]+)$/, '\1.html')
99
91
  path = to_file_path(path) if defined? @request or path.match(/\/_[^\/]+$/)
100
-
92
+
101
93
  # regex for kinds that don't support meta
102
94
  # and define the meta delimiter
103
- nometa, delimiter = /\/_|\.(sass|less)$/, /^META-{3,}\s*$|^-{3,}META\s*$/
104
-
95
+ nometa, delimiter = /\/_|\.(scss|sass|less)$/, /^META-{3,}\s*$|^-{3,}META\s*$/
96
+
105
97
  # set the layout
106
98
  layout = path.match(nometa) ? nil : layout_for(path)
107
-
108
- template_path = File.join(@proj_dir, @dynamic_folder, path)
99
+
100
+ template_path = File.join(Frank.root, Frank.dynamic_folder, path)
109
101
  raise Frank::TemplateError, "Template not found #{template_path}" unless File.exist? template_path
110
-
102
+
111
103
  # read in the template
112
104
  # check for meta and parse it if it exists
113
105
  template = File.read(template_path) << "\n"
@@ -117,42 +109,50 @@ module Frank
117
109
 
118
110
  # use given layout if defined as a meta field
119
111
  layout = locals[:layout] == 'nil' ? nil : locals[:layout] if locals.has_key?(:layout)
120
-
112
+
113
+ page = setup_page
114
+
121
115
  # let tilt determine the template handler
122
116
  # and return some template markup
123
117
  if layout.nil?
124
- tilt(ext, template, locals)
118
+ tilt(page, ext, template, locals)
125
119
  else
126
- layout_path = File.join(@proj_dir, @layouts_folder, layout)
120
+ layout_path = File.join(Frank.root, Frank.layouts_folder, layout)
127
121
  # add layout_path to locals
128
122
  raise Frank::TemplateError, "Layout not found #{layout_path}" unless File.exist? layout_path
129
-
130
- tilt(File.extname(layout), layout_path, locals) do
131
- tilt(ext, template, locals)
132
- end
123
+
124
+ # original
125
+ # tilt(File.extname(layout), layout_path, locals) do
126
+ # tilt(ext, template, locals)
127
+ # end
128
+
129
+ page_content = tilt(page, ext, template, locals)
130
+ tilt(page, File.extname(layout), layout_path, locals) do
131
+ page_content
132
+ end
133
133
  end
134
134
  end
135
-
135
+
136
136
  # converts a request path to a template path
137
137
  def to_file_path(path)
138
138
  file_name = File.basename(path, File.extname(path))
139
139
  file_ext = File.extname(path).sub(/^\./, '')
140
- folder = File.join(@proj_dir, @dynamic_folder)
140
+ folder = File.join(Frank.root, Frank.dynamic_folder)
141
141
  engine = nil
142
-
142
+
143
143
  TMPL_EXTS.each do |ext, engines|
144
144
  if ext.to_s == file_ext
145
145
  engine = engines.reject do |eng|
146
146
  !File.exist? File.join(folder, path.sub(/\.[\w-]+$/, ".#{eng}"))
147
- end.first
147
+ end.first
148
148
  end
149
149
  end
150
-
150
+
151
151
  raise Frank::TemplateError, "Template not found #{path}" if engine.nil?
152
-
152
+
153
153
  path.sub(/\.[\w-]+$/, ".#{engine}")
154
154
  end
155
-
155
+
156
156
  # lookup the original ext for given template path
157
157
  # TODO: make non-ugly
158
158
  def ext_from_handler(extension)
@@ -162,8 +162,8 @@ module Frank
162
162
  end
163
163
  orig_ext
164
164
  end
165
-
166
-
165
+
166
+
167
167
  # reverse walks the layouts folder until we find a layout
168
168
  # returns nil if layout is not found
169
169
  def layout_for(path)
@@ -172,10 +172,10 @@ module Frank
172
172
  default = 'default' << layout_ext_or_first(layout_exts, ext)
173
173
  file_path = path.sub(/\/[\w-]+\.[\w-]+$/, '')
174
174
  folders = file_path.split('/')
175
-
176
- until File.exist? File.join(@proj_dir, @layouts_folder, folders, default)
175
+
176
+ until File.exist? File.join(Frank.root, Frank.layouts_folder, folders, default)
177
177
  break if layout_exts.empty? && folders.empty?
178
-
178
+
179
179
  if layout_exts.empty?
180
180
  layout_exts = LAYOUT_EXTS.dup
181
181
  default = 'default' << layout_ext_or_first(layout_exts, ext)
@@ -184,37 +184,48 @@ module Frank
184
184
  default = 'default' << layout_exts.shift
185
185
  end
186
186
  end
187
-
188
- if File.exists? File.join(@proj_dir, @layouts_folder, folders, default)
187
+
188
+ if File.exists? File.join(Frank.root, Frank.layouts_folder, folders, default)
189
189
  File.join(folders, default)
190
190
  else
191
191
  nil
192
192
  end
193
193
  end
194
-
194
+
195
195
  # if the given ext is a layout ext, pop it off and return it
196
196
  # otherwise return the first layout ext
197
197
  def layout_ext_or_first(layout_exts, ext)
198
198
  layout_exts.include?(ext) ? layout_exts.delete(ext) : layout_exts.first
199
199
  end
200
-
201
- # setup an object and extend it with TemplateHelpers and Render
202
- # then send everything to tilt and get some template markup back
203
- def tilt(ext, source, locals={}, &block)
204
- obj = Object.new.extend(TemplateHelpers).extend(Render)
200
+
201
+ # render a page using tilt and get the result template markup back
202
+ def tilt(page, ext, source, locals={}, &block)
203
+ Tilt[ext].new do
204
+ source = source.to_str if source.respond_to?(:to_str)
205
+ if source.match(/^[^\n]+$/) && File.exist?(source)
206
+ File.read(source)
207
+ else
208
+ source
209
+ end
210
+ end.render(page, locals=locals, &block)
211
+ end
212
+
213
+ # setup a new page object to be rendered
214
+ def setup_page
215
+ page = Object.new.extend(TemplateHelpers).extend(Render)
205
216
  instance_variables.each do |var|
206
217
  unless ['@response', '@env'].include? var
207
- obj.instance_variable_set(var.intern, instance_variable_get(var))
218
+ page.instance_variable_set(var.intern, instance_variable_get(var))
208
219
  end
209
220
  end
210
- Tilt[ext].new(source).render(obj, locals=locals, &block)
221
+ page
211
222
  end
212
-
223
+
213
224
  private
214
-
225
+
215
226
  # parse the given meta string with yaml
216
227
  # set the current_path local
217
- def parse_meta_and_set_locals(meta, locals = nil)
228
+ def parse_meta_and_set_locals(meta, locals = nil)
218
229
  # parse yaml and symbolize keys
219
230
  if meta.nil?
220
231
  meta = {}
@@ -223,57 +234,94 @@ module Frank
223
234
  options[(key.to_sym rescue key) || key] = value
224
235
  options
225
236
  end
226
- end
237
+ end
227
238
  meta.merge!(locals) unless locals.nil?
228
239
  meta[:current_path] = @current_path.sub(/\.[\w-]+$/, '').sub(/\/index/, '/')
229
-
240
+
230
241
  meta
231
242
  end
232
-
233
243
  end
234
-
244
+
245
+ # Bootstrap will set up Frank up at a root path, and read in the setup.rb
246
+ def self.bootstrap(new_root = nil)
247
+ Frank.reset
248
+ Frank.root = new_root if new_root
249
+
250
+ # setup compass
251
+ begin
252
+ require 'compass'
253
+
254
+ Compass.configuration do |config|
255
+ # project_path should be the directory to which the sass directory is relative.
256
+ # I think maybe this should be one more directory up from the configuration file.
257
+ # Please update this if it is or remove this message if it can stay the way it is.
258
+ config.project_path = Frank.root
259
+ config.sass_dir = File.join('dynamic', 'stylesheets')
260
+ end
261
+
262
+ # sass_engine_options returns a hash, you can merge it with other options.
263
+ Frank.sass_options = Compass.sass_engine_options
264
+ rescue LoadError
265
+ # ignore if compass is not there
266
+ end
267
+
268
+ # try to pull in setup
269
+ setup = File.join(Frank.root, 'setup.rb')
270
+ if File.exists?(setup)
271
+ load setup
272
+ end
273
+
274
+ end
275
+
235
276
  # starts the server
236
277
  def self.new(&block)
237
- base = Base.new(&block) if block_given?
238
-
278
+ base = Base.new(&block)
279
+
239
280
  builder = Rack::Builder.new do
240
- use Frank::Middleware::Statik, :root => base.static_folder
241
- use Frank::Middleware::Imager
242
- use Frank::Middleware::Refresh, :watch => [ base.dynamic_folder, base.static_folder, base.layouts_folder ]
281
+ use Frank::Middleware::Statik, :root => Frank.static_folder
282
+ use Frank::Middleware::Refresh, :watch => [ Frank.dynamic_folder, Frank.static_folder, Frank.layouts_folder ]
243
283
  run base
244
284
  end
245
285
 
246
- unless base.environment == :test
286
+ unless Frank.environment == :test
247
287
  m = "got it under control \n got your back \n holdin' it down
248
288
  takin' care of business \n workin' some magic".split("\n").sort_by{rand}.first.strip
249
289
  puts "\n-----------------------\n" +
250
290
  " Frank's #{ m }...\n" +
251
- " #{base.server['hostname']}:#{base.server['port']} \n\n"
252
- server = Rack::Handler.get(base.server['handler'])
253
-
254
- server.run(builder, :Port => base.server['port'], :Host => base.server['hostname']) do
291
+ " #{Frank.server.hostname}:#{Frank.server.port} \n\n"
292
+
293
+ begin
294
+ server = Rack::Handler.get(Frank.server.handler)
295
+ rescue LoadError
296
+ puts "\n\nUnable to find handler for: #{Frank.server.handler}"
297
+ puts "\nUse `gem install \"#{Frank.server.handler}\"` to install it"
298
+ puts "\nDefaulting to using webrick"
299
+ server = Rack::Handler.get("webrick")
300
+ end
301
+
302
+ server.run(builder, :Port => Frank.server.port, :Host => Frank.server.hostname) do
255
303
  trap(:INT) { puts "\n\n-----------------------\n Show's over, fellas.\n\n"; exit }
256
304
  end
257
305
  end
258
-
306
+
259
307
  base
260
-
308
+
261
309
  rescue Errno::EADDRINUSE
262
- puts " Hold on a second... Frank works alone.\n \033[31mSomething's already using port #{base.server['port']}\033[0m\n\n"
310
+ puts " Hold on a second... Frank works alone.\n \033[31mSomething's already using port #{Frank.server.port}\033[0m\n\n"
263
311
  end
264
-
312
+
265
313
  # copies over the generic project template
266
314
  def self.stub(project)
267
315
  puts "\nFrank is...\n - \033[32mCreating\033[0m your project '#{project}'"
268
316
  Dir.mkdir project
269
-
317
+
270
318
  puts " - \033[32mCopying\033[0m Frank template"
271
319
  FileUtils.cp_r( Dir.glob(File.join(LIBDIR, 'template/*')), project )
272
-
320
+
273
321
  puts "\n \033[32mCongratulations, '#{project}' is ready to go!\033[0m"
274
322
  rescue Errno::EEXIST
275
323
  puts "\n \033[31muh oh, directory '#{project}' already exists...\033[0m"
276
324
  exit
277
325
  end
278
-
326
+
279
327
  end
data/lib/frank/lorem.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  module Frank
2
2
  class Lorem
3
3
  WORDS = %w(alias consequatur aut perferendis sit voluptatem accusantium doloremque aperiam eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo aspernatur aut odit aut fugit sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt neque dolorem ipsum quia dolor sit amet consectetur adipisci velit sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem ut enim ad minima veniam quis nostrum exercitationem ullam corporis nemo enim ipsam voluptatem quia voluptas sit suscipit laboriosam nisi ut aliquid ex ea commodi consequatur quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae et iusto odio dignissimos ducimus qui blanditiis praesentium laudantium totam rem voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident sed ut perspiciatis unde omnis iste natus error similique sunt in culpa qui officia deserunt mollitia animi id est laborum et dolorum fuga et harum quidem rerum facilis est et expedita distinctio nam libero tempore cum soluta nobis est eligendi optio cumque nihil impedit quo porro quisquam est qui minus id quod maxime placeat facere possimus omnis voluptas assumenda est omnis dolor repellendus temporibus autem quibusdam et aut consequatur vel illum qui dolorem eum fugiat quo voluptas nulla pariatur at vero eos et accusamus officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae itaque earum rerum hic tenetur a sapiente delectus ut aut reiciendis voluptatibus maiores doloribus asperiores repellat)
4
-
4
+
5
5
  def initialize(environment)
6
6
  @environment = environment
7
-
7
+
8
8
  end
9
-
9
+
10
10
  def word(replacement = nil)
11
11
  words 1, replacement
12
12
  end
13
-
13
+
14
14
  def words(total, replacement = nil)
15
15
  if @environment == :output && replacement
16
16
  replacement
@@ -35,7 +35,7 @@ module Frank
35
35
  end.join('. ')
36
36
  end
37
37
  end
38
-
38
+
39
39
  def paragraph(replacement = nil)
40
40
  paragraphs 1, replacement
41
41
  end
@@ -49,7 +49,7 @@ module Frank
49
49
  end.join("\n\n")
50
50
  end
51
51
  end
52
-
52
+
53
53
  def date(fmt = '%a %b %d, %Y', replacement = nil)
54
54
  if @environment == :output && replacement
55
55
  replacement
@@ -60,7 +60,7 @@ module Frank
60
60
  Time.local(y,m,d).strftime(fmt)
61
61
  end
62
62
  end
63
-
63
+
64
64
  def name(replacement = nil)
65
65
  if @environment == :output && replacement
66
66
  replacement
@@ -68,7 +68,7 @@ module Frank
68
68
  "#{first_name} #{last_name}"
69
69
  end
70
70
  end
71
-
71
+
72
72
  def first_name(replacement = nil)
73
73
  if @environment == :output && replacement
74
74
  replacement
@@ -77,7 +77,7 @@ module Frank
77
77
  names[rand(names.size)]
78
78
  end
79
79
  end
80
-
80
+
81
81
  def last_name(replacement = nil)
82
82
  if @environment == :output && replacement
83
83
  replacement
@@ -91,31 +91,42 @@ module Frank
91
91
  if @environment == :output && replacement
92
92
  replacement
93
93
  else
94
- delimiters = ['_','-','']
95
- domains = %w(gmail.com yahoo.com hotmail.com email.com live.com me.com mac.com aol.com fastmail.com mail.com)
94
+ delimiters = [ '_', '-', '' ]
95
+ domains = %w(gmail.com yahoo.com hotmail.com email.com live.com me.com mac.com aol.com fastmail.com mail.com)
96
96
  username = name.gsub(/[^\w]/, delimiters[rand(delimiters.size)])
97
97
  "#{username}@#{domains[rand(domains.size)]}".downcase
98
98
  end
99
99
  end
100
-
101
- def image(width, height, random=false, replacement=nil)
102
- if @environment == :output && replacement
103
- replacement
100
+
101
+ def image(size, options)
102
+ if @environment == :output && options[:replacement]
103
+ options[:replacement]
104
104
  else
105
- if defined? MiniMagick
106
- "/_img/#{width.to_s}x#{height.to_s}.jpg#{'?random' + (10000 + rand(10000)).to_s if random}"
107
- else
108
- raise Frank::ConfigError, 'mini_magick is required for lorem.image, please install it with `gem install mini_magick`'
105
+ src = "http://placehold.it/#{size}"
106
+ hex = %w[a b c d e f 0 1 2 3 4 5 6 7 8 9]
107
+ background_color = options[:background_color]
108
+ color = options[:color]
109
+
110
+ if options[:random_color]
111
+ background_color = hex.shuffle[0...6].join
112
+ color = hex.shuffle[0...6].join
109
113
  end
114
+
115
+ src << "/#{background_color.sub(/^#/, '')}" if background_color
116
+ src << "/ccc" if background_color.nil? && color
117
+ src << "/#{color.sub(/^#/, '')}" if color
118
+ src << "&text=#{Rack::Utils::escape(options[:text])}" if options[:text]
119
+
120
+ src
110
121
  end
111
122
  end
112
-
123
+
113
124
  private
114
-
125
+
115
126
  def randm(range)
116
127
  a = range.to_a
117
128
  a[rand(a.length)]
118
129
  end
119
-
130
+
120
131
  end
121
- end
132
+ end