ec2onrails 0.9.3
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/COPYING.txt +339 -0
- data/History.txt +3 -0
- data/Manifest.txt +26 -0
- data/README.txt +1 -0
- data/Rakefile +4 -0
- data/config/hoe.rb +70 -0
- data/config/requirements.rb +17 -0
- data/lib/ec2onrails/capistrano_utils.rb +18 -0
- data/lib/ec2onrails/recipes.rb +329 -0
- data/lib/ec2onrails/version.rb +28 -0
- data/lib/ec2onrails.rb +20 -0
- data/log/debug.log +0 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +27 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/test_ec2onrails.rb +11 -0
- data/test/test_helper.rb +2 -0
- data/website/index.html +93 -0
- data/website/index.txt +40 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- metadata +85 -0
@@ -0,0 +1,329 @@
|
|
1
|
+
# This file is part of EC2 on Rails.
|
2
|
+
# http://rubyforge.org/projects/ec2onrails/
|
3
|
+
#
|
4
|
+
# Copyright 2007 Paul Dowman, http://pauldowman.com/
|
5
|
+
#
|
6
|
+
# EC2 on Rails is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# EC2 on Rails is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
require 'fileutils'
|
20
|
+
include FileUtils
|
21
|
+
|
22
|
+
require 'ec2onrails/version'
|
23
|
+
require 'ec2onrails/capistrano_utils'
|
24
|
+
include Ec2onrails::CapistranoUtils
|
25
|
+
|
26
|
+
Capistrano::Configuration.instance.load do
|
27
|
+
|
28
|
+
unless ec2onrails_config
|
29
|
+
raise "ec2onrails_config variable not set. (It should be a hash.)"
|
30
|
+
end
|
31
|
+
|
32
|
+
cfg = ec2onrails_config
|
33
|
+
|
34
|
+
set :image_id, Ec2onrails::VERSION::AMI_ID
|
35
|
+
set :deploy_to, "/mnt/app"
|
36
|
+
set :use_sudo, false
|
37
|
+
set :user, "app"
|
38
|
+
|
39
|
+
make_admin_role_for(:web, :web_admin)
|
40
|
+
make_admin_role_for(:app, :app_admin)
|
41
|
+
make_admin_role_for(:db, :db_admin)
|
42
|
+
|
43
|
+
roles[:web_admin].to_s
|
44
|
+
roles[:app_admin].to_s
|
45
|
+
roles[:db_admin].to_s
|
46
|
+
|
47
|
+
# override default start/stop/restart tasks
|
48
|
+
namespace :deploy do
|
49
|
+
desc <<-DESC
|
50
|
+
Overrides the default Capistrano deploy:start, directly calls \
|
51
|
+
/usr/local/ec2onrails/bin/mongrel_cluster_ctl_wrapper
|
52
|
+
DESC
|
53
|
+
task :start, :except => { :no_release => true } do
|
54
|
+
run "/usr/local/ec2onrails/bin/mongrel_cluster_ctl_wrapper start"
|
55
|
+
end
|
56
|
+
|
57
|
+
desc <<-DESC
|
58
|
+
Overrides the default Capistrano deploy:stop, directly calls \
|
59
|
+
/usr/local/ec2onrails/bin/mongrel_cluster_ctl_wrapper
|
60
|
+
DESC
|
61
|
+
task :stop, :except => { :no_release => true } do
|
62
|
+
run "/usr/local/ec2onrails/bin/mongrel_cluster_ctl_wrapper stop"
|
63
|
+
end
|
64
|
+
|
65
|
+
desc <<-DESC
|
66
|
+
Overrides the default Capistrano deploy:restart, directly calls \
|
67
|
+
/usr/local/ec2onrails/bin/mongrel_cluster_ctl_wrapper
|
68
|
+
DESC
|
69
|
+
task :restart, :except => { :no_release => true } do
|
70
|
+
run "/usr/local/ec2onrails/bin/mongrel_cluster_ctl_wrapper restart"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
namespace :ec2onrails do
|
75
|
+
|
76
|
+
desc <<-DESC
|
77
|
+
Start a new server instance and prepare it for a cold deploy.
|
78
|
+
DESC
|
79
|
+
task :setup, :roles => [:web, :db, :app] do
|
80
|
+
ec2.start_instance
|
81
|
+
server.set_timezone
|
82
|
+
server.upgrade_and_install_all
|
83
|
+
server.deploy_files
|
84
|
+
server.restart_services
|
85
|
+
deploy.setup
|
86
|
+
db.create
|
87
|
+
end
|
88
|
+
|
89
|
+
desc <<-DESC
|
90
|
+
Deploy and restore database from S3
|
91
|
+
DESC
|
92
|
+
task :restore_db_and_deploy, :roles => [:web, :db, :app] do
|
93
|
+
db.recreate
|
94
|
+
deploy.update_code
|
95
|
+
deploy.symlink
|
96
|
+
# don't need to migrate because we're restoring the db
|
97
|
+
db.restore
|
98
|
+
deploy.restart
|
99
|
+
end
|
100
|
+
|
101
|
+
namespace :ec2 do
|
102
|
+
desc <<-DESC
|
103
|
+
Start an instance, using the AMI of the correct version to match this gem.
|
104
|
+
DESC
|
105
|
+
task :start_instance, :roles => [:web, :db, :app] do
|
106
|
+
# TODO
|
107
|
+
# ec2 = EC2::Base.new(:access_key_id => access_key_id, :secret_access_key => secret_access_key)
|
108
|
+
# ec2.run_instances(:image_id => image_id, :key_name => key_name, :group_id => group_id)
|
109
|
+
# wait until image is booted
|
110
|
+
end
|
111
|
+
|
112
|
+
desc <<-DESC
|
113
|
+
Set default firewall rules.
|
114
|
+
DESC
|
115
|
+
task :configure_firewall do
|
116
|
+
# TODO
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
namespace :db do
|
121
|
+
desc <<-DESC
|
122
|
+
Load configuration info for the production database from \
|
123
|
+
config/database.yml.
|
124
|
+
DESC
|
125
|
+
task :load_config, :roles => :db do
|
126
|
+
db_config = YAML::load(ERB.new(File.read("config/database.yml")).result)['production']
|
127
|
+
cfg[:production_db_name] = db_config['database']
|
128
|
+
cfg[:production_db_user] = db_config['username']
|
129
|
+
cfg[:production_db_password] = db_config['password']
|
130
|
+
|
131
|
+
[cfg[:production_db_name], cfg[:production_db_user], cfg[:production_db_password]].each do |s|
|
132
|
+
if s.match(/['"]/)
|
133
|
+
raise "ERROR: database config string '#{s}' contains quotes."
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
desc <<-DESC
|
139
|
+
Create the MySQL production database. Assumes there is no MySQL root \
|
140
|
+
password. To create a MySQL root password create a task that's run \
|
141
|
+
after this task using an after hook.
|
142
|
+
DESC
|
143
|
+
task :create, :roles => :db do
|
144
|
+
on_rollback { drop }
|
145
|
+
load_config
|
146
|
+
run "echo 'create database #{cfg[:production_db_name]};' | mysql -u root"
|
147
|
+
run "echo \"grant all on #{cfg[:production_db_name]}.* to '#{cfg[:production_db_user]}'@'localhost' identified by '#{cfg[:production_db_password]}';\" | mysql -u root"
|
148
|
+
end
|
149
|
+
|
150
|
+
desc <<-DESC
|
151
|
+
Drop the MySQL production database. Assumes there is no MySQL root \
|
152
|
+
password. If there is a MySQL root password, create a task that removes \
|
153
|
+
it and run that task before this one using a before hook.
|
154
|
+
DESC
|
155
|
+
task :drop, :roles => :db do
|
156
|
+
load_config
|
157
|
+
run "echo 'drop database if exists #{cfg[:production_db_name]};' | mysql -u root"
|
158
|
+
end
|
159
|
+
|
160
|
+
desc <<-DESC
|
161
|
+
db:drop and db:create.
|
162
|
+
DESC
|
163
|
+
task :recreate, :roles => :db do
|
164
|
+
drop
|
165
|
+
create
|
166
|
+
end
|
167
|
+
|
168
|
+
desc <<-DESC
|
169
|
+
Set a root password for MySQL, using the variable mysql_root_password \
|
170
|
+
if it is set. If this is done db:drop won't work.
|
171
|
+
DESC
|
172
|
+
task :set_root_password, :roles => :db do
|
173
|
+
if cfg[:mysql_root_password]
|
174
|
+
run "echo 'set password for root@localhost=password('#{cfg[:mysql_root_password]}');' | mysql -u root"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
desc <<-DESC
|
179
|
+
Dump the MySQL database to the S3 bucket specified by \
|
180
|
+
ec2onrails_config[:archive_to_bucket]. The filename will be \
|
181
|
+
"app-<timestamp>.sql.gz".
|
182
|
+
DESC
|
183
|
+
task :archive, :roles => [:db] do
|
184
|
+
run "/usr/local/ec2onrails/bin/backup_app_db.rb #{cfg[:archive_to_bucket]} app-#{Time.new.strftime('%y-%m-%d--%H-%M-%S')}.sql.gz"
|
185
|
+
end
|
186
|
+
|
187
|
+
desc <<-DESC
|
188
|
+
Restore the MySQL database from the S3 bucket specified by \
|
189
|
+
ec2onrails_config[:restore_from_bucket]. The archive filename is \
|
190
|
+
expected to be the default, "app.sql.gz".
|
191
|
+
DESC
|
192
|
+
task :restore, :roles => [:db] do
|
193
|
+
run "/usr/local/ec2onrails/bin/restore_app_db.rb #{cfg[:restore_from_bucket]}"
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
namespace :server do
|
198
|
+
desc <<-DESC
|
199
|
+
Upgrade to the newest versions of all Ubuntu packages.
|
200
|
+
DESC
|
201
|
+
task :upgrade_packages, :roles => [:web_admin, :db_admin, :app_admin] do
|
202
|
+
sudo "aptitude -q update"
|
203
|
+
run "export DEBIAN_FRONTEND=noninteractive; sudo aptitude -q -y dist-upgrade"
|
204
|
+
end
|
205
|
+
|
206
|
+
desc <<-DESC
|
207
|
+
Upgrade to the newest versions of all rubygems.
|
208
|
+
DESC
|
209
|
+
task :upgrade_gems, :roles => [:web_admin, :db_admin, :app_admin] do
|
210
|
+
sudo "gem update -y"
|
211
|
+
end
|
212
|
+
|
213
|
+
desc <<-DESC
|
214
|
+
Install extra Ubuntu packages. Set ec2onrails_config[:packages], it \
|
215
|
+
should be an array of strings.
|
216
|
+
NOTE: the package installation will be non-interactive, if the packages \
|
217
|
+
require configuration either log in as 'admin' and run \
|
218
|
+
'dpkg-reconfigure packagename' or replace the package's config files \
|
219
|
+
using the 'ec2onrails:deploy_config_files' task.
|
220
|
+
DESC
|
221
|
+
task :install_packages, :roles => [:web_admin, :db_admin, :app_admin] do
|
222
|
+
if cfg[:packages] && cfg[:packages].any?
|
223
|
+
run "export DEBIAN_FRONTEND=noninteractive; sudo aptitude -q -y install #{cfg[:packages].join(' ')}"
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
desc <<-DESC
|
228
|
+
Install extra rubygems. Set ec2onrails_config[:rubygems], it should \
|
229
|
+
be with an array of strings.
|
230
|
+
DESC
|
231
|
+
task :install_gems, :roles => [:web_admin, :db_admin, :app_admin] do
|
232
|
+
if cfg[:rubygems] && cfg[:rubygems].any?
|
233
|
+
sudo "gem install #{cfg[:rubygems].join(' ')} -y" do |ch, str, data|
|
234
|
+
ch[:data] ||= ""
|
235
|
+
ch[:data] << data
|
236
|
+
if data =~ />\s*$/
|
237
|
+
puts "The gem command is asking for a number:"
|
238
|
+
choice = STDIN.gets
|
239
|
+
ch.send_data(choice)
|
240
|
+
else
|
241
|
+
puts data
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
desc <<-DESC
|
248
|
+
A convenience task to upgrade existing packages and gems and install \
|
249
|
+
specified new ones.
|
250
|
+
DESC
|
251
|
+
task :upgrade_and_install_all, :roles => [:web_admin, :db_admin, :app_admin] do
|
252
|
+
upgrade_packages
|
253
|
+
upgrade_gems
|
254
|
+
install_packages
|
255
|
+
install_gems
|
256
|
+
end
|
257
|
+
|
258
|
+
desc <<-DESC
|
259
|
+
Set the timezone using the value of the variable named timezone. \
|
260
|
+
Valid options for timezone can be determined by the contents of \
|
261
|
+
/usr/share/zoneinfo, which can be seen here: \
|
262
|
+
http://packages.ubuntu.com/cgi-bin/search_contents.pl?searchmode=filelist&word=tzdata&version=feisty&arch=all&page=1&number=all \
|
263
|
+
Remove 'usr/share/zoneinfo/' from the filename, and use the last \
|
264
|
+
directory and file as the value. For example 'Africa/Abidjan' or \
|
265
|
+
'posix/GMT' or 'Canada/Eastern'.
|
266
|
+
DESC
|
267
|
+
task :set_timezone, :roles => [:web_admin, :db_admin, :app_admin] do
|
268
|
+
if cfg[:timezone]
|
269
|
+
sudo "bash -c 'echo #{cfg[:timezone]} > /etc/timezone'"
|
270
|
+
sudo "cp /usr/share/zoneinfo/#{cfg[:timezone]} /etc/localtime"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
desc <<-DESC
|
275
|
+
Deploy a set of config files to the server, the files will be owned by \
|
276
|
+
root. This doesn't delete any files from the server.
|
277
|
+
DESC
|
278
|
+
task :deploy_files, :roles => [:web_admin, :db_admin, :app_admin] do
|
279
|
+
if cfg[:server_config_files_root]
|
280
|
+
begin
|
281
|
+
# TODO use Zlib to support Windows
|
282
|
+
file = '/tmp/config_files.tgz'
|
283
|
+
run_local "tar zcf #{file} -C '#{cfg[:server_config_files_root]}' ."
|
284
|
+
put File.read(file), file
|
285
|
+
sudo "tar zxvf #{file} -o -C /"
|
286
|
+
ensure
|
287
|
+
rm_rf file
|
288
|
+
sudo "rm -f #{file}"
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
desc <<-DESC
|
294
|
+
DESC
|
295
|
+
task :restart_services, :roles => [:web_admin, :db_admin, :app_admin] do
|
296
|
+
if cfg[:services_to_restart] && cfg[:services_to_restart].any?
|
297
|
+
cfg[:services_to_restart].each do |service|
|
298
|
+
sudo "/etc/init.d/#{service} restart"
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
desc <<-DESC
|
304
|
+
DESC
|
305
|
+
task :enable_mail_server, :roles => [:web_admin, :db_admin, :app_admin] do
|
306
|
+
# TODO
|
307
|
+
end
|
308
|
+
|
309
|
+
desc <<-DESC
|
310
|
+
DESC
|
311
|
+
task :add_user, :roles => [:web_admin, :db_admin, :app_admin] do
|
312
|
+
# TODO
|
313
|
+
end
|
314
|
+
|
315
|
+
desc <<-DESC
|
316
|
+
DESC
|
317
|
+
task :run_script, :roles => [:web_admin, :db_admin, :app_admin] do
|
318
|
+
# TODO
|
319
|
+
end
|
320
|
+
|
321
|
+
desc <<-DESC
|
322
|
+
DESC
|
323
|
+
task :archive_logs, :roles => [:web_admin, :db_admin, :app_admin] do
|
324
|
+
# TODO
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
end
|
329
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# This file is part of EC2 on Rails.
|
2
|
+
# http://rubyforge.org/projects/ec2onrails/
|
3
|
+
#
|
4
|
+
# Copyright 2007 Paul Dowman, http://pauldowman.com/
|
5
|
+
#
|
6
|
+
# EC2 on Rails is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# EC2 on Rails is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
module Ec2onrails #:nodoc:
|
20
|
+
module VERSION #:nodoc:
|
21
|
+
MAJOR = 0
|
22
|
+
MINOR = 9
|
23
|
+
TINY = 3
|
24
|
+
STRING = [MAJOR, MINOR, TINY].join('.')
|
25
|
+
|
26
|
+
AMI_ID = 'ami-a3f91cca'
|
27
|
+
end
|
28
|
+
end
|
data/lib/ec2onrails.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# This file is part of EC2 on Rails.
|
2
|
+
# http://rubyforge.org/projects/ec2onrails/
|
3
|
+
#
|
4
|
+
# Copyright 2007 Paul Dowman, http://pauldowman.com/
|
5
|
+
#
|
6
|
+
# EC2 on Rails is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# EC2 on Rails is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
|
19
|
+
|
20
|
+
$:.unshift File.dirname(__FILE__)
|
data/log/debug.log
ADDED
File without changes
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.join(File.dirname(__FILE__), '..')
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.join(File.dirname(__FILE__), '..')
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/script/txt2html
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
begin
|
5
|
+
require 'newgem'
|
6
|
+
rescue LoadError
|
7
|
+
puts "\n\nGenerating the website requires the newgem RubyGem"
|
8
|
+
puts "Install: gem install newgem\n\n"
|
9
|
+
exit(1)
|
10
|
+
end
|
11
|
+
require 'redcloth'
|
12
|
+
require 'syntax/convertors/html'
|
13
|
+
require 'erb'
|
14
|
+
require File.dirname(__FILE__) + '/../lib/ec2onrails/version.rb'
|
15
|
+
|
16
|
+
version = Ec2onrails::VERSION::STRING
|
17
|
+
download = 'http://rubyforge.org/projects/ec2onrails'
|
18
|
+
|
19
|
+
class Fixnum
|
20
|
+
def ordinal
|
21
|
+
# teens
|
22
|
+
return 'th' if (10..19).include?(self % 100)
|
23
|
+
# others
|
24
|
+
case self % 10
|
25
|
+
when 1: return 'st'
|
26
|
+
when 2: return 'nd'
|
27
|
+
when 3: return 'rd'
|
28
|
+
else return 'th'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Time
|
34
|
+
def pretty
|
35
|
+
return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def convert_syntax(syntax, source)
|
40
|
+
return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
|
41
|
+
end
|
42
|
+
|
43
|
+
if ARGV.length >= 1
|
44
|
+
src, template = ARGV
|
45
|
+
template ||= File.join(File.dirname(__FILE__), '/../website/template.rhtml')
|
46
|
+
|
47
|
+
else
|
48
|
+
puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
|
49
|
+
exit!
|
50
|
+
end
|
51
|
+
|
52
|
+
template = ERB.new(File.open(template).read)
|
53
|
+
|
54
|
+
title = nil
|
55
|
+
body = nil
|
56
|
+
File.open(src) do |fsrc|
|
57
|
+
title_text = fsrc.readline
|
58
|
+
body_text = fsrc.read
|
59
|
+
syntax_items = []
|
60
|
+
body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
|
61
|
+
ident = syntax_items.length
|
62
|
+
element, syntax, source = $1, $2, $3
|
63
|
+
syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
|
64
|
+
"syntax-temp-#{ident}"
|
65
|
+
}
|
66
|
+
title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
|
67
|
+
body = RedCloth.new(body_text).to_html
|
68
|
+
body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
|
69
|
+
end
|
70
|
+
stat = File.stat(src)
|
71
|
+
created = stat.ctime
|
72
|
+
modified = stat.mtime
|
73
|
+
|
74
|
+
$stdout << template.result(binding)
|