initial import
This commit is contained in:
parent
493089d4b0
commit
321dc9c0ce
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
|||
Copyright (c) 2009 tdreyno
|
||||
Copyright (c) 2009 Thomas Reynolds
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
= middleman
|
||||
|
||||
Description goes here.
|
||||
The Middleman is ever-vigilant against tag-soup, unreadable CSS and repetition. He stands-watch over your Haml and Sass producing only the cleanest and efficient markup.
|
||||
|
||||
== Copyright
|
||||
|
||||
Copyright (c) 2009 tdreyno. See LICENSE for details.
|
||||
Copyright (c) 2009 Thomas Reynolds. See LICENSE for details.
|
||||
|
|
7
Rakefile
7
Rakefile
|
@ -8,9 +8,14 @@ begin
|
|||
gem.summary = %Q{A static site generator utilizing Haml and Sass}
|
||||
gem.email = "tdreyno@gmail.com"
|
||||
gem.homepage = "http://github.com/tdreyno/middleman"
|
||||
gem.authors = ["tdreyno"]
|
||||
gem.authors = ["Thomas Reynolds"]
|
||||
gem.rubyforge_project = "middleman"
|
||||
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
||||
gem.executables = %w(sm-init sm-build sm-server)
|
||||
gem.add_dependency("templater")
|
||||
gem.add_dependency("sinatra")
|
||||
gem.add_dependency("haml", ">=2.1.0")
|
||||
gem.add_dependency("chriseppstein-compass")
|
||||
end
|
||||
|
||||
Jeweler::RubyforgeTasks.new
|
||||
|
|
68
bin/mm-build
Executable file
68
bin/mm-build
Executable file
|
@ -0,0 +1,68 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# Require app
|
||||
require 'rubygems'
|
||||
require 'templater'
|
||||
require 'open-uri'
|
||||
require File.join(File.dirname(__FILE__), '..', 'lib', 'middleman')
|
||||
|
||||
module Generators
|
||||
extend Templater::Manifold
|
||||
desc "Build a staticmatic site"
|
||||
|
||||
class Builder < Templater::Generator
|
||||
# Define source and desintation
|
||||
def self.source_root; Dir.pwd; end
|
||||
def destination_root; File.join(Dir.pwd, 'build'); end
|
||||
|
||||
# Override template to ask staticmatic for the correct extension to output
|
||||
def self.template(name, *args, &block)
|
||||
return if args.first.include?('layout')
|
||||
return if File.basename(args.first)[0,1] == '_'
|
||||
|
||||
if (args[0] === args[1])
|
||||
newext = case File.extname(args.first)
|
||||
when '.haml'
|
||||
'.html'
|
||||
when '.sass'
|
||||
'.css'
|
||||
else
|
||||
File.extname(args.first)
|
||||
end
|
||||
args[1] = args[0].gsub(File.extname(args.first), newext).gsub('views/', '')
|
||||
end
|
||||
|
||||
super(name, *args, &block)
|
||||
end
|
||||
|
||||
def self.file(name, *args, &block)
|
||||
args[1] = args[0].gsub('views/', '') if (args[0] === args[1])
|
||||
super(name, *args, &block)
|
||||
end
|
||||
|
||||
public_files_glob = File.join(source_root, "public", '**/*')
|
||||
Dir[public_files_glob].each do |action|
|
||||
next if File.directory?(action)
|
||||
action = action.sub("#{source_root}/", '')
|
||||
file(action.downcase.gsub(/[^a-z0-9]+/, '_').to_sym, action, action.gsub('public/', ''))
|
||||
end
|
||||
|
||||
glob! "views", %w(haml sass)
|
||||
end
|
||||
|
||||
add :build, Builder
|
||||
end
|
||||
|
||||
# Monkey-patch to use a dynamic renderer, not just ERb
|
||||
class Templater::Actions::Template
|
||||
def render
|
||||
return ""
|
||||
#request_path = destination.gsub(File.join(Dir.pwd, 'build'), "")
|
||||
#Rack Handler
|
||||
end
|
||||
end
|
||||
|
||||
# Start app
|
||||
#Middleman.run!(:root => Dir.pwd) do
|
||||
Generators.run_cli(Dir.pwd, 'mm-build', 1, %w(build --force).concat(ARGV))
|
||||
#end
|
32
bin/mm-init
Executable file
32
bin/mm-init
Executable file
|
@ -0,0 +1,32 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
require 'rubygems'
|
||||
require 'templater'
|
||||
|
||||
module Generators
|
||||
extend Templater::Manifold
|
||||
desc "Generator for streamlining staticmatic"
|
||||
|
||||
class NewSite < Templater::Generator
|
||||
desc "Creates a new staticmatic scaffold."
|
||||
first_argument :location, :required => true, :desc => "Project location"
|
||||
|
||||
def destination_root
|
||||
File.expand_path(location)
|
||||
end
|
||||
|
||||
def self.source_root
|
||||
File.join(File.dirname(__FILE__), '..', 'lib', 'middleman', 'template')
|
||||
end
|
||||
|
||||
glob! :views
|
||||
glob! :public
|
||||
empty_directory :stylesheets, "public/stylesheets"
|
||||
empty_directory :javascripts, "public/javascripts"
|
||||
empty_directory :images, "public/images"
|
||||
end
|
||||
|
||||
add :setup, NewSite
|
||||
end
|
||||
|
||||
Generators.run_cli(Dir.pwd, 'mm-init', 1, %w(setup).concat(ARGV))
|
7
bin/mm-server
Executable file
7
bin/mm-server
Executable file
|
@ -0,0 +1,7 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# Require Middleman
|
||||
require File.join(File.dirname(__FILE__), '..', 'lib', 'middleman')
|
||||
|
||||
# Start Middleman
|
||||
Middleman.run!(:root => Dir.pwd)
|
|
@ -0,0 +1,63 @@
|
|||
require 'rubygems'
|
||||
require 'haml'
|
||||
require 'compass' #must be loaded before sinatra
|
||||
require 'sinatra/base'
|
||||
|
||||
class Middleman < Sinatra::Base
|
||||
set :app_file, __FILE__
|
||||
|
||||
def self.run!(options={}, &block)
|
||||
set options
|
||||
handler = detect_rack_handler
|
||||
handler_name = handler.name.gsub(/.*::/, '')
|
||||
puts "== The Middleman is standing watch on port #{port}"
|
||||
handler.run self, :Host => host, :Port => port do |server|
|
||||
trap(:INT) do
|
||||
## Use thins' hard #stop! if available, otherwise just #stop
|
||||
server.respond_to?(:stop!) ? server.stop! : server.stop
|
||||
puts "\n== The Middleman has ended his patrol"
|
||||
end
|
||||
|
||||
if block_given?
|
||||
block.call
|
||||
## Use thins' hard #stop! if available, otherwise just #stop
|
||||
server.respond_to?(:stop!) ? server.stop! : server.stop
|
||||
end
|
||||
end
|
||||
rescue Errno::EADDRINUSE => e
|
||||
puts "== The Middleman is already standing watch on port #{port}!"
|
||||
end
|
||||
|
||||
configure do
|
||||
Compass.configuration do |config|
|
||||
config.project_path = Dir.pwd
|
||||
config.sass_dir = File.join(File.expand_path(self.views), "stylesheets")
|
||||
config.output_style = :nested
|
||||
config.images_dir = File.join(File.expand_path(self.public), "images")
|
||||
config.http_images_path = "/images/"
|
||||
end
|
||||
end
|
||||
|
||||
def render_haml_or_sass(path)
|
||||
if path.match /.html$/
|
||||
haml(path.gsub('.html', '').to_sym)
|
||||
elsif path.match /.css$/
|
||||
content_type 'text/css', :charset => 'utf-8'
|
||||
sass(path.gsub('.css', '').to_sym, Compass.sass_engine_options)
|
||||
end
|
||||
end
|
||||
|
||||
get /(.*)/ do |path|
|
||||
path = path.gsub(%r{^/}, '')
|
||||
path = "index.html" if path == ''
|
||||
|
||||
if path.match /.html$/
|
||||
haml(path.gsub('.html', '').to_sym)
|
||||
elsif path.match /.css$/
|
||||
content_type 'text/css', :charset => 'utf-8'
|
||||
sass(path.gsub('.css', '').to_sym, Compass.sass_engine_options)
|
||||
else
|
||||
pass
|
||||
end
|
||||
end
|
||||
end
|
1
lib/middleman/template/views/index.haml
Normal file
1
lib/middleman/template/views/index.haml
Normal file
|
@ -0,0 +1 @@
|
|||
%h1 The Middleman is watching.
|
6
lib/middleman/template/views/layout.haml
Normal file
6
lib/middleman/template/views/layout.haml
Normal file
|
@ -0,0 +1,6 @@
|
|||
%html
|
||||
%head
|
||||
%title The Middleman!
|
||||
|
||||
%body
|
||||
= yield
|
1
lib/middleman/template/views/stylesheets/site.sass
Normal file
1
lib/middleman/template/views/stylesheets/site.sass
Normal file
|
@ -0,0 +1 @@
|
|||
@import compass/reset.sass
|
44
spec/builder_spec.rb
Normal file
44
spec/builder_spec.rb
Normal file
|
@ -0,0 +1,44 @@
|
|||
require 'fileutils'
|
||||
|
||||
describe "Builder" do
|
||||
def project_file(*parts)
|
||||
File.expand_path(File.join(File.dirname(__FILE__), "..", *parts))
|
||||
end
|
||||
|
||||
before :all do
|
||||
@root_dir = project_file("spec", "fixtures", "sample")
|
||||
end
|
||||
|
||||
before :each do
|
||||
build_cmd = project_file("bin", "mm-build")
|
||||
`cd #{@root_dir} && #{build_cmd}`
|
||||
end
|
||||
|
||||
after :each do
|
||||
FileUtils.rm_rf(File.join(@root_dir, "build"))
|
||||
end
|
||||
|
||||
it "should build normal files" do
|
||||
File.exists?("#{@root_dir}/build/index.html").should be_true
|
||||
end
|
||||
|
||||
it "should build static files" do
|
||||
File.exists?("#{@root_dir}/build/static.html").should be_true
|
||||
end
|
||||
|
||||
it "should build subdirectory files" do
|
||||
File.exists?("#{@root_dir}/build/services/index.html").should be_true
|
||||
end
|
||||
|
||||
it "should build sass files" do
|
||||
File.exists?("#{@root_dir}/build/stylesheets/site.css").should be_true
|
||||
end
|
||||
|
||||
it "should build static css files" do
|
||||
File.exists?("#{@root_dir}/build/stylesheets/static.css").should be_true
|
||||
end
|
||||
|
||||
it "should not build partial files" do
|
||||
File.exists?("#{@root_dir}/build/_partial.html").should be_false
|
||||
end
|
||||
end
|
1
spec/fixtures/sample/public/static.html
vendored
Normal file
1
spec/fixtures/sample/public/static.html
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
Static, no code!
|
2
spec/fixtures/sample/public/stylesheets/static.css
vendored
Normal file
2
spec/fixtures/sample/public/stylesheets/static.css
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
body {
|
||||
font-size: 12px; }
|
1
spec/fixtures/sample/views/_partial.haml
vendored
Normal file
1
spec/fixtures/sample/views/_partial.haml
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
%p Test
|
1
spec/fixtures/sample/views/index.haml
vendored
Normal file
1
spec/fixtures/sample/views/index.haml
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
%h1 Welcome
|
6
spec/fixtures/sample/views/layout.haml
vendored
Normal file
6
spec/fixtures/sample/views/layout.haml
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
%html
|
||||
%head
|
||||
%link{ :href => "/stylesheets/site.css", :rel => "stylesheet", :type => "text/css" }
|
||||
%title My Sample Site
|
||||
%body
|
||||
= yield
|
1
spec/fixtures/sample/views/services/index.haml
vendored
Normal file
1
spec/fixtures/sample/views/services/index.haml
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
%h2 Services
|
1
spec/fixtures/sample/views/stylesheets/site.sass
vendored
Normal file
1
spec/fixtures/sample/views/stylesheets/site.sass
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
@import compass/reset.sass
|
34
spec/generator_spec.rb
Normal file
34
spec/generator_spec.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
require 'fileutils'
|
||||
|
||||
describe "Generator" do
|
||||
def project_file(*parts)
|
||||
File.expand_path(File.join(File.dirname(__FILE__), "..", *parts))
|
||||
end
|
||||
|
||||
before :all do
|
||||
@root_dir = project_file("spec", "fixtures", "generator-test")
|
||||
end
|
||||
|
||||
before :each do
|
||||
init_cmd = project_file("bin", "mm-init")
|
||||
`cd #{File.dirname(@root_dir)} && #{init_cmd} #{File.basename(@root_dir)}`
|
||||
end
|
||||
|
||||
after :each do
|
||||
FileUtils.rm_rf(@root_dir)
|
||||
end
|
||||
|
||||
it "should copy template files" do
|
||||
template_dir = project_file("lib", "template", "**/*")
|
||||
Dir[template_dir].each do |f|
|
||||
next if File.directory?(f)
|
||||
File.exists?("#{@root_dir}/#{f.split('template/')[1]}").should be_true
|
||||
end
|
||||
end
|
||||
|
||||
it "should create empty directories" do
|
||||
%w(views/stylesheets public/stylesheets public/javascripts public/images).each do |d|
|
||||
File.exists?("#{@root_dir}/#{d}").should be_true
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue