Extract compass support into extension, rewrite all features that rely on it to be pure Ruby
3
Gemfile
|
@ -22,6 +22,8 @@ platforms :ruby do
|
|||
gem 'therubyracer'
|
||||
gem 'redcarpet', '~> 3.1'
|
||||
gem 'pry', require: false, group: :development
|
||||
# gem 'pry-debugger', require: false, group: :development
|
||||
# gem 'pry-stack_explorer', require: false, group: :development
|
||||
end
|
||||
|
||||
platforms :jruby do
|
||||
|
@ -35,5 +37,6 @@ gem 'rubocop', require: false
|
|||
# Middleman itself
|
||||
gem 'middleman-core', path: 'middleman-core'
|
||||
gem 'middleman-cli', path: 'middleman-cli'
|
||||
gem 'middleman-compass', path: 'middleman-compass', require: false
|
||||
gem 'middleman-sprockets', github: 'middleman/middleman-sprockets', require: false
|
||||
gem 'middleman', path: 'middleman'
|
||||
|
|
12
Rakefile
|
@ -46,7 +46,6 @@ task :test do
|
|||
GEM_PATHS.each do |g|
|
||||
Dir.chdir("#{File.join(ROOT, g)}") { sh "#{Gem.ruby} -S rake test" }
|
||||
end
|
||||
Rake::Task['rubocop'].invoke
|
||||
end
|
||||
|
||||
desc 'Run specs for all middleman gems'
|
||||
|
@ -56,10 +55,15 @@ task :spec do
|
|||
end
|
||||
end
|
||||
|
||||
require 'rubocop/rake_task'
|
||||
desc 'Run RuboCop to check code consistency'
|
||||
Rubocop::RakeTask.new(:rubocop) do |task|
|
||||
begin
|
||||
require 'rubocop/rake_task'
|
||||
if defined?(Rubocop)
|
||||
desc 'Run RuboCop to check code consistency'
|
||||
Rubocop::RakeTask.new(:rubocop) do |task|
|
||||
task.fail_on_error = false
|
||||
end
|
||||
end
|
||||
rescue LoadError
|
||||
end
|
||||
|
||||
desc 'Run tests for all middleman gems'
|
||||
|
|
|
@ -187,9 +187,9 @@ module Middleman::Cli
|
|||
resource.ext == '.css'
|
||||
end.each(&method(:build_resource))
|
||||
|
||||
logger.debug '== Checking for Compass sprites'
|
||||
logger.debug '== Checking for generated images'
|
||||
|
||||
# Double-check for compass sprites
|
||||
# Double-check for generated images
|
||||
@app.files.find_new_files((@source_dir + @app.config[:images_dir]).relative_path_from(@app.root_path))
|
||||
@app.sitemap.ensure_resource_list_updated!
|
||||
|
||||
|
|
10
middleman-compass/.gitignore
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
.DS_Store
|
||||
Gemfile.lock
|
||||
Gemfile-v4.lock
|
||||
tmp
|
||||
.rbenv-*
|
||||
.sass-cache
|
||||
pkg
|
||||
build
|
||||
.ruby-version
|
||||
.cache
|
16
middleman-compass/.travis.yml
Normal file
|
@ -0,0 +1,16 @@
|
|||
rvm:
|
||||
- 1.9.3
|
||||
- 2.0.0
|
||||
- 2.1.1
|
||||
- jruby-19mode
|
||||
|
||||
gemfile:
|
||||
- Gemfile
|
||||
- Gemfile-v4
|
||||
|
||||
script: "bundle exec rake test"
|
||||
|
||||
env: TEST=true
|
||||
|
||||
matrix:
|
||||
fast_finish: true
|
43
middleman-compass/CONTRIBUTING.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Contributing
|
||||
In the spirit of [free software][free-sw], **everyone** is encouraged to help
|
||||
improve this project.
|
||||
|
||||
[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
|
||||
|
||||
Here are some ways *you* can contribute:
|
||||
|
||||
* by using alpha, beta, and prerelease versions
|
||||
* by reporting bugs
|
||||
* by suggesting new features
|
||||
* by writing or editing documentation
|
||||
* by writing specifications
|
||||
* by writing code ( **no patch is too small** : fix typos, add comments, clean up inconsistent whitespace )
|
||||
* by refactoring code
|
||||
* by closing [issues][]
|
||||
* by reviewing patches
|
||||
|
||||
[issues]: https://github.com/middleman/middleman-compass/issues
|
||||
|
||||
## Submitting an Issue
|
||||
We use the [GitHub issue tracker][issues] to track bugs and features. Before
|
||||
submitting a bug report or feature request, check to make sure it hasn't
|
||||
already been submitted. When submitting a bug report, please include a [Gist][]
|
||||
that includes a stack trace and any details that may be necessary to reproduce
|
||||
the bug, including your gem version, Ruby version, and operating system.
|
||||
Ideally, a bug report should include a pull request with failing specs.
|
||||
|
||||
[gist]: https://gist.github.com/
|
||||
|
||||
## Submitting a Pull Request
|
||||
1. [Fork the repository.][fork]
|
||||
2. [Create a topic branch.][branch]
|
||||
3. Add specs for your unimplemented feature or bug fix.
|
||||
4. Run `bundle exec rake test`. If your specs pass, return to step 3.
|
||||
5. Implement your feature or bug fix.
|
||||
6. Run `bundle exec rake test`. If your specs fail, return to step 5.
|
||||
7. Add, commit, and push your changes.
|
||||
8. [Submit a pull request.][pr]
|
||||
|
||||
[fork]: http://help.github.com/fork-a-repo/
|
||||
[branch]: http://learn.github.com/p/branching.html
|
||||
[pr]: http://help.github.com/send-pull-requests/
|
17
middleman-compass/Gemfile
Normal file
|
@ -0,0 +1,17 @@
|
|||
source "https://rubygems.org"
|
||||
|
||||
gem "middleman-cli", :github => "middleman/middleman", :branch => "master"
|
||||
gem "middleman-core", :github => "middleman/middleman", :branch => "master"
|
||||
|
||||
# Specify your gem's dependencies in middleman-sprockets.gemspec
|
||||
gemspec
|
||||
|
||||
gem "rake", "~> 10.0.3", :require => false
|
||||
gem "yard", "~> 0.8.0", :require => false
|
||||
|
||||
# Test tools
|
||||
gem "cucumber"
|
||||
gem "fivemat", "~> 1.2.1"
|
||||
gem "aruba"
|
||||
gem "rspec", "~> 2.14"
|
||||
gem "builder", "~> 3.0"
|
20
middleman-compass/LICENSE.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
Copyright (c) 2012-2013 Thomas Reynolds
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
59
middleman-compass/README.md
Normal file
|
@ -0,0 +1,59 @@
|
|||
# Middleman-compass
|
||||
|
||||
`middleman-compass` is an extension for the [Middleman] static site generator that allows support for [Compass](http://compass-style.org) in your assets.
|
||||
|
||||
## Installation
|
||||
|
||||
If you're just getting started, install the `middleman` gem and generate a new project:
|
||||
|
||||
```
|
||||
gem install middleman
|
||||
middleman init MY_PROJECT
|
||||
```
|
||||
|
||||
If you already have a Middleman project: Add `gem "middleman-compass"` to your `Gemfile` and run `bundle install`
|
||||
|
||||
## Configuration
|
||||
|
||||
```
|
||||
activate :compass
|
||||
```
|
||||
|
||||
## Build & Dependency Status
|
||||
|
||||
[![Gem Version](https://badge.fury.io/rb/middleman-compass.png)][gem]
|
||||
[![Build Status](https://travis-ci.org/middleman/middleman-compass.png)][travis]
|
||||
[![Dependency Status](https://gemnasium.com/middleman/middleman-compass.png?travis)][gemnasium]
|
||||
[![Code Quality](https://codeclimate.com/github/middleman/middleman-compass.png)][codeclimate]
|
||||
|
||||
## Community
|
||||
|
||||
The official community forum is available at: http://forum.middlemanapp.com
|
||||
|
||||
## Bug Reports
|
||||
|
||||
Github Issues are used for managing bug reports and feature requests. If you run into issues, please search the issues and submit new problems: https://github.com/middleman/middleman-compass/issues
|
||||
|
||||
The best way to get quick responses to your issues and swift fixes to your bugs is to submit detailed bug reports, include test cases and respond to developer questions in a timely manner. Even better, if you know Ruby, you can submit [Pull Requests](https://help.github.com/articles/using-pull-requests) containing Cucumber Features which describe how your feature should work or exploit the bug you are submitting.
|
||||
|
||||
## How to Run Cucumber Tests
|
||||
|
||||
1. Checkout Repository: `git clone https://github.com/middleman/middleman-compass.git`
|
||||
2. Install Bundler: `gem install bundler`
|
||||
3. Run `bundle install` inside the project root to install the gem dependencies.
|
||||
4. Run test cases: `bundle exec rake test`
|
||||
|
||||
## Donate
|
||||
|
||||
[Click here to lend your support to Middleman](https://spacebox.io/s/4dXbHBorC3)
|
||||
|
||||
## License
|
||||
|
||||
Copyright (c) 2012-2013 Thomas Reynolds. MIT Licensed, see [LICENSE] for details.
|
||||
|
||||
[middleman]: http://middlemanapp.com
|
||||
[gem]: https://rubygems.org/gems/middleman-compass
|
||||
[travis]: http://travis-ci.org/middleman/middleman-compass
|
||||
[gemnasium]: https://gemnasium.com/middleman/middleman-compass
|
||||
[codeclimate]: https://codeclimate.com/github/middleman/middleman-compass
|
||||
[LICENSE]: https://github.com/middleman/middleman-compass/blob/master/LICENSE.md
|
20
middleman-compass/Rakefile
Normal file
|
@ -0,0 +1,20 @@
|
|||
require 'bundler'
|
||||
Bundler::GemHelper.install_tasks
|
||||
|
||||
require 'cucumber/rake/task'
|
||||
|
||||
require 'middleman-core/version'
|
||||
|
||||
Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t|
|
||||
exempt_tags = ["--tags ~@wip"]
|
||||
t.cucumber_opts = "--color #{exempt_tags.join(" ")} --strict --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}"
|
||||
end
|
||||
|
||||
require 'rake/clean'
|
||||
|
||||
task :test => [:cucumber]
|
||||
|
||||
desc "Build HTML documentation"
|
||||
task :doc do
|
||||
sh 'bundle exec yard'
|
||||
end
|
8
middleman-compass/features/support/env.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
|
||||
ENV['TEST'] = 'true'
|
||||
ENV["AUTOLOAD_COMPASS"] = "true"
|
||||
require "middleman-core"
|
||||
require "middleman-core/step_definitions"
|
||||
require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-compass')
|
||||
require "erubis"
|
||||
|
2
middleman-compass/fixtures/compass-sprites-app/config.rb
Normal file
|
@ -0,0 +1,2 @@
|
|||
require 'middleman-compass'
|
||||
activate :compass
|
Before Width: | Height: | Size: 379 B After Width: | Height: | Size: 379 B |
Before Width: | Height: | Size: 345 B After Width: | Height: | Size: 345 B |
Before Width: | Height: | Size: 349 B After Width: | Height: | Size: 349 B |
Before Width: | Height: | Size: 372 B After Width: | Height: | Size: 372 B |
BIN
middleman-compass/fixtures/fonts-app/source/fonts/StMarie-Thin.otf
Executable file
6
middleman-compass/lib/middleman-compass.rb
Normal file
|
@ -0,0 +1,6 @@
|
|||
require "middleman-core"
|
||||
|
||||
Middleman::Extensions.register(:compass) do
|
||||
require "middleman-compass/extension"
|
||||
Middleman::CompassExtension
|
||||
end
|
63
middleman-compass/lib/middleman-compass/extension.rb
Normal file
|
@ -0,0 +1,63 @@
|
|||
module Middleman
|
||||
class CompassExtension < Extension
|
||||
def initialize(app, options_hash={}, &block)
|
||||
require 'middleman-core/renderers/sass'
|
||||
require 'compass'
|
||||
|
||||
super
|
||||
|
||||
# Hooks to manually update the compass config after we're
|
||||
# done with it
|
||||
app.define_hook :compass_config end
|
||||
|
||||
def after_configuration
|
||||
::Compass.configuration do |compass_config|
|
||||
compass_config.project_path = app.source_dir
|
||||
compass_config.environment = :development
|
||||
compass_config.cache = false
|
||||
compass_config.sass_dir = app.config[:css_dir]
|
||||
compass_config.css_dir = app.config[:css_dir]
|
||||
compass_config.javascripts_dir = app.config[:js_dir]
|
||||
compass_config.fonts_dir = app.config[:fonts_dir]
|
||||
compass_config.images_dir = app.config[:images_dir]
|
||||
compass_config.http_path = app.config[:http_prefix]
|
||||
|
||||
# Disable this initially, the cache_buster extension will
|
||||
# re-enable it if requested.
|
||||
compass_config.asset_cache_buster { |_| nil }
|
||||
|
||||
# Disable this initially, the relative_assets extension will
|
||||
|
||||
compass_config.relative_assets = false
|
||||
|
||||
# Default output style
|
||||
compass_config.output_style = :nested
|
||||
end
|
||||
|
||||
# Call hook
|
||||
app.run_hook_for :compass_config, app, ::Compass.configuration
|
||||
|
||||
# Tell Tilt to use it as well (for inline sass blocks)
|
||||
::Tilt.register 'sass', CompassSassTemplate
|
||||
::Tilt.prefer(CompassSassTemplate)
|
||||
|
||||
# Tell Tilt to use it as well (for inline scss blocks)
|
||||
::Tilt.register 'scss', CompassScssTemplate
|
||||
::Tilt.prefer(CompassScssTemplate)
|
||||
end
|
||||
|
||||
# A Compass Sass template for Tilt, adding our options in
|
||||
class CompassSassTemplate < ::Middleman::Renderers::Sass::SassPlusCSSFilenameTemplate
|
||||
def sass_options
|
||||
super.merge(::Compass.configuration.to_sass_engine_options)
|
||||
end
|
||||
end
|
||||
|
||||
# A Compass Scss template for Tilt, adding our options in
|
||||
class CompassScssTemplate < ::Middleman::Renderers::Sass::ScssPlusCSSFilenameTemplate
|
||||
def sass_options
|
||||
super.merge(::Compass.configuration.to_sass_engine_options)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
5
middleman-compass/lib/middleman-compass/version.rb
Normal file
|
@ -0,0 +1,5 @@
|
|||
module Middleman
|
||||
module Compass
|
||||
VERSION = "4.0.0"
|
||||
end
|
||||
end
|
20
middleman-compass/middleman-compass.gemspec
Normal file
|
@ -0,0 +1,20 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
$:.push File.expand_path("../lib", __FILE__)
|
||||
require "middleman-compass/version"
|
||||
|
||||
Gem::Specification.new do |s|
|
||||
s.name = "middleman-compass"
|
||||
s.version = Middleman::Compass::VERSION
|
||||
s.platform = Gem::Platform::RUBY
|
||||
s.authors = ['Thomas Reynolds', 'Ben Hollis', 'Karl Freeman']
|
||||
s.email = ['me@tdreyno.com', 'ben@benhollis.net', 'karlfreeman@gmail.com']
|
||||
s.homepage = "https://github.com/middleman/middleman-compass"
|
||||
s.summary = %q{Compass support for Middleman}
|
||||
s.description = %q{Compass support for Middleman}
|
||||
s.license = "MIT"
|
||||
s.files = `git ls-files -z`.split("\0")
|
||||
s.test_files = `git ls-files -z -- {fixtures,features}/*`.split("\0")
|
||||
s.require_paths = ["lib"]
|
||||
s.add_dependency("middleman-core")#, [">= 4.0.0"])
|
||||
s.add_dependency('compass', ['>= 1.0.0.alpha.19'])
|
||||
end
|
|
@ -10,7 +10,7 @@ Feature: Assets get a file hash appended to their and references to them are upd
|
|||
| images/100px-5fd6fb90.jpg |
|
||||
| images/100px-5fd6fb90.gif |
|
||||
| javascripts/application-1d8d5276.js |
|
||||
| stylesheets/site-50eaa978.css |
|
||||
| stylesheets/site-7474cadd.css |
|
||||
| index.html |
|
||||
| subdir/index.html |
|
||||
| other/index.html |
|
||||
|
@ -22,15 +22,18 @@ Feature: Assets get a file hash appended to their and references to them are upd
|
|||
| stylesheets/site.css |
|
||||
|
||||
And the file "javascripts/application-1d8d5276.js" should contain "img.src = '/images/100px-5fd6fb90.jpg'"
|
||||
And the file "stylesheets/site-50eaa978.css" should contain "background-image: url('../images/100px-5fd6fb90.jpg')"
|
||||
And the file "stylesheets/site-7474cadd.css" should contain:
|
||||
"""
|
||||
background-image: url("../images/100px-5fd6fb90.jpg")
|
||||
"""
|
||||
And the file "index.html" should contain 'href="apple-touch-icon.png"'
|
||||
And the file "index.html" should contain 'href="stylesheets/site-50eaa978.css"'
|
||||
And the file "index.html" should contain 'href="stylesheets/site-7474cadd.css"'
|
||||
And the file "index.html" should contain 'src="javascripts/application-1d8d5276.js"'
|
||||
And the file "index.html" should contain 'src="images/100px-5fd6fb90.jpg"'
|
||||
And the file "subdir/index.html" should contain 'href="../stylesheets/site-50eaa978.css"'
|
||||
And the file "subdir/index.html" should contain 'href="../stylesheets/site-7474cadd.css"'
|
||||
And the file "subdir/index.html" should contain 'src="../javascripts/application-1d8d5276.js"'
|
||||
And the file "subdir/index.html" should contain 'src="../images/100px-5fd6fb90.jpg"'
|
||||
And the file "other/index.html" should contain 'href="../stylesheets/site-50eaa978.css"'
|
||||
And the file "other/index.html" should contain 'href="../stylesheets/site-7474cadd.css"'
|
||||
And the file "other/index.html" should contain 'src="../javascripts/application-1d8d5276.js"'
|
||||
And the file "other/index.html" should contain 'src="../images/100px-5fd6fb90.jpg"'
|
||||
|
||||
|
@ -38,32 +41,35 @@ Feature: Assets get a file hash appended to their and references to them are upd
|
|||
Given the Server is running at "asset-hash-app"
|
||||
When I go to "/"
|
||||
Then I should see 'href="apple-touch-icon.png"'
|
||||
And I should see 'href="stylesheets/site-50eaa978.css"'
|
||||
And I should see 'href="stylesheets/site-7474cadd.css"'
|
||||
And I should see 'src="javascripts/application-1d8d5276.js"'
|
||||
And I should see 'src="images/100px-5fd6fb90.jpg"'
|
||||
When I go to "/subdir/"
|
||||
Then I should see 'href="../stylesheets/site-50eaa978.css"'
|
||||
Then I should see 'href="../stylesheets/site-7474cadd.css"'
|
||||
And I should see 'src="../javascripts/application-1d8d5276.js"'
|
||||
And I should see 'src="../images/100px-5fd6fb90.jpg"'
|
||||
When I go to "/other/"
|
||||
Then I should see 'href="../stylesheets/site-50eaa978.css"'
|
||||
Then I should see 'href="../stylesheets/site-7474cadd.css"'
|
||||
And I should see 'src="../javascripts/application-1d8d5276.js"'
|
||||
And I should see 'src="../images/100px-5fd6fb90.jpg"'
|
||||
When I go to "/javascripts/application-1d8d5276.js"
|
||||
Then I should see "img.src = '/images/100px-5fd6fb90.jpg'"
|
||||
When I go to "/stylesheets/site-50eaa978.css"
|
||||
Then I should see "background-image: url('../images/100px-5fd6fb90.jpg')"
|
||||
When I go to "/stylesheets/site-7474cadd.css"
|
||||
Then I should see:
|
||||
"""
|
||||
background-image: url("../images/100px-5fd6fb90.jpg")
|
||||
"""
|
||||
|
||||
Scenario: Enabling an asset host still produces hashed files and references
|
||||
Given the Server is running at "asset-hash-host-app"
|
||||
When I go to "/"
|
||||
Then I should see 'href="http://middlemanapp.com/stylesheets/site-54baaf3a.css"'
|
||||
Then I should see 'href="http://middlemanapp.com/stylesheets/site-1fdf4fb5.css"'
|
||||
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
|
||||
When I go to "/subdir/"
|
||||
Then I should see 'href="http://middlemanapp.com/stylesheets/site-54baaf3a.css"'
|
||||
Then I should see 'href="http://middlemanapp.com/stylesheets/site-1fdf4fb5.css"'
|
||||
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
|
||||
When I go to "/other/"
|
||||
Then I should see 'href="http://middlemanapp.com/stylesheets/site-54baaf3a.css"'
|
||||
Then I should see 'href="http://middlemanapp.com/stylesheets/site-1fdf4fb5.css"'
|
||||
And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
|
||||
# Asset helpers don't appear to work from Compass right now
|
||||
# When I go to "/stylesheets/site-e5a31a3e.css"
|
||||
|
@ -98,11 +104,11 @@ Feature: Assets get a file hash appended to their and references to them are upd
|
|||
"""
|
||||
Given the Server is running at "asset-hash-app"
|
||||
When I go to "/"
|
||||
Then I should see 'href="stylesheets/site-5770af52.css'
|
||||
When I go to "stylesheets/site-5770af52.css"
|
||||
Then I should see 'href="stylesheets/site-ac2166fd.css'
|
||||
When I go to "stylesheets/site-ac2166fd.css"
|
||||
Then I should see 'background-image'
|
||||
Then I should see 'Added by Rack filter'
|
||||
When I go to "stylesheets/site-50eaa978.css"
|
||||
When I go to "stylesheets/site-7474cadd.css"
|
||||
Then I should see 'Not Found'
|
||||
|
||||
Scenario: Hashed-asset files are not produced for ignored paths
|
||||
|
@ -137,7 +143,7 @@ Feature: Assets get a file hash appended to their and references to them are upd
|
|||
| images/100px-5fd6fb90.jpg |
|
||||
| images/100px-5fd6fb90.gif |
|
||||
| javascripts/application-1d8d5276.js |
|
||||
| stylesheets/site-50eaa978.css |
|
||||
| stylesheets/site-7474cadd.css |
|
||||
|
||||
# @wip Currently broken, we should move all asset-host functionality out of Compass and into something more similar to asset_hash with Rack-based rewrites
|
||||
# Scenario: Enabling an asset host and referencing assets in CSS with URL fragments are rewritten correctly
|
||||
|
|
|
@ -2,34 +2,6 @@ Feature: Alternate between multiple asset hosts
|
|||
In order to speed up page loading
|
||||
|
||||
Scenario: Set single host globally
|
||||
Given a fixture app "asset-host-app"
|
||||
And a file named "config.rb" with:
|
||||
"""
|
||||
activate :asset_host
|
||||
set :asset_host, "http://assets1.example.com"
|
||||
"""
|
||||
And the Server is running
|
||||
When I go to "/asset_host.html"
|
||||
Then I should see "http://assets1"
|
||||
When I go to "/stylesheets/asset_host.css"
|
||||
Then I should see "http://assets1"
|
||||
|
||||
Scenario: Set proc host globally
|
||||
Given a fixture app "asset-host-app"
|
||||
And a file named "config.rb" with:
|
||||
"""
|
||||
activate :asset_host
|
||||
set :asset_host do |asset|
|
||||
"http://assets%d.example.com" % (asset.hash % 4)
|
||||
end
|
||||
"""
|
||||
And the Server is running
|
||||
When I go to "/asset_host.html"
|
||||
Then I should see "http://assets"
|
||||
When I go to "/stylesheets/asset_host.css"
|
||||
Then I should see "http://assets"
|
||||
|
||||
Scenario: Set single host with inline-option
|
||||
Given a fixture app "asset-host-app"
|
||||
And a file named "config.rb" with:
|
||||
"""
|
||||
|
@ -41,6 +13,20 @@ Feature: Alternate between multiple asset hosts
|
|||
When I go to "/stylesheets/asset_host.css"
|
||||
Then I should see "http://assets1"
|
||||
|
||||
Scenario: Set single host with inline-option
|
||||
Given a fixture app "asset-host-app"
|
||||
And a file named "config.rb" with:
|
||||
"""
|
||||
activate :asset_host, host: "http://assets1.example.com"
|
||||
"""
|
||||
And the Server is running
|
||||
When I go to "/asset_host.html"
|
||||
Then I should see content matching %r{http://assets1.example.com/}
|
||||
Then I should not see content matching %r{http://assets1.example.com//}
|
||||
When I go to "/stylesheets/asset_host.css"
|
||||
Then I should see content matching %r{http://assets1.example.com/}
|
||||
Then I should not see content matching %r{http://assets1.example.com//}
|
||||
|
||||
Scenario: Set proc host with inline-option
|
||||
Given a fixture app "asset-host-app"
|
||||
And a file named "config.rb" with:
|
||||
|
@ -51,6 +37,8 @@ Feature: Alternate between multiple asset hosts
|
|||
"""
|
||||
And the Server is running
|
||||
When I go to "/asset_host.html"
|
||||
Then I should see "http://assets"
|
||||
Then I should see content matching %r{http://assets1.example.com/}
|
||||
Then I should not see content matching %r{http://assets1.example.com//}
|
||||
When I go to "/stylesheets/asset_host.css"
|
||||
Then I should see "http://assets"
|
||||
Then I should see content matching %r{http://assets1.example.com/}
|
||||
Then I should not see content matching %r{http://assets1.example.com//}
|
|
@ -5,7 +5,7 @@ Feature: Generate mtime-based query string for busting browser caches
|
|||
Given "cache_buster" feature is "disabled"
|
||||
And the Server is running at "cache-buster-app"
|
||||
When I go to "/stylesheets/relative_assets.css"
|
||||
Then I should see "blank.gif'"
|
||||
Then I should see 'blank.gif"'
|
||||
|
||||
Scenario: Rendering html with the feature disabled
|
||||
Given "cache_buster" feature is "disabled"
|
||||
|
|
|
@ -8,7 +8,7 @@ Feature: Minify CSS
|
|||
"""
|
||||
And the Server is running at "minify-css-app"
|
||||
When I go to "/stylesheets/site.css"
|
||||
Then I should see "50" lines
|
||||
Then I should see "7" lines
|
||||
And I should see "only screen and (device-width"
|
||||
|
||||
Scenario: Rendering external css with the feature enabled
|
||||
|
@ -40,7 +40,7 @@ Feature: Minify CSS
|
|||
"""
|
||||
And the Server is running at "passthrough-app"
|
||||
When I go to "/stylesheets/site.css"
|
||||
Then I should see "46" lines
|
||||
Then I should see "5" lines
|
||||
|
||||
Scenario: Rendering inline css with the feature disabled
|
||||
Given a fixture app "minify-css-app"
|
||||
|
|
|
@ -6,7 +6,7 @@ Feature: Relative Assets
|
|||
And the Server is running at "relative-assets-app"
|
||||
When I go to "/stylesheets/relative_assets.css"
|
||||
Then I should not see "url('../"
|
||||
And I should see "/images/blank.gif')"
|
||||
And I should see '/images/blank.gif")'
|
||||
|
||||
Scenario: Building css with the feature disabled
|
||||
Given a fixture app "relative-assets-app"
|
||||
|
@ -15,7 +15,7 @@ Feature: Relative Assets
|
|||
"""
|
||||
Given a successfully built app at "relative-assets-app"
|
||||
When I cd to "build"
|
||||
Then the file "stylesheets/relative_assets.css" should contain "url('/images/blank.gif')"
|
||||
Then the file "stylesheets/relative_assets.css" should contain 'url("/images/blank.gif")'
|
||||
|
||||
Scenario: Rendering html with the feature disabled
|
||||
Given "relative_assets" feature is "disabled"
|
||||
|
@ -27,7 +27,9 @@ Feature: Relative Assets
|
|||
Given "relative_assets" feature is "enabled"
|
||||
And the Server is running at "relative-assets-app"
|
||||
When I go to "/stylesheets/relative_assets.css"
|
||||
Then I should see "url('../images/blank.gif"
|
||||
Then I should see 'url("../images/blank.gif'
|
||||
When I go to "/javascripts/application.js"
|
||||
Then I should not see "../"
|
||||
|
||||
Scenario: Building css with the feature enabled
|
||||
Given a fixture app "relative-assets-app"
|
||||
|
@ -37,7 +39,8 @@ Feature: Relative Assets
|
|||
"""
|
||||
Given a successfully built app at "relative-assets-app"
|
||||
When I cd to "build"
|
||||
Then the file "stylesheets/relative_assets.css" should contain "url('../images/blank.gif')"
|
||||
Then the file "stylesheets/relative_assets.css" should contain 'url("../images/blank.gif")'
|
||||
Then the file "javascripts/application.js" should not contain "../"
|
||||
|
||||
Scenario: Relative css reference with directory indexes
|
||||
Given a fixture app "relative-assets-app"
|
||||
|
@ -57,48 +60,18 @@ Feature: Relative Assets
|
|||
Then I should not see "/images/blank.gif"
|
||||
And I should see "images/blank.gif"
|
||||
|
||||
Scenario: Rendering css with a custom images_dir
|
||||
Given "relative_assets" feature is "enabled"
|
||||
And "images_dir" is set to "img"
|
||||
And the Server is running at "relative-assets-app"
|
||||
When I go to "/stylesheets/relative_assets.css"
|
||||
Then I should see "url('../img/blank.gif')"
|
||||
|
||||
Scenario: Building css with a custom images_dir
|
||||
Given a fixture app "relative-assets-app"
|
||||
And a file named "config.rb" with:
|
||||
"""
|
||||
set :images_dir, "img"
|
||||
activate :relative_assets
|
||||
"""
|
||||
Given a successfully built app at "relative-assets-app"
|
||||
When I cd to "build"
|
||||
Then the file "stylesheets/relative_assets.css" should contain "url('../img/blank.gif')"
|
||||
|
||||
Scenario: Rendering html with a custom images_dir
|
||||
Given "relative_assets" feature is "enabled"
|
||||
And "images_dir" is set to "img"
|
||||
And the Server is running at "relative-assets-app"
|
||||
When I go to "/relative_image.html"
|
||||
Then I should not see "/images/blank.gif"
|
||||
Then I should not see "/img/blank.gif"
|
||||
And I should see "img/blank.gif"
|
||||
|
||||
Scenario: Rendering scss with the feature enabled
|
||||
Given "relative_assets" feature is "enabled"
|
||||
And the Server is running at "fonts-app"
|
||||
When I go to "/stylesheets/fonts.css"
|
||||
Then I should see "url('../fonts/StMarie-Thin.otf"
|
||||
And I should see "url('../fonts/blank/blank.otf"
|
||||
|
||||
Scenario: Rendering scss with the feature enabled and a custom fonts_dir
|
||||
Given "relative_assets" feature is "enabled"
|
||||
And "fonts_dir" is set to "otf"
|
||||
And the Server is running at "fonts-app"
|
||||
When I go to "/stylesheets/fonts.css"
|
||||
Then I should not see "url('../fonts/StMarie-Thin.otf"
|
||||
And I should see "url('../otf/StMarie-Thin.otf"
|
||||
And I should see "url('../otf/blank/blank.otf"
|
||||
Then I should see:
|
||||
"""
|
||||
url("../fonts/StMarie-Thin.otf"
|
||||
"""
|
||||
And I should see:
|
||||
"""
|
||||
url("../fonts/blank/blank.otf"
|
||||
"""
|
||||
|
||||
Scenario: Building scss with the feature enabled
|
||||
Given a fixture app "fonts-app"
|
||||
|
@ -108,21 +81,14 @@ Feature: Relative Assets
|
|||
"""
|
||||
Given a successfully built app at "fonts-app"
|
||||
When I cd to "build"
|
||||
Then the file "stylesheets/fonts.css" should contain "url('../fonts/StMarie-Thin.otf')"
|
||||
And the file "stylesheets/fonts.css" should contain "url('../fonts/blank/blank.otf')"
|
||||
|
||||
Scenario: Building scss with the feature enabled and a custom fonts_dir
|
||||
Given a fixture app "fonts-app"
|
||||
And a file named "config.rb" with:
|
||||
Then the file "stylesheets/fonts.css" should contain:
|
||||
"""
|
||||
set :fonts_dir, "otf"
|
||||
activate :relative_assets
|
||||
url("../fonts/StMarie-Thin.otf")
|
||||
"""
|
||||
And the file "stylesheets/fonts.css" should contain:
|
||||
"""
|
||||
url("../fonts/blank/blank.otf")
|
||||
"""
|
||||
Given a successfully built app at "fonts-app"
|
||||
When I cd to "build"
|
||||
Then the file "stylesheets/fonts.css" should not contain "url('../fonts/StMarie-Thin.otf')"
|
||||
And the file "stylesheets/fonts.css" should contain "url('../otf/StMarie-Thin.otf')"
|
||||
And the file "stylesheets/fonts.css" should contain "url('../otf/blank/blank.otf')"
|
||||
|
||||
Scenario: Relative assets via image_tag
|
||||
Given a fixture app "relative-assets-app"
|
||||
|
|
|
@ -24,6 +24,8 @@ Feature: Support slim templating language
|
|||
Given an empty app
|
||||
And a file named "config.rb" with:
|
||||
"""
|
||||
require 'middleman-compass'
|
||||
activate :compass
|
||||
"""
|
||||
And a file named "source/scss.html.slim" with:
|
||||
"""
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
ENV["TEST"] = "true"
|
||||
ENV["AUTOLOAD_SPROCKETS"] = "false"
|
||||
ENV["AUTOLOAD_SPROCKETS"] ||= "false"
|
||||
ENV["AUTOLOAD_COMPASS"] ||= "false"
|
||||
|
||||
require 'simplecov'
|
||||
SimpleCov.root(File.expand_path(File.dirname(__FILE__) + '/../..'))
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
|
||||
activate :asset_hash
|
||||
activate :directory_indexes
|
||||
activate :asset_host
|
||||
|
||||
set :asset_host, 'http://middlemanapp.com'
|
||||
activate :asset_host, host: 'http://middlemanapp.com'
|
||||
|
|
|
@ -1 +1,20 @@
|
|||
<%= image_tag "blank.gif" %>
|
||||
<%= image_tag "blank0.gif" %>
|
||||
<%= image_tag "blank1.gif" %>
|
||||
<%= image_tag "blank2.gif" %>
|
||||
<%= image_tag "blank3.gif" %>
|
||||
<%= image_tag "blank4.gif" %>
|
||||
<%= image_tag "blank10.gif" %>
|
||||
<%= image_tag "blank21.gif" %>
|
||||
<%= image_tag "blank32.gif" %>
|
||||
<%= image_tag "blank43.gif" %>
|
||||
<%= image_tag "blank54.gif" %>
|
||||
<%= image_tag "blank20.gif" %>
|
||||
<%= image_tag "blank21.gif" %>
|
||||
<%= image_tag "blank22.gif" %>
|
||||
<%= image_tag "blank23.gif" %>
|
||||
<%= image_tag "blank24.gif" %>
|
||||
<%= image_tag "blank30.gif" %>
|
||||
<%= image_tag "blank31.gif" %>
|
||||
<%= image_tag "blank32.gif" %>
|
||||
<%= image_tag "blank33.gif" %>
|
||||
<%= image_tag "blank34.gif" %>
|
|
@ -1,3 +1,48 @@
|
|||
@import "compass"
|
||||
h1
|
||||
background: image-url("blank.gif")
|
||||
background: image-url("blank1.gif")
|
||||
h2
|
||||
background: image-url("blank2.gif")
|
||||
h3
|
||||
background: image-url("blank3.gif")
|
||||
h4
|
||||
background: image-url("blank4.gif")
|
||||
h5
|
||||
background: image-url("blank5.gif")
|
||||
h6
|
||||
background: image-url("blank6.gif")
|
||||
h7
|
||||
background: image-url("blank7.gif")
|
||||
h8
|
||||
background: image-url("blank8.gif")
|
||||
h11
|
||||
background: image-url("blank11.gif")
|
||||
h12
|
||||
background: image-url("blank21.gif")
|
||||
h13
|
||||
background: image-url("blank31.gif")
|
||||
h14
|
||||
background: image-url("blank41.gif")
|
||||
h15
|
||||
background: image-url("blank51.gif")
|
||||
h16
|
||||
background: image-url("blank61.gif")
|
||||
h17
|
||||
background: image-url("blank71.gif")
|
||||
h18
|
||||
background: image-url("blank81.gif")
|
||||
h21
|
||||
background: image-url("blank12.gif")
|
||||
h22
|
||||
background: image-url("blank22.gif")
|
||||
h23
|
||||
background: image-url("blank32.gif")
|
||||
h24
|
||||
background: image-url("blank42.gif")
|
||||
h25
|
||||
background: image-url("blank52.gif")
|
||||
h26
|
||||
background: image-url("blank62.gif")
|
||||
h27
|
||||
background: image-url("blank72.gif")
|
||||
h28
|
||||
background: image-url("blank82.gif")
|
|
@ -1,3 +1,2 @@
|
|||
@import "compass"
|
||||
h1
|
||||
background: image-url("blank.gif")
|
|
@ -1 +1,3 @@
|
|||
@import "compass/reset"
|
||||
body {
|
||||
background: white;
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
@font-face {
|
||||
font-family: "St Marie";
|
||||
src: url("/fonts/StMarie-Thin.otf") format('opentype'); }
|
||||
@font-face {
|
||||
font-family: "St Marie";
|
||||
src: url("/fonts/blank/blank.otf") format('opentype'); }
|
|
@ -1,4 +1,6 @@
|
|||
@import "compass/reset"
|
||||
body
|
||||
margin: 0px
|
||||
padding: 0px
|
||||
|
||||
@media handheld, only screen and (device-width: 768px)
|
||||
body
|
||||
|
|
|
@ -1 +1,5 @@
|
|||
@import "compass/reset"
|
||||
body
|
||||
padding: 0px
|
||||
margin: 0
|
||||
div
|
||||
background: white
|
|
@ -1,3 +1,2 @@
|
|||
@import "compass"
|
||||
h1
|
||||
background: image-url("blank.gif")
|
||||
background: url("images/blank.gif")
|
|
@ -0,0 +1,8 @@
|
|||
function foo() {
|
||||
var img = document.createElement('img');
|
||||
img.src = '/images/100px.jpg';
|
||||
var body = document.getElementsByTagName('body')[0];
|
||||
body.insertBefore(img, body.firstChild);
|
||||
}
|
||||
|
||||
window.onload = foo;
|
|
@ -1,3 +1,2 @@
|
|||
@import "compass"
|
||||
h1
|
||||
background: image-url("blank.gif")
|
||||
background: url("/images/blank.gif")
|
||||
|
|
|
@ -1 +1,3 @@
|
|||
@import "compass/reset";
|
||||
html, body {
|
||||
width: 100%;
|
||||
}
|
|
@ -32,14 +32,6 @@ Middleman::Extensions.register :default_helpers, auto_activate: :before_configur
|
|||
Middleman::CoreExtensions::DefaultHelpers
|
||||
end
|
||||
|
||||
# Compass framework
|
||||
begin
|
||||
require 'middleman-core/core_extensions/compass'
|
||||
Middleman::Extensions.register :compass, Middleman::CoreExtensions::Compass, auto_activate: :before_configuration
|
||||
rescue LoadError
|
||||
# Compass is not available, don't complain about it
|
||||
end
|
||||
|
||||
# Lorem provides a handful of helpful prototyping methods to generate
|
||||
# words, paragraphs, fake images, names and email addresses.
|
||||
Middleman::Extensions.register :lorem, auto_activate: :before_configuration do
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
require 'middleman-core/renderers/sass'
|
||||
require 'compass'
|
||||
|
||||
class Middleman::CoreExtensions::Compass < ::Middleman::Extension
|
||||
def initialize(app, options_hash={}, &block)
|
||||
super
|
||||
|
||||
# Hooks to manually update the compass config after we're
|
||||
# done with it
|
||||
app.define_hook :compass_config
|
||||
|
||||
# Location of SASS/SCSS files external to source directory.
|
||||
# @return [Array]
|
||||
# config[:sass_assets_paths] = ["#{root}/assets/sass/", "/path/2/external/sass/repository/"]
|
||||
app.config.define_setting :sass_assets_paths, [], 'Paths to extra SASS/SCSS files'
|
||||
end
|
||||
|
||||
def after_configuration
|
||||
::Compass.configuration do |compass_config|
|
||||
compass_config.project_path = app.source_dir
|
||||
compass_config.environment = :development
|
||||
compass_config.cache = false
|
||||
compass_config.sass_dir = app.config[:css_dir]
|
||||
compass_config.css_dir = app.config[:css_dir]
|
||||
compass_config.javascripts_dir = app.config[:js_dir]
|
||||
compass_config.fonts_dir = app.config[:fonts_dir]
|
||||
compass_config.images_dir = app.config[:images_dir]
|
||||
compass_config.http_path = app.config[:http_prefix]
|
||||
|
||||
app.config[:sass_assets_paths].each do |path|
|
||||
compass_config.add_import_path path
|
||||
end
|
||||
|
||||
# Disable this initially, the cache_buster extension will
|
||||
# re-enable it if requested.
|
||||
compass_config.asset_cache_buster { |_| nil }
|
||||
|
||||
# Disable this initially, the relative_assets extension will
|
||||
|
||||
compass_config.relative_assets = false
|
||||
|
||||
# Default output style
|
||||
compass_config.output_style = :nested
|
||||
|
||||
# No line-comments in test mode (changing paths mess with sha1)
|
||||
compass_config.line_comments = false if ENV['TEST']
|
||||
end
|
||||
|
||||
# Call hook
|
||||
app.run_hook_for :compass_config, app, ::Compass.configuration
|
||||
|
||||
# Tell Tilt to use it as well (for inline sass blocks)
|
||||
::Tilt.register 'sass', CompassSassTemplate
|
||||
::Tilt.prefer(CompassSassTemplate)
|
||||
|
||||
# Tell Tilt to use it as well (for inline scss blocks)
|
||||
::Tilt.register 'scss', CompassScssTemplate
|
||||
::Tilt.prefer(CompassScssTemplate)
|
||||
end
|
||||
|
||||
# A Compass Sass template for Tilt, adding our options in
|
||||
class CompassSassTemplate < ::Middleman::Renderers::Sass::SassPlusCSSFilenameTemplate
|
||||
def sass_options
|
||||
super.merge(::Compass.configuration.to_sass_engine_options)
|
||||
end
|
||||
end
|
||||
|
||||
# A Compass Scss template for Tilt, adding our options in
|
||||
class CompassScssTemplate < ::Middleman::Renderers::Sass::ScssPlusCSSFilenameTemplate
|
||||
def sass_options
|
||||
super.merge(::Compass.configuration.to_sass_engine_options)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -162,27 +162,7 @@ class Middleman::CoreExtensions::DefaultHelpers < ::Middleman::Extension
|
|||
# @param [Hash] options Data to pass through.
|
||||
# @return [String]
|
||||
def asset_path(kind, source, options={})
|
||||
return source if source.to_s.include?('//') || source.to_s.start_with?('data:')
|
||||
|
||||
asset_folder = case kind
|
||||
when :css
|
||||
config[:css_dir]
|
||||
when :js
|
||||
config[:js_dir]
|
||||
when :images
|
||||
config[:images_dir]
|
||||
when :fonts
|
||||
config[:fonts_dir]
|
||||
else
|
||||
kind.to_s
|
||||
end
|
||||
|
||||
source = source.to_s.tr(' ', '')
|
||||
ignore_extension = (kind == :images || kind == :fonts) # don't append extension
|
||||
source << ".#{kind}" unless ignore_extension || source.end_with?(".#{kind}")
|
||||
asset_folder = '' if source.start_with?('/') # absolute path
|
||||
|
||||
asset_url(source, asset_folder, options)
|
||||
::Middleman::Util.asset_path(app, kind, source, options)
|
||||
end
|
||||
|
||||
# Get the URL of an asset given a type/prefix
|
||||
|
@ -190,22 +170,8 @@ class Middleman::CoreExtensions::DefaultHelpers < ::Middleman::Extension
|
|||
# @param [String] path The path (such as "photo.jpg")
|
||||
# @param [String] prefix The type prefix (such as "images")
|
||||
# @return [String] The fully qualified asset url
|
||||
def asset_url(path, prefix='', _)
|
||||
# Don't touch assets which already have a full path
|
||||
if path.include?('//') || path.start_with?('data:')
|
||||
path
|
||||
else # rewrite paths to use their destination path
|
||||
if resource = sitemap.find_resource_by_destination_path(url_for(path))
|
||||
resource.url
|
||||
else
|
||||
path = File.join(prefix, path)
|
||||
if resource = sitemap.find_resource_by_path(path)
|
||||
resource.url
|
||||
else
|
||||
File.join(config[:http_prefix], path)
|
||||
end
|
||||
end
|
||||
end
|
||||
def asset_url(path, prefix='', options={})
|
||||
::Middleman::Util.asset_url(app, prefix, options)
|
||||
end
|
||||
|
||||
# Given a source path (referenced either absolutely or relatively)
|
||||
|
|
|
@ -14,6 +14,12 @@ module Middleman
|
|||
app.define_hook :build_config
|
||||
app.define_hook :development_config
|
||||
|
||||
app.config.define_setting :autoload_sprockets, true, 'Automatically load sprockets at startup?'
|
||||
app.config[:autoload_sprockets] = (ENV['AUTOLOAD_SPROCKETS'] == 'true') if ENV['AUTOLOAD_SPROCKETS']
|
||||
|
||||
app.config.define_setting :autoload_compass, true, 'Automatically load compass at startup?'
|
||||
app.config[:autoload_compass] = (ENV['AUTOLOAD_COMPASS'] == 'true') if ENV['AUTOLOAD_COMPASS']
|
||||
|
||||
app.extend ClassMethods
|
||||
app.delegate :configure, to: :"self.class"
|
||||
end
|
||||
|
@ -90,7 +96,7 @@ module Middleman
|
|||
activate ext_name
|
||||
end
|
||||
|
||||
if ENV['AUTOLOAD_SPROCKETS'] != 'false'
|
||||
if config[:autoload_sprockets]
|
||||
begin
|
||||
require 'middleman-sprockets'
|
||||
activate :sprockets
|
||||
|
@ -99,6 +105,15 @@ module Middleman
|
|||
end
|
||||
end
|
||||
|
||||
if config[:autoload_compass]
|
||||
begin
|
||||
require 'middleman-compass'
|
||||
activate :compass
|
||||
rescue LoadError
|
||||
# Compass is not available, don't complain about it
|
||||
end
|
||||
end
|
||||
|
||||
# Evaluate a passed block if given
|
||||
config_context.instance_exec(&block) if block_given?
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ class Middleman::Extensions::AssetHash < ::Middleman::Extension
|
|||
:proc => method(:rewrite_url)
|
||||
end
|
||||
|
||||
def rewrite_url(asset_path, dirpath)
|
||||
def rewrite_url(asset_path, dirpath, request_path)
|
||||
relative_path = Pathname.new(asset_path).relative?
|
||||
|
||||
full_asset_path = if relative_path
|
||||
|
|
|
@ -1,51 +1,41 @@
|
|||
|
||||
# Asset Host module
|
||||
class Middleman::Extensions::AssetHost < ::Middleman::Extension
|
||||
option :host, nil, 'The asset host to use, or false for no asset host, or a Proc to determine asset host'
|
||||
option :host, nil, 'The asset host to use or a Proc to determine asset host'
|
||||
option :exts, %w(.css .png .jpg .jpeg .svg .svgz .js .gif), 'List of extensions that get cache busters strings appended to them.'
|
||||
option :sources, %w(.htm .html .php .css .js), 'List of extensions that are searched for bustable assets.'
|
||||
option :ignore, [], 'Regexes of filenames to skip adding query strings to'
|
||||
|
||||
def initialize(app, options_hash={}, &block)
|
||||
super
|
||||
|
||||
# Backwards compatible API
|
||||
app.config.define_setting :asset_host, nil, 'The asset host to use, or false for no asset host, or a Proc to determine asset host'
|
||||
require 'middleman-core/middleware/inline_url_rewriter'
|
||||
end
|
||||
|
||||
app.compass_config do |config|
|
||||
if asset_host = extensions[:asset_host].host
|
||||
if asset_host.is_a?(Proc)
|
||||
config.asset_host(&asset_host)
|
||||
def after_configuration
|
||||
app.use ::Middleman::Middleware::InlineURLRewriter,
|
||||
:id => :asset_host,
|
||||
:url_extensions => options.exts,
|
||||
:source_extensions => options.sources,
|
||||
:ignore => options.ignore,
|
||||
:middleman_app => app,
|
||||
:proc => method(:rewrite_url)
|
||||
end
|
||||
|
||||
def rewrite_url(asset_path, dirpath, request_path)
|
||||
relative_path = Pathname.new(asset_path).relative?
|
||||
|
||||
full_asset_path = if relative_path
|
||||
dirpath.join(asset_path).to_s
|
||||
else
|
||||
config.asset_host do |_|
|
||||
asset_host
|
||||
end
|
||||
end
|
||||
end
|
||||
end if app.respond_to?(:compass_config)
|
||||
asset_path
|
||||
end
|
||||
|
||||
def host
|
||||
app.config[:asset_host] || options[:host]
|
||||
asset_prefix = if options[:host].is_a?(Proc)
|
||||
options[:host].call(full_asset_path)
|
||||
elsif options[:host].is_a?(String)
|
||||
options[:host]
|
||||
end
|
||||
|
||||
helpers do
|
||||
# Override default asset url helper to include asset hosts
|
||||
#
|
||||
# @param [String] path
|
||||
# @param [String] prefix
|
||||
# @param [Hash] options Data to pass through.
|
||||
# @return [String]
|
||||
def asset_url(path, prefix='', options={})
|
||||
controller = extensions[:asset_host]
|
||||
|
||||
original_output = super
|
||||
return original_output unless controller.host
|
||||
|
||||
asset_prefix = if controller.host.is_a?(Proc)
|
||||
controller.host.call(original_output)
|
||||
elsif controller.host.is_a?(String)
|
||||
controller.host
|
||||
end
|
||||
|
||||
File.join(asset_prefix, original_output)
|
||||
end
|
||||
File.join(asset_prefix, full_asset_path)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,56 +1,26 @@
|
|||
# The Cache Buster extension
|
||||
class Middleman::Extensions::CacheBuster < ::Middleman::Extension
|
||||
option :exts, %w(.css .png .jpg .jpeg .svg .svgz .js .gif), 'List of extensions that get cache busters strings appended to them.'
|
||||
option :sources, %w(.htm .html .php .css .js), 'List of extensions that are searched for bustable assets.'
|
||||
option :ignore, [], 'Regexes of filenames to skip adding query strings to'
|
||||
|
||||
def initialize(app, options_hash={}, &block)
|
||||
super
|
||||
|
||||
# After compass is setup, make it use the registered cache buster
|
||||
app.compass_config do |config|
|
||||
config.asset_cache_buster do |path, real_path|
|
||||
real_path = real_path.path if real_path.is_a? File
|
||||
real_path = real_path.gsub(File.join(app.root, app.config[:build_dir]), app.config[:source])
|
||||
if File.readable?(real_path)
|
||||
File.mtime(real_path).strftime('%s')
|
||||
else
|
||||
logger.warn "WARNING: '#{File.basename(path)}' was not found (or cannot be read) in #{File.dirname(real_path)}"
|
||||
end
|
||||
end
|
||||
end if app.respond_to?(:compass_config)
|
||||
require 'middleman-core/middleware/inline_url_rewriter'
|
||||
end
|
||||
|
||||
helpers do
|
||||
# asset_url override if we're using cache busting
|
||||
# @param [String] path
|
||||
# @param [String] prefix
|
||||
# @param [Hash] options Data to pass through.
|
||||
def asset_url(path, prefix='', options={})
|
||||
http_path = super
|
||||
|
||||
if http_path.include?('://') || !%w(.css .png .jpg .jpeg .svg .svgz .js .gif).include?(File.extname(http_path))
|
||||
http_path
|
||||
else
|
||||
if respond_to?(:http_images_path) && prefix == http_images_path
|
||||
prefix = images_dir
|
||||
def after_configuration
|
||||
app.use ::Middleman::Middleware::InlineURLRewriter,
|
||||
:id => :cache_buster,
|
||||
:url_extensions => options.exts,
|
||||
:source_extensions => options.sources,
|
||||
:ignore => options.ignore,
|
||||
:middleman_app => app,
|
||||
:proc => method(:rewrite_url)
|
||||
end
|
||||
|
||||
real_path_static = File.join(prefix, path)
|
||||
|
||||
if build?
|
||||
real_path_dynamic = File.join(config[:build_dir], prefix, path)
|
||||
real_path_dynamic = File.expand_path(real_path_dynamic, root)
|
||||
http_path << '?' + File.mtime(real_path_dynamic).strftime('%s') if File.readable?(real_path_dynamic)
|
||||
elsif resource = sitemap.find_resource_by_path(real_path_static)
|
||||
if !resource.template?
|
||||
http_path << '?' + File.mtime(resource.source_file).strftime('%s')
|
||||
else
|
||||
# It's a template, possible with partials. We can't really
|
||||
# know when it's updated, so generate fresh cache buster every
|
||||
# time during developement
|
||||
http_path << '?' + Time.now.strftime('%s')
|
||||
end
|
||||
end
|
||||
|
||||
http_path
|
||||
end
|
||||
end
|
||||
def rewrite_url(asset_path, dirpath, request_path)
|
||||
asset_path + '?' + Time.now.strftime('%s')
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,31 +1,37 @@
|
|||
# Relative Assets extension
|
||||
class Middleman::Extensions::RelativeAssets < ::Middleman::Extension
|
||||
option :exts, %w(.css .png .jpg .jpeg .svg .svgz .js .gif .ttf .otf .woff), 'List of extensions that get cache busters strings appended to them.'
|
||||
option :sources, %w(.htm .html .css), 'List of extensions that are searched for relative assets.'
|
||||
option :ignore, [], 'Regexes of filenames to skip adding query strings to'
|
||||
|
||||
def initialize(app, options_hash={}, &block)
|
||||
super
|
||||
|
||||
# After compass is setup, make it use the registered cache buster
|
||||
app.compass_config do |config|
|
||||
config.relative_assets = true
|
||||
end if app.respond_to?(:compass_config)
|
||||
require 'middleman-core/middleware/inline_url_rewriter'
|
||||
end
|
||||
|
||||
helpers do
|
||||
# asset_url override for relative assets
|
||||
# @param [String] path
|
||||
# @param [String] prefix
|
||||
# @param [Hash] options Data to pass through.
|
||||
# @return [String]
|
||||
def asset_url(path, prefix='', options={})
|
||||
path = super
|
||||
def after_configuration
|
||||
app.use ::Middleman::Middleware::InlineURLRewriter,
|
||||
:id => :asset_hash,
|
||||
:url_extensions => options.exts,
|
||||
:source_extensions => options.sources,
|
||||
:ignore => options.ignore,
|
||||
:middleman_app => app,
|
||||
:proc => method(:rewrite_url)
|
||||
end
|
||||
|
||||
requested_resource = options[:current_resource] || current_resource
|
||||
def rewrite_url(asset_path, dirpath, request_path)
|
||||
relative_path = Pathname.new(asset_path).relative?
|
||||
|
||||
if path.include?('//') || path.start_with?('data:') || !requested_resource
|
||||
path
|
||||
full_asset_path = if relative_path
|
||||
dirpath.join(asset_path).to_s
|
||||
else
|
||||
current_dir = Pathname('/' + requested_resource.destination_path)
|
||||
Pathname(path).relative_path_from(current_dir.dirname).to_s
|
||||
asset_path
|
||||
end
|
||||
|
||||
if !full_asset_path.include?('//') && !asset_path.start_with?('data:')
|
||||
current_dir = Pathname('/' + request_path).dirname
|
||||
Pathname(full_asset_path).relative_path_from(current_dir).to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -49,7 +49,7 @@ module Middleman
|
|||
asset_path
|
||||
end
|
||||
|
||||
@ignore.none? { |r| should_ignore?(r, full_asset_path) } && @proc.call(asset_path, dirpath)
|
||||
@ignore.none? { |r| should_ignore?(r, full_asset_path) } && @proc.call(asset_path, dirpath, path)
|
||||
end
|
||||
|
||||
status, headers, response = ::Rack::Response.new(
|
||||
|
|
|
@ -38,8 +38,13 @@ module Middleman
|
|||
class << self
|
||||
# Once registered
|
||||
def registered(app)
|
||||
opts = { output_style: :nested }
|
||||
opts[:line_comments] = false if ENV['TEST']
|
||||
|
||||
# Default sass options
|
||||
app.config.define_setting :sass, {}, 'Sass engine options'
|
||||
app.config.define_setting :sass, opts, 'Sass engine options'
|
||||
|
||||
app.config.define_setting :sass_assets_paths, [], 'Paths to extra SASS/SCSS files'
|
||||
|
||||
# Tell Tilt to use it as well (for inline sass blocks)
|
||||
::Tilt.register 'sass', SassPlusCSSFilenameTemplate
|
||||
|
@ -50,6 +55,8 @@ module Middleman
|
|||
::Tilt.prefer(ScssPlusCSSFilenameTemplate)
|
||||
|
||||
::Compass::ImportOnce.activate!
|
||||
|
||||
require 'middleman-core/renderers/sass_functions'
|
||||
end
|
||||
|
||||
alias_method :included, :registered
|
||||
|
@ -88,14 +95,22 @@ module Middleman
|
|||
# Change Sass path, for url functions, to the build folder if we're building
|
||||
# @return [Hash]
|
||||
def sass_options
|
||||
more_opts = { filename: eval_file, line: line, syntax: syntax }
|
||||
ctx = ::Middleman::Renderers::Haml.last_haml_scope || @context
|
||||
|
||||
if @context.is_a?(::Middleman::TemplateContext) && file
|
||||
location_of_sass_file = @context.source_dir
|
||||
more_opts = {
|
||||
load_paths: ctx.config[:sass_assets_paths],
|
||||
filename: eval_file,
|
||||
line: line,
|
||||
syntax: syntax,
|
||||
custom: { middleman_context: ctx.app }
|
||||
}
|
||||
|
||||
if ctx.is_a?(::Middleman::TemplateContext) && file
|
||||
location_of_sass_file = ctx.source_dir
|
||||
|
||||
parts = basename.split('.')
|
||||
parts.pop
|
||||
more_opts[:css_filename] = File.join(location_of_sass_file, @context.config[:css_dir], parts.join('.'))
|
||||
more_opts[:css_filename] = File.join(location_of_sass_file, ctx.config[:css_dir], parts.join('.'))
|
||||
end
|
||||
|
||||
options.merge(more_opts)
|
||||
|
|
117
middleman-core/lib/middleman-core/renderers/sass_functions.rb
Normal file
|
@ -0,0 +1,117 @@
|
|||
module Sprockets
|
||||
module Sass
|
||||
module Functions
|
||||
|
||||
# Using Middleman::Util#asset_path, return the full path
|
||||
# for the given +source+ as a Sass String. This supports keyword
|
||||
# arguments that mirror the +options+.
|
||||
#
|
||||
# === Examples
|
||||
#
|
||||
# background: url(image-path("image.jpg")); // background: url("/assets/image.jpg");
|
||||
# background: url(image-path("image.jpg", $digest: true)); // background: url("/assets/image-27a8f1f96afd8d4c67a59eb9447f45bd.jpg");
|
||||
#
|
||||
def image_path(source, options = {})
|
||||
p = ::Middleman::Util.asset_path(middleman_context, :images, source.value, map_options(options))
|
||||
::Sass::Script::String.new p.to_s, :string
|
||||
end
|
||||
|
||||
# Using Middleman::Util#asset_path, return the url CSS
|
||||
# for the given +source+ as a Sass String. This supports keyword
|
||||
# arguments that mirror the +options+.
|
||||
#
|
||||
# === Examples
|
||||
#
|
||||
# background: image-url("image.jpg"); // background: url("/assets/image.jpg");
|
||||
# background: image-url("image.jpg", $digest: true); // background: url("/assets/image-27a8f1f96afd8d4c67a59eb9447f45bd.jpg");
|
||||
#
|
||||
def image_url(source, options = {}, cache_buster = nil)
|
||||
# Work with the Compass #image_url API
|
||||
if options.respond_to? :value
|
||||
case options.value
|
||||
when true
|
||||
return image_path source
|
||||
else
|
||||
options = {}
|
||||
end
|
||||
end
|
||||
::Sass::Script::String.new "url(#{image_path(source, options)})"
|
||||
end
|
||||
|
||||
# Using Middleman::Util#asset_path, return the full path
|
||||
# for the given +source+ as a Sass String. This supports keyword
|
||||
# arguments that mirror the +options+.
|
||||
#
|
||||
# === Examples
|
||||
#
|
||||
# src: url(font-path("font.ttf")); // src: url("/assets/font.ttf");
|
||||
# src: url(font-path("font.ttf", $digest: true)); // src: url("/assets/font-27a8f1f96afd8d4c67a59eb9447f45bd.ttf");
|
||||
#
|
||||
def font_path(source, options = {})
|
||||
p = ::Middleman::Util.asset_path(middleman_context, :fonts, source.value, map_options(options))
|
||||
::Sass::Script::String.new p.to_s, :string
|
||||
end
|
||||
|
||||
# Using Middleman::Util#asset_path, return the url CSS
|
||||
# for the given +source+ as a Sass String. This supports keyword
|
||||
# arguments that mirror the +options+.
|
||||
#
|
||||
# === Examples
|
||||
#
|
||||
# src: font-url("font.ttf"); // src: url("/assets/font.ttf");
|
||||
# src: font-url("image.jpg", $digest: true); // src: url("/assets/font-27a8f1f96afd8d4c67a59eb9447f45bd.ttf");
|
||||
#
|
||||
def font_url(source, options = {})
|
||||
# Work with the Compass #font_url API
|
||||
if options.respond_to? :value
|
||||
case options.value
|
||||
when true
|
||||
return font_path source
|
||||
else
|
||||
options = {}
|
||||
end
|
||||
end
|
||||
::Sass::Script::String.new "url(#{font_path(source, options)})"
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
# Returns a reference to Middleman's context through
|
||||
# the importer.
|
||||
def middleman_context # :nodoc:
|
||||
options[:custom][:middleman_context]
|
||||
end
|
||||
|
||||
# Returns an options hash where the keys are symbolized
|
||||
# and the values are unwrapped Sass literals.
|
||||
def map_options(options = {}) # :nodoc:
|
||||
::Sass::Util.map_hash(options) do |key, value|
|
||||
[key.to_sym, value.respond_to?(:value) ? value.value : value]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module Sass::Script::Functions
|
||||
include Sprockets::Sass::Functions
|
||||
|
||||
# Hack to ensure previous API declarations (by Compass or whatever)
|
||||
# don't take precedence.
|
||||
[:asset_path, :asset_url, :image_path, :image_url, :font_path, :font_url, :asset_data_uri].each do |method|
|
||||
defined?(@signatures) && @signatures.delete(method)
|
||||
end
|
||||
|
||||
declare :asset_path, [:source], :var_kwargs => true
|
||||
declare :asset_path, [:source, :kind]
|
||||
declare :asset_url, [:source], :var_kwargs => true
|
||||
declare :asset_url, [:source, :kind]
|
||||
declare :image_path, [:source], :var_kwargs => true
|
||||
declare :image_url, [:source], :var_kwargs => true
|
||||
declare :image_url, [:source, :only_path]
|
||||
declare :image_url, [:source, :only_path, :cache_buster]
|
||||
declare :font_path, [:source], :var_kwargs => true
|
||||
declare :font_url, [:source], :var_kwargs => true
|
||||
declare :font_url, [:source, :only_path]
|
||||
declare :asset_data_uri, [:source]
|
||||
end
|
|
@ -33,7 +33,7 @@ module Middleman
|
|||
|
||||
app.after_configuration do
|
||||
context_hack = {
|
||||
context: self
|
||||
context: self.template_context_class.new(self)
|
||||
}
|
||||
|
||||
::Slim::Embedded::SassEngine.disable_option_validator!
|
||||
|
|
|
@ -97,6 +97,14 @@ Then /^I should not see "([^\"]*)"$/ do |expected|
|
|||
@last_response.body.should_not include(expected)
|
||||
end
|
||||
|
||||
Then /^I should see content matching %r{(.*)}$/ do |expected|
|
||||
@last_response.body.should match(expected)
|
||||
end
|
||||
|
||||
Then /^I should not see content matching %r{(.*)}$/ do |expected|
|
||||
@last_response.body.should_not match(expected)
|
||||
end
|
||||
|
||||
Then /^I should see "([^\"]*)" lines$/ do |lines|
|
||||
@last_response.body.chomp.split($/).length.should == lines.to_i
|
||||
end
|
||||
|
|
|
@ -37,6 +37,7 @@ module Middleman
|
|||
# Sandboxed class for template eval
|
||||
context = @app.template_context_class.new(@app, locs, opts)
|
||||
|
||||
# TODO: Only for HAML files
|
||||
context.init_haml_helpers if context.respond_to?(:init_haml_helpers)
|
||||
|
||||
# Keep rendering template until we've used up all extensions. This
|
||||
|
|
|
@ -135,6 +135,55 @@ module Middleman
|
|||
end
|
||||
end
|
||||
|
||||
# Get the path of a file of a given type
|
||||
#
|
||||
# @param [Symbol] kind The type of file
|
||||
# @param [String] source The path to the file
|
||||
# @param [Hash] options Data to pass through.
|
||||
# @return [String]
|
||||
def asset_path(app, kind, source, options={})
|
||||
return source if source.to_s.include?('//') || source.to_s.start_with?('data:')
|
||||
|
||||
asset_folder = case kind
|
||||
when :css then app.config[:css_dir]
|
||||
when :js then app.config[:js_dir]
|
||||
when :images then app.config[:images_dir]
|
||||
when :fonts then app.config[:fonts_dir]
|
||||
else kind.to_s
|
||||
end
|
||||
|
||||
source = source.to_s.tr(' ', '')
|
||||
ignore_extension = (kind == :images || kind == :fonts) # don't append extension
|
||||
source << ".#{kind}" unless ignore_extension || source.end_with?(".#{kind}")
|
||||
asset_folder = '' if source.start_with?('/') # absolute path
|
||||
|
||||
asset_url(app, source, asset_folder, options)
|
||||
end
|
||||
|
||||
# Get the URL of an asset given a type/prefix
|
||||
#
|
||||
# @param [String] path The path (such as "photo.jpg")
|
||||
# @param [String] prefix The type prefix (such as "images")
|
||||
# @param [Hash] options Data to pass through.
|
||||
# @return [String] The fully qualified asset url
|
||||
def asset_url(app, path, prefix='', options={})
|
||||
# Don't touch assets which already have a full path
|
||||
if path.include?('//') or path.start_with?('data:')
|
||||
path
|
||||
else # rewrite paths to use their destination path
|
||||
if resource = app.sitemap.find_resource_by_destination_path(url_for(app, path))
|
||||
resource.url
|
||||
else
|
||||
path = File.join(prefix, path)
|
||||
if resource = app.sitemap.find_resource_by_path(path)
|
||||
resource.url
|
||||
else
|
||||
File.join(app.config[:http_prefix], path)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Given a source path (referenced either absolutely or relatively)
|
||||
# or a Resource, this will produce the nice URL configured for that
|
||||
# path, respecting :relative_links, directory indexes, etc.
|
||||
|
|
|
@ -37,4 +37,14 @@ Gem::Specification.new do |s|
|
|||
|
||||
# Automatic Image Sizes
|
||||
s.add_dependency('fastimage', ['~> 1.6.2'])
|
||||
|
||||
# Minify CSS
|
||||
s.add_dependency('sass', ['>= 3.3.4'])
|
||||
|
||||
# Work around Sass performance
|
||||
s.add_dependency('compass-import-once', ['~> 1.0.4'])
|
||||
|
||||
# Minify JS
|
||||
s.add_dependency('uglifier', ['~> 2.5'])
|
||||
s.add_dependency('execjs', ['~> 2.0'])
|
||||
end
|
||||
|
|
|
@ -21,12 +21,8 @@ Gem::Specification.new do |s|
|
|||
s.add_dependency('middleman-core', Middleman::VERSION)
|
||||
s.add_dependency('middleman-cli', Middleman::VERSION)
|
||||
s.add_dependency('middleman-sprockets', '>= 3.1.2')
|
||||
s.add_dependency('middleman-compass', '~> 4.0.0')
|
||||
s.add_dependency('haml', ['>= 4.0.5'])
|
||||
s.add_dependency('sass', ['>= 3.3.4'])
|
||||
s.add_dependency("compass-import-once", ["1.0.4"])
|
||||
s.add_dependency('compass', ['>= 1.0.0.alpha.19'])
|
||||
s.add_dependency('uglifier', ['~> 2.5'])
|
||||
s.add_dependency('coffee-script', ['~> 2.2.0'])
|
||||
s.add_dependency('execjs', ['~> 2.0'])
|
||||
s.add_dependency('kramdown', ['~> 1.2'])
|
||||
end
|
||||
|
|