staticmatic 0.1.1 → 0.2.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/bin/staticmatic +4 -10
- data/example/src/layouts/application.haml +3 -1
- data/example/src/pages/index.haml +2 -4
- data/example/src/stylesheets/application.sass +3 -1
- data/lib/staticmatic/base.rb +158 -0
- data/lib/staticmatic/helpers.rb +5 -6
- data/lib/staticmatic/server.rb +67 -0
- data/lib/staticmatic/templates/application.sass +3 -1
- data/lib/staticmatic.rb +3 -109
- data/test/base_test.rb +48 -0
- data/test/server_test.rb +9 -0
- metadata +8 -4
- data/test/staticmatic_test.rb +0 -27
data/bin/staticmatic
CHANGED
@@ -1,19 +1,13 @@
|
|
1
|
-
#!/usr/
|
1
|
+
#!/usr/bin/env ruby
|
2
2
|
require File.dirname(__FILE__) + '/../lib/staticmatic'
|
3
3
|
|
4
4
|
command = ARGV[0]
|
5
5
|
directory = ARGV[1]
|
6
6
|
|
7
7
|
if !command || !directory
|
8
|
-
puts 'Usage: staticmatic <build|setup> <directory>'
|
8
|
+
puts 'Usage: staticmatic <build|setup|preview> <directory>'
|
9
9
|
exit
|
10
10
|
end
|
11
11
|
|
12
|
-
staticmatic = StaticMatic.new(directory)
|
13
|
-
|
14
|
-
case command
|
15
|
-
when 'build'
|
16
|
-
staticmatic.build
|
17
|
-
when 'setup'
|
18
|
-
staticmatic.setup
|
19
|
-
end
|
12
|
+
staticmatic = StaticMatic::Base.new(directory)
|
13
|
+
staticmatic.run(command)
|
@@ -0,0 +1,158 @@
|
|
1
|
+
module StaticMatic
|
2
|
+
class Base
|
3
|
+
VERSION = '0.2.0'
|
4
|
+
|
5
|
+
# Directories generated for a new site setup
|
6
|
+
@@base_dirs = %w{
|
7
|
+
site/
|
8
|
+
site/stylesheets
|
9
|
+
site/images
|
10
|
+
site/javascripts
|
11
|
+
src/
|
12
|
+
src/pages/
|
13
|
+
src/layouts
|
14
|
+
src/stylesheets
|
15
|
+
}
|
16
|
+
|
17
|
+
# Templates for setup and their location
|
18
|
+
@@templates = {
|
19
|
+
'application.haml' => 'layouts',
|
20
|
+
'application.sass' => 'stylesheets',
|
21
|
+
'index.haml' => 'pages'
|
22
|
+
}
|
23
|
+
|
24
|
+
def initialize(base_dir)
|
25
|
+
@base_dir = base_dir
|
26
|
+
@src_dir = "#{@base_dir}/src"
|
27
|
+
@site_dir = "#{@base_dir}/site"
|
28
|
+
@templates_dir = File.dirname(__FILE__) + '/templates'
|
29
|
+
end
|
30
|
+
|
31
|
+
def run(command)
|
32
|
+
valid_commands = ['build', 'setup', 'preview']
|
33
|
+
|
34
|
+
if valid_commands.include?(command)
|
35
|
+
send(command)
|
36
|
+
else
|
37
|
+
puts "#{command} is not a valid StaticMatic command"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def build
|
42
|
+
build_css
|
43
|
+
build_html
|
44
|
+
end
|
45
|
+
|
46
|
+
def setup
|
47
|
+
if !File.exists?(@base_dir)
|
48
|
+
Dir.mkdir(@base_dir)
|
49
|
+
end
|
50
|
+
|
51
|
+
@@base_dirs.each do |directory|
|
52
|
+
directory = "#{@base_dir}/#{directory}"
|
53
|
+
if !File.exists?(directory)
|
54
|
+
Dir.mkdir(directory)
|
55
|
+
puts "created #{directory}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
@@templates.each do |template, destination|
|
60
|
+
copy_file("#{@templates_dir}/#{template}", "#{@src_dir}/#{destination}")
|
61
|
+
end
|
62
|
+
|
63
|
+
puts "Done"
|
64
|
+
end
|
65
|
+
|
66
|
+
def preview
|
67
|
+
puts "StaticMatic Preview Server Starting..."
|
68
|
+
StaticMatic::Server.start(@base_dir)
|
69
|
+
end
|
70
|
+
|
71
|
+
def copy_file(from, to)
|
72
|
+
FileUtils.cp(from, to)
|
73
|
+
end
|
74
|
+
|
75
|
+
def save_page(filename, content)
|
76
|
+
filename = "#{filename}"
|
77
|
+
generate_site_file(filename, 'html', content)
|
78
|
+
end
|
79
|
+
|
80
|
+
def save_stylesheet(filename, content)
|
81
|
+
filename = "stylesheets/#{filename}"
|
82
|
+
generate_site_file(filename, 'css', content)
|
83
|
+
end
|
84
|
+
|
85
|
+
def generate_site_file(filename, extension, content)
|
86
|
+
path = File.join(@site_dir,"#{filename}.#{extension}")
|
87
|
+
File.open(path, 'w+') do |f|
|
88
|
+
f << content
|
89
|
+
end
|
90
|
+
|
91
|
+
puts "created #{path}"
|
92
|
+
end
|
93
|
+
|
94
|
+
# Keeps track of the layout template to use when generating the site
|
95
|
+
#
|
96
|
+
def layout=(name)
|
97
|
+
if name != @layout_name
|
98
|
+
@layout_name = name
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def layout
|
103
|
+
if !@layout_name
|
104
|
+
@layout_name = "application"
|
105
|
+
end
|
106
|
+
|
107
|
+
File.read("#{@src_dir}/layouts/#{@layout_name}.haml")
|
108
|
+
end
|
109
|
+
|
110
|
+
# Generate html from source file:
|
111
|
+
# generate_html("index.haml")
|
112
|
+
def generate_html(source_file)
|
113
|
+
page = Haml::Engine.new(File.read("#{@src_dir}/pages/#{source_file}.haml"), :locals => {:base_dir => @base_dir})
|
114
|
+
page.render
|
115
|
+
end
|
116
|
+
|
117
|
+
def generate_html_with_layout(source)
|
118
|
+
Haml::Engine.new(layout, :locals => {:base_dir => @base_dir}).to_html { generate_html(source) }
|
119
|
+
end
|
120
|
+
|
121
|
+
def generate_css(source)
|
122
|
+
stylesheet = Sass::Engine.new(File.read("#{@src_dir}/stylesheets/#{source}.sass"))
|
123
|
+
stylesheet.to_css
|
124
|
+
end
|
125
|
+
|
126
|
+
def template_exists?(name)
|
127
|
+
File.exists?("#{@src_dir}/pages/#{name}.haml") || File.exists?("#{@src_dir}/stylesheets/#{name}.sass")
|
128
|
+
end
|
129
|
+
|
130
|
+
# Build HTML from the source files
|
131
|
+
def build_html
|
132
|
+
Dir["#{@src_dir}/pages/**/*.haml"].each do |path|
|
133
|
+
template = source_template_from_path(path)
|
134
|
+
save_page(template, generate_html_with_layout(template))
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# Build CSS from the source files
|
139
|
+
def build_css
|
140
|
+
Dir["#{@src_dir}/stylesheets/**/*.sass"].each do |path|
|
141
|
+
template = source_template_from_path(path)
|
142
|
+
save_stylesheet(template, generate_css(template))
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Returns a raw template name from a source file path:
|
147
|
+
# source_template_from_path("/path/to/site/src/stylesheets/application.sass") -> "application"
|
148
|
+
def source_template_from_path(path)
|
149
|
+
File.basename(path).chomp(File.extname(path))
|
150
|
+
end
|
151
|
+
|
152
|
+
class << self
|
153
|
+
def base_dirs
|
154
|
+
@@base_dirs
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
data/lib/staticmatic/helpers.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
module Haml
|
2
2
|
module Helpers
|
3
3
|
|
4
|
-
# Generates links to all stylesheets in the
|
4
|
+
# Generates links to all stylesheets in the source directory
|
5
5
|
def stylesheets
|
6
|
-
stylesheet_dir = "#{base_dir}/
|
6
|
+
stylesheet_dir = "#{base_dir}/src/stylesheets"
|
7
7
|
output = ""
|
8
|
-
Dir
|
9
|
-
|
10
|
-
|
11
|
-
end
|
8
|
+
Dir["#{stylesheet_dir}/**/*.sass"].each do |path|
|
9
|
+
filename_without_extension = File.basename(path).chomp(File.extname(path))
|
10
|
+
output << tag(:link, :href => "stylesheets/#{filename_without_extension}.css", :rel => 'stylesheet', :media => 'all')
|
12
11
|
end
|
13
12
|
|
14
13
|
output
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module StaticMatic
|
2
|
+
class Server < Mongrel::HttpHandler
|
3
|
+
@@file_only_methods = ["GET","HEAD"]
|
4
|
+
|
5
|
+
def initialize(base_dir)
|
6
|
+
@files = Mongrel::DirHandler.new("#{base_dir}/site",false)
|
7
|
+
@staticmatic = StaticMatic::Base.new(base_dir)
|
8
|
+
end
|
9
|
+
|
10
|
+
def process(request, response)
|
11
|
+
path_info = request.params[Mongrel::Const::PATH_INFO]
|
12
|
+
get_or_head = @@file_only_methods.include? request.params[Mongrel::Const::REQUEST_METHOD]
|
13
|
+
|
14
|
+
file_to_serve = path_info
|
15
|
+
|
16
|
+
file_name, file_ext = path_info.split('.')
|
17
|
+
|
18
|
+
if file_name == "/"
|
19
|
+
file_name = "index"
|
20
|
+
file_ext = "html"
|
21
|
+
end
|
22
|
+
|
23
|
+
# remove stylesheets/ directory if applicable
|
24
|
+
file_name.gsub!("/stylesheets/", "")
|
25
|
+
|
26
|
+
if file_ext && file_ext.match(/html|css/)
|
27
|
+
response.start(200) do |head, out|
|
28
|
+
output = ""
|
29
|
+
|
30
|
+
if @staticmatic.template_exists?(file_name)
|
31
|
+
if file_ext == "html"
|
32
|
+
output = @staticmatic.generate_html_with_layout("#{file_name}")
|
33
|
+
elsif file_ext == "css"
|
34
|
+
output = @staticmatic.generate_css("#{file_name}")
|
35
|
+
end
|
36
|
+
else
|
37
|
+
output = "File not Found"
|
38
|
+
end
|
39
|
+
out.write output
|
40
|
+
end
|
41
|
+
else
|
42
|
+
# try to serve static file from site dir
|
43
|
+
if @files.can_serve(path_info)
|
44
|
+
@files.process(request,response)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class << self
|
50
|
+
# Starts the StaticMatic preview server
|
51
|
+
#
|
52
|
+
# StaticMatic.start('/path/to/site/')
|
53
|
+
#
|
54
|
+
def start(base_dir, port = 3000)
|
55
|
+
config = Mongrel::Configurator.new :host => "127.0.0.1" do
|
56
|
+
puts "Running Preview of #{base_dir} on 127.0.0.1:#{port}"
|
57
|
+
listener :port => port do
|
58
|
+
uri "/", :handler => Server.new(base_dir)
|
59
|
+
end
|
60
|
+
trap("INT") { stop }
|
61
|
+
run
|
62
|
+
end
|
63
|
+
config.join
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/staticmatic.rb
CHANGED
@@ -1,112 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'haml'
|
3
|
+
require 'mongrel'
|
3
4
|
require File.dirname(__FILE__) + '/staticmatic/helpers'
|
4
|
-
|
5
|
-
|
6
|
-
VERSION = '0.1.0'
|
7
|
-
|
8
|
-
# Directories generated for a new site setup
|
9
|
-
cattr_reader :base_dirs
|
10
|
-
@@base_dirs = %w{
|
11
|
-
site/
|
12
|
-
site/stylesheets
|
13
|
-
site/images
|
14
|
-
site/javascripts
|
15
|
-
src/
|
16
|
-
src/pages/
|
17
|
-
src/layouts
|
18
|
-
src/stylesheets
|
19
|
-
}
|
20
|
-
|
21
|
-
# Templates for setup and their location
|
22
|
-
@@templates = {
|
23
|
-
'application.haml' => 'layouts',
|
24
|
-
'application.sass' => 'stylesheets',
|
25
|
-
'index.haml' => 'pages'
|
26
|
-
}
|
27
|
-
|
28
|
-
def initialize(base_dir)
|
29
|
-
@base_dir = base_dir
|
30
|
-
@src_dir = "#{@base_dir}/src"
|
31
|
-
@site_dir = "#{@base_dir}/site"
|
32
|
-
@templates_dir = File.dirname(__FILE__) + '/staticmatic/templates'
|
33
|
-
end
|
34
|
-
|
35
|
-
def build
|
36
|
-
build_css
|
37
|
-
build_html
|
38
|
-
end
|
39
|
-
|
40
|
-
def setup
|
41
|
-
if !File.exists?(@base_dir)
|
42
|
-
Dir.mkdir(@base_dir)
|
43
|
-
end
|
44
|
-
|
45
|
-
@@base_dirs.each do |directory|
|
46
|
-
directory = "#{@base_dir}/#{directory}"
|
47
|
-
if !File.exists?(directory)
|
48
|
-
Dir.mkdir(directory)
|
49
|
-
puts "created #{directory}"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
@@templates.each do |template, destination|
|
54
|
-
copy_file("#{@templates_dir}/#{template}", "#{@src_dir}/#{destination}")
|
55
|
-
end
|
56
|
-
|
57
|
-
puts "Done"
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
def copy_file(from, to)
|
63
|
-
`cp #{from} #{to}`
|
64
|
-
end
|
65
|
-
|
66
|
-
def save_page(filename, content)
|
67
|
-
filename = "#{filename}"
|
68
|
-
generate_site_file(filename, 'html', content)
|
69
|
-
end
|
70
|
-
|
71
|
-
def save_stylesheet(filename, content)
|
72
|
-
filename = "stylesheets/#{filename}"
|
73
|
-
generate_site_file(filename, 'css', content)
|
74
|
-
end
|
75
|
-
|
76
|
-
def generate_site_file(filename, extension, content)
|
77
|
-
site_file = File.new("#{@site_dir}/#{filename}.#{extension}", 'w+')
|
78
|
-
site_file << content
|
79
|
-
site_file.close
|
80
|
-
puts "created #{@site_dir}/#{filename}.#{extension}"
|
81
|
-
end
|
82
|
-
|
83
|
-
def build_html
|
84
|
-
layout_content = File.read("#{@src_dir}/layouts/application.haml")
|
85
|
-
|
86
|
-
Dir.entries("#{@src_dir}/pages").each do |file|
|
87
|
-
if matches = file.match(/([a-z0-9_-]+)\.haml$/)
|
88
|
-
|
89
|
-
filename_without_extension = matches[1]
|
90
|
-
|
91
|
-
page = Haml::Engine.new(File.read("#{@src_dir}/pages/#{file}"), :locals => {:base_dir => @base_dir})
|
92
|
-
page_content = page.render
|
93
|
-
|
94
|
-
content_with_layout = Haml::Engine.new(layout_content, :locals => {:base_dir => @base_dir}).render { page_content }
|
95
|
-
|
96
|
-
save_page(filename_without_extension, content_with_layout)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def build_css
|
102
|
-
Dir.entries("#{@src_dir}/stylesheets").each do |file|
|
103
|
-
if matches = file.match(/([a-z0-9_-]+)\.sass$/)
|
104
|
-
filename_without_extension = matches[1]
|
105
|
-
|
106
|
-
stylesheet = Sass::Engine.new(File.read("#{@src_dir}/stylesheets/#{file}"))
|
107
|
-
|
108
|
-
save_stylesheet(filename_without_extension, stylesheet.render)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
5
|
+
require File.dirname(__FILE__) + '/staticmatic/base'
|
6
|
+
require File.dirname(__FILE__) + '/staticmatic/server'
|
data/test/base_test.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/staticmatic'
|
3
|
+
|
4
|
+
class StaticMaticBaseTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@base_dir = File.dirname(__FILE__) + '/sandbox/test_site'
|
7
|
+
@tmp_dir = File.dirname(__FILE__) + '/sandbox/tmp'
|
8
|
+
|
9
|
+
@staticmatic = StaticMatic::Base.new(@base_dir)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_setup_directories
|
13
|
+
staticmatic = StaticMatic::Base.new(@tmp_dir)
|
14
|
+
staticmatic.run('setup')
|
15
|
+
|
16
|
+
StaticMatic::Base.base_dirs.each do |dir|
|
17
|
+
assert File.exists?("#{@tmp_dir}/#{dir}"), "Should create #{dir}"
|
18
|
+
end
|
19
|
+
|
20
|
+
StaticMatic::Base.base_dirs.reverse.each do |dir|
|
21
|
+
Dir.entries("#{@tmp_dir}/#{dir}").each do |file|
|
22
|
+
next if file.match(/^\./)
|
23
|
+
File.delete("#{@tmp_dir}/#{dir}/#{file}")
|
24
|
+
end
|
25
|
+
Dir.delete("#{@tmp_dir}/#{dir}") if File.exists?("#{@tmp_dir}/#{dir}")
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_set_layout_template
|
31
|
+
@staticmatic.layout = "application"
|
32
|
+
assert_match "StaticMatic - Test Site Template", @staticmatic.layout
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_should_generate_html_with_layout
|
36
|
+
content = @staticmatic.generate_html_with_layout("index")
|
37
|
+
assert_match "StaticMatic - Test Site Template", content
|
38
|
+
assert_match "This is some test content", content
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_should_generate_css
|
42
|
+
content = @staticmatic.generate_css("application")
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_should_find_source_filename_from_path
|
46
|
+
assert_equal "application", @staticmatic.source_template_from_path("@base_dir/src/stylesheets/application.css")
|
47
|
+
end
|
48
|
+
end
|
data/test/server_test.rb
ADDED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: staticmatic
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.2.0
|
7
|
+
date: 2007-06-10 00:00:00 +01:00
|
8
8
|
summary: Manage static sites using Haml & Sass
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -53,14 +53,17 @@ files:
|
|
53
53
|
- example/src/stylesheets/application.sass
|
54
54
|
- lib/staticmatic
|
55
55
|
- lib/staticmatic.rb
|
56
|
+
- lib/staticmatic/base.rb
|
56
57
|
- lib/staticmatic/helpers.rb
|
58
|
+
- lib/staticmatic/server.rb
|
57
59
|
- lib/staticmatic/templates
|
58
60
|
- lib/staticmatic/templates/application.haml
|
59
61
|
- lib/staticmatic/templates/application.sass
|
60
62
|
- lib/staticmatic/templates/index.haml
|
63
|
+
- test/base_test.rb
|
61
64
|
- test/helpers_test.rb
|
62
65
|
- test/sandbox
|
63
|
-
- test/
|
66
|
+
- test/server_test.rb
|
64
67
|
- test/sandbox/test_site
|
65
68
|
- test/sandbox/tmp
|
66
69
|
- test/sandbox/test_site/config.rb
|
@@ -78,8 +81,9 @@ files:
|
|
78
81
|
- test/sandbox/test_site/src/pages/index.haml
|
79
82
|
- test/sandbox/test_site/src/stylesheets/application.sass
|
80
83
|
test_files:
|
84
|
+
- test/base_test.rb
|
81
85
|
- test/helpers_test.rb
|
82
|
-
- test/
|
86
|
+
- test/server_test.rb
|
83
87
|
rdoc_options: []
|
84
88
|
|
85
89
|
extra_rdoc_files: []
|
data/test/staticmatic_test.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require File.dirname(__FILE__) + '/../lib/staticmatic'
|
3
|
-
|
4
|
-
class StaticMaticTest < Test::Unit::TestCase
|
5
|
-
def setup
|
6
|
-
@base_dir = File.dirname(__FILE__) + '/sandbox/tmp'
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_should_setup_directories
|
10
|
-
staticmatic = StaticMatic.new(@base_dir)
|
11
|
-
staticmatic.setup
|
12
|
-
|
13
|
-
StaticMatic.base_dirs.each do |dir|
|
14
|
-
assert File.exists?("#{@base_dir}/#{dir}"), "Should create #{dir}"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def teardown
|
19
|
-
StaticMatic.base_dirs.reverse.each do |dir|
|
20
|
-
Dir.entries("#{@base_dir}/#{dir}").each do |file|
|
21
|
-
next if file.match(/^\./)
|
22
|
-
File.delete("#{@base_dir}/#{dir}/#{file}")
|
23
|
-
end
|
24
|
-
Dir.delete("#{@base_dir}/#{dir}") if File.exists?("#{@base_dir}/#{dir}")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|