tipsy 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +6 -11
- data/README.md +24 -1
- data/Rakefile +13 -9
- data/bin/tipsy +4 -2
- data/lib/templates/server/htaccess.erb +14 -0
- data/lib/templates/site/Gemfile +19 -0
- data/lib/templates/site/assets/stylesheets/_config.css.scss +1 -0
- data/lib/templates/site/assets/stylesheets/screen.css.scss +1 -0
- data/lib/templates/site/config.rb +52 -0
- data/lib/templates/site/deploy.yml +27 -0
- data/lib/templates/site/layouts/default.html.erb +41 -0
- data/lib/templates/site/views/index.html.erb +2 -0
- data/lib/tipsy/compressors/{css.rb → css_compressor.rb} +0 -0
- data/lib/tipsy/compressors/javascript_compressor.rb +44 -0
- data/lib/tipsy/configuration.rb +9 -0
- data/lib/tipsy/handler/all.rb +4 -0
- data/lib/tipsy/handler/asset.rb +93 -0
- data/lib/tipsy/handler/erb.rb +42 -0
- data/lib/tipsy/handler/php.rb +36 -0
- data/lib/tipsy/{sass/template.rb → handler/sass/importer.rb} +15 -53
- data/lib/tipsy/handler/sass/resolver.rb +30 -0
- data/lib/tipsy/handler/sass.rb +36 -0
- data/lib/tipsy/handler/static.rb +30 -0
- data/lib/tipsy/helpers/asset_paths.rb +29 -1
- data/lib/tipsy/helpers/asset_tags.rb +1 -1
- data/lib/tipsy/helpers/capture.rb +12 -41
- data/lib/tipsy/helpers/rendering.rb +46 -0
- data/lib/tipsy/helpers/sass.rb +17 -6
- data/lib/tipsy/helpers/tag.rb +6 -9
- data/lib/tipsy/helpers.rb +13 -16
- data/lib/tipsy/runner.rb +82 -0
- data/lib/tipsy/runners/compiler.rb +189 -0
- data/lib/tipsy/runners/deployer.rb +7 -0
- data/lib/tipsy/runners/generator.rb +24 -0
- data/lib/tipsy/server.rb +56 -114
- data/lib/tipsy/site.rb +88 -0
- data/lib/tipsy/utils/logger.rb +47 -0
- data/lib/tipsy/utils/system.rb +115 -0
- data/lib/tipsy/utils/system_test.rb +103 -0
- data/lib/tipsy/version.rb +1 -1
- data/lib/tipsy/view/base.rb +55 -0
- data/lib/tipsy/view/context.rb +28 -0
- data/lib/tipsy/view/path.rb +44 -0
- data/lib/tipsy/view.rb +14 -68
- data/lib/tipsy.rb +30 -67
- data/{lib/tipsy/project/assets/javascripts/site.js → test/fixtures/capture.html.erb} +0 -0
- data/test/helpers/tag_test.rb +22 -0
- data/{lib/tipsy/project/assets/stylesheets/screen.css.scss → test/root/compiled/fake.txt} +0 -0
- data/test/root/{test/assets/javascripts/test.js → compiled/sub-path/fake.txt} +0 -0
- data/test/root/{development/assets/javascripts/test.js → compiled/sub-path-with-skip/fake.txt} +0 -0
- data/test/root/layouts/default.html.erb +0 -0
- data/test/root/views/index.html.erb +0 -0
- data/test/root/views/page.html.erb +0 -0
- data/test/root/views/sub/page.html.erb +0 -0
- data/test/root/views/sub/tertiary/index.html.erb +0 -0
- data/test/runner/compiler_test.rb +49 -0
- data/test/test_helper.rb +160 -21
- data/test/unit/site_test.rb +23 -0
- data/test/unit/tipsy_test.rb +13 -0
- data/test/unit/utils/system_test.rb +26 -0
- data/test/view/base_test.rb +34 -0
- data/test/view/path_test.rb +34 -0
- data/tipsy.gemspec +10 -7
- metadata +113 -84
- data/lib/tipsy/application.rb +0 -86
- data/lib/tipsy/builder.rb +0 -26
- data/lib/tipsy/builders/base.rb +0 -64
- data/lib/tipsy/builders/export.rb +0 -16
- data/lib/tipsy/builders/project.rb +0 -40
- data/lib/tipsy/builders/remote.rb +0 -14
- data/lib/tipsy/compressors/javascript.rb +0 -25
- data/lib/tipsy/logger.rb +0 -62
- data/lib/tipsy/project/Gemfile +0 -8
- data/lib/tipsy/project/config.erb +0 -19
- data/lib/tipsy/project/helpers/site_helper.rb +0 -4
- data/lib/tipsy/project/views/_layout.html.erb +0 -16
- data/test/fixtures/about.html +0 -1
- data/test/fixtures/contact.html +0 -1
- data/test/fixtures/index.html +0 -1
- data/test/functional/page_test.rb +0 -33
- data/test/root/.gitignore +0 -7
- data/test/root/development/assets/stylesheets/screen.css.scss +0 -3
- data/test/root/development/config.rb +0 -6
- data/test/root/development/views/_layout.html.erb +0 -20
- data/test/root/development/views/index.html.erb +0 -3
- data/test/root/test/assets/stylesheets/screen.css.scss +0 -3
- data/test/root/test/config.rb +0 -6
- data/test/root/test/views/_layout.html.erb +0 -1
- data/test/root/test/views/about/index.html +0 -1
- data/test/root/test/views/contact.html +0 -1
- data/test/root/test/views/index.html.erb +0 -1
- data/test/unit/helpers/asset_paths_test.rb +0 -14
- data/test/unit/helpers_test.rb +0 -22
- data/test/unit/server_test.rb +0 -1
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
-
gemspec
|
3
2
|
|
4
|
-
gem
|
5
|
-
|
3
|
+
# Specify your gem's dependencies in tipsy.gemspec
|
4
|
+
gemspec
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
gem 'rack-test'
|
12
|
-
gem 'turn'
|
13
|
-
gem 'minitest'
|
14
|
-
end
|
6
|
+
gem 'compass', '~> 0.12.alpha0'
|
7
|
+
gem 'colored'
|
8
|
+
gem 'rspec'
|
9
|
+
gem 'rspec-expectations'
|
data/README.md
CHANGED
@@ -4,7 +4,30 @@ Tipsy is a small Rack-based server inspired by gems like StaticMatic and Serve.
|
|
4
4
|
Rails-esque style templating and helpers. Various template types are supported via the Tilt gem, and assets are served via Sprockets, essentially giving you
|
5
5
|
a miniture Rails "view-only" environment.
|
6
6
|
|
7
|
+
Any template format Tilt provides should work without much hassle. ERB (via Erubis) is provided. Note Erubis is required to make ERB function properly as
|
8
|
+
we've applied some of the same modifications as Rails, allowing things like block style helpers such as
|
9
|
+
|
10
|
+
<%= capture do %>
|
11
|
+
something
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
which would error normally. By doing so it should make integration with any number of ActionView style helpers fairly simple.
|
15
|
+
|
16
|
+
## Usage
|
17
|
+
|
18
|
+
**Creating** To create a new site run `tipsy new name_of_site` to generate a new site in the current directory.
|
19
|
+
|
20
|
+
**Compiling** To compile the site into a production-ready state, run `tipsy compile` from the site's root directory.
|
21
|
+
|
22
|
+
**Serving** Simply run `tipsy` from the site root. Its recommended to add Thin or Mongrel to your Gemfile but Webrick will be used as a fallback.
|
23
|
+
|
24
|
+
Running the site generator should provide all of the configuration and setup options you would need to get started. Check out config.rb in the created
|
25
|
+
site's root for more info.
|
26
|
+
|
7
27
|
### Notes
|
8
28
|
|
9
29
|
Tipsy was developed for personal/internal use but feature/pull requests are gladly accepted. It is not designed to function in any kind of production
|
10
|
-
environment. When ready to upload files to a production environment, build the project and upload the result.
|
30
|
+
environment. When ready to upload files to a production environment, build the project and upload the result.
|
31
|
+
|
32
|
+
By default *most* ActionView compatible helpers should work out of the box... with the exception of helpers extending things like the form builder etc.
|
33
|
+
Right now Tipsy has no form builder, so you would have to provide your own.
|
data/Rakefile
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
$:.unshift File.expand_path('.', __FILE__)
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler'
|
6
|
+
Bundler::GemHelper.install_tasks
|
4
7
|
|
5
|
-
|
6
|
-
test.libs << 'lib' << 'test'
|
7
|
-
test.pattern = 'test/**/*_test.rb'
|
8
|
-
test.verbose = true
|
9
|
-
end
|
8
|
+
require 'rake/testtask'
|
10
9
|
|
11
|
-
|
10
|
+
Rake::TestTask.new(:test) do |t|
|
11
|
+
t.test_files = FileList['test/**/*_test.rb']
|
12
|
+
t.libs << 'lib'
|
13
|
+
t.libs << 'test'
|
14
|
+
t.verbose = true
|
15
|
+
end
|
data/bin/tipsy
CHANGED
@@ -5,6 +5,8 @@ if File.file?(libdir + '/tipsy/version.rb')
|
|
5
5
|
$LOAD_PATH.unshift(libdir)
|
6
6
|
end
|
7
7
|
|
8
|
+
ENV['TIPSY_ROOT'] ||= File.expand_path('.')
|
9
|
+
|
8
10
|
begin
|
9
11
|
require 'tipsy'
|
10
12
|
rescue LoadError
|
@@ -17,5 +19,5 @@ if File.exists?(File.join(File.expand_path('.'), 'Gemfile'))
|
|
17
19
|
Bundler.require(:default)
|
18
20
|
end
|
19
21
|
|
20
|
-
|
21
|
-
Tipsy.
|
22
|
+
require 'tipsy/runner'
|
23
|
+
Tipsy::Runner.new(ARGV, STDIN)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
##################################################################
|
2
|
+
# Basic rewriting to avoid file extensions where the
|
3
|
+
# result is a basic html page.
|
4
|
+
##################################################################
|
5
|
+
|
6
|
+
# For IE .htc files
|
7
|
+
AddType text/x-component .htc
|
8
|
+
|
9
|
+
RewriteEngine on
|
10
|
+
RewriteBase /
|
11
|
+
|
12
|
+
RewriteCond %{REQUEST_FILENAME} !-f
|
13
|
+
RewriteCond %{REQUEST_FILENAME} !-d
|
14
|
+
RewriteRule ^(.*)$ $1.html [L,QSA]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
gem "rack", "~> 1.3"
|
4
|
+
gem "tilt", "~> 1.3"
|
5
|
+
gem "i18n", "~> 0.6"
|
6
|
+
gem "sass", "~> 3.1"
|
7
|
+
gem "activesupport", ">= 3.1"
|
8
|
+
gem "sprockets", "~> 2.0"
|
9
|
+
gem "erubis"
|
10
|
+
|
11
|
+
# Thin or mongrel are recommended over Webrick
|
12
|
+
# gem "thin"
|
13
|
+
|
14
|
+
# Uglifier is recommended for javascript compression. If unavailable, Google's online
|
15
|
+
# closure compiler will be used.
|
16
|
+
# gem 'uglifier'
|
17
|
+
|
18
|
+
# Compass is automatically detected and configured if available
|
19
|
+
# gem "compass", "~> 0.11"
|
@@ -0,0 +1 @@
|
|
1
|
+
// Setup global variables etc here.
|
@@ -0,0 +1 @@
|
|
1
|
+
@import 'config';
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Configure urls where assets are to be served.
|
2
|
+
# In development, assets should be placed under root_path/assets
|
3
|
+
# On compile, assets will be stored at these locations (defaults shown)
|
4
|
+
#
|
5
|
+
asset_path = "/assets"
|
6
|
+
javascripts_path = "/assets"
|
7
|
+
images_path = "/assets"
|
8
|
+
css_path = "/assets"
|
9
|
+
|
10
|
+
# Fonts don't really need to be served by sprockets, they should go in your public_path.
|
11
|
+
# This option is mostly provided for using asset_url helpers in Sass
|
12
|
+
fonts_path = "/fonts"
|
13
|
+
|
14
|
+
# On compile, use this folder. Accepts either a relative or absolute path
|
15
|
+
compile_to = "compiled"
|
16
|
+
|
17
|
+
# Static files and assets will be served from this location
|
18
|
+
public_path = "public"
|
19
|
+
|
20
|
+
# Configure assets to be compiled at compile-time (default: screen.css and site.js)
|
21
|
+
#
|
22
|
+
compile.assets << "site.js"
|
23
|
+
compile.assets << "screen.css"
|
24
|
+
|
25
|
+
# By default template compilation will generate files as they exist in your /views directory.
|
26
|
+
# This allows for rewriting via .htaccess or nginx config to avoid .html extensions in your urls.
|
27
|
+
# If you would prefer a folder/index.html structure for the resulting html files, set compile.enable_rewrite to false.
|
28
|
+
# Set compile.rewrite_mode to one of :nginx or :htaccess to have a .htaccess/nginx.conf file generated for you.
|
29
|
+
# The default configurations are shown below
|
30
|
+
#
|
31
|
+
# compile.enable_rewrite = true
|
32
|
+
# compile.rewrite_mode = :htaccess
|
33
|
+
|
34
|
+
# Compiling cleans the 'compile_to' path prior to re-building the site.
|
35
|
+
# To ensure certain directories are preserved, add them here. This is primarily useful for scm directories
|
36
|
+
#
|
37
|
+
# compile.preserve << ".svn"
|
38
|
+
#
|
39
|
+
# When compiling, all files and folders found in the 'public_path' are copied. To ignore
|
40
|
+
# specific files or folders, include them here.
|
41
|
+
#
|
42
|
+
# compile.skip << "some-path"
|
43
|
+
#
|
44
|
+
#
|
45
|
+
# Callbacks:
|
46
|
+
# To perform additional tasks either before or after compilation, define either a
|
47
|
+
# before_compile, after_compile, or both. Blocks are passed an instance of the Compiler.
|
48
|
+
# See tipsy/runners/compiler.rb for more info.
|
49
|
+
#
|
50
|
+
# after_compile do |runner|
|
51
|
+
# end
|
52
|
+
#
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Configure deployment options here.
|
2
|
+
# Only the default is required for deployment, specify separate locations as needed to
|
3
|
+
# deploy to multiple servers.
|
4
|
+
#
|
5
|
+
# Options:
|
6
|
+
# server_type: Either apache or nginx.
|
7
|
+
# scm: One of subversion, git, or simply false. (experimental)
|
8
|
+
# deploy_to: Where the deployed files should be placed.
|
9
|
+
# deploy_via: One of ftp, sftp, or ssh. For scm deployments, ssh is required. S3 support coming in a future release
|
10
|
+
#
|
11
|
+
|
12
|
+
defaults: &defaults
|
13
|
+
server_type: "apache"
|
14
|
+
scm: false
|
15
|
+
deploy_to: ""
|
16
|
+
deploy_via: "ftp"
|
17
|
+
port: 22
|
18
|
+
username: "deploy"
|
19
|
+
|
20
|
+
default:
|
21
|
+
<<: *defaults
|
22
|
+
host: "ftp.somewhere.com"
|
23
|
+
|
24
|
+
# setup a second location
|
25
|
+
#server2:
|
26
|
+
# <<: *defaults
|
27
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8" />
|
5
|
+
<!-- pre-fetch dns info for external sites -->
|
6
|
+
<link rel="dns-prefetch" href="//ajax.googleapis.com" />
|
7
|
+
<!-- force IE to render as IE... weird isn't it? -->
|
8
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
9
|
+
<!-- 'pinned' sites in IE ( see: http://html5boilerplate.com/docs/head-Tips/ ) -->
|
10
|
+
<meta name="application-name" content="" />
|
11
|
+
<meta name="msapplication-tooltip" content="" />
|
12
|
+
<!-- Facebook open graph ( seff: http://developers.facebook.com/docs/share ) -->
|
13
|
+
<meta property="og:title" content="" />
|
14
|
+
<meta property="og:description" content="" />
|
15
|
+
<meta property="og:image" content="" />
|
16
|
+
<title><%= page_title %></title>
|
17
|
+
<meta name="description" content="" />
|
18
|
+
<meta name="author" content="" />
|
19
|
+
<meta name="viewport" content="width=device-width,initial-scale=1,target-densitydpi=device-dpi" />
|
20
|
+
<!--[if lt IE 9]>
|
21
|
+
<script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
|
22
|
+
<%= stylesheet_link_tag 'ie' %>
|
23
|
+
<![endif]-->
|
24
|
+
<%= stylesheet_link_tag 'screen' %>
|
25
|
+
</head>
|
26
|
+
<body id="<%= page_id %>">
|
27
|
+
<div id="wrapper">
|
28
|
+
<header>
|
29
|
+
|
30
|
+
</header>
|
31
|
+
<div id="main" role="main">
|
32
|
+
<%= yield %>
|
33
|
+
</div>
|
34
|
+
<footer>
|
35
|
+
|
36
|
+
</footer>
|
37
|
+
</div>
|
38
|
+
<%= javascript_include_tag "//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" %>
|
39
|
+
<%= javascript_include_tag 'site' %>
|
40
|
+
</body>
|
41
|
+
</html>
|
File without changes
|
@@ -0,0 +1,44 @@
|
|
1
|
+
##
|
2
|
+
# Includes an interface to Google's Online Closure Compiler.
|
3
|
+
# Uglifier is recommended (gem install uglifier) however to support environments where Node.js
|
4
|
+
# is unavailable this can be used as a fallback.
|
5
|
+
#
|
6
|
+
require 'net/http'
|
7
|
+
require 'uri'
|
8
|
+
|
9
|
+
module Tipsy
|
10
|
+
module Compressors
|
11
|
+
|
12
|
+
module Closure
|
13
|
+
def compress(js)
|
14
|
+
return js if js.to_s.blank?
|
15
|
+
post_data = {
|
16
|
+
'compilation_level' => 'SIMPLE_OPTIMIZATIONS',
|
17
|
+
'js_code' => js.to_s,
|
18
|
+
'output_format' => 'text'
|
19
|
+
}
|
20
|
+
request = Net::HTTP.post_form(URI.parse('http://closure-compiler.appspot.com/compile'), post_data)
|
21
|
+
request.body.to_s
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module Uglifier
|
26
|
+
def compress(js)
|
27
|
+
::Uglifier.compile(js, :max_line_length => 500, :squeeze => true, :copyright => false)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class JavascriptCompressor
|
32
|
+
def initialize
|
33
|
+
begin
|
34
|
+
require 'uglifier'
|
35
|
+
self.class.send(:include, Uglifier)
|
36
|
+
rescue LoadError
|
37
|
+
Tipsy.logger.info("Add the Uglifier gem to your gemfile for better javascript support")
|
38
|
+
self.class.send(:include, Closure)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'sprockets'
|
2
|
+
require 'hike'
|
3
|
+
require 'tipsy/handler/sass'
|
4
|
+
|
5
|
+
module Tipsy
|
6
|
+
module Handler
|
7
|
+
##
|
8
|
+
# The AssetHandler is a subclass of Sprockets::Environment resposible for delivering
|
9
|
+
# assets back to the browser. In development assets should be defined under:
|
10
|
+
# javascripts: /assets/javascripts
|
11
|
+
# images: /assets/images
|
12
|
+
# stylesheets: /assets/stylesheets
|
13
|
+
#
|
14
|
+
# Configure delivery urls using Tipsy::Site.asset_path, or Tipsy::Site.type_path where 'type' is the type of asset to configure
|
15
|
+
# Although assets are stored in the /assets folder, when compiled these directories will be used for the final
|
16
|
+
# output. This way assets can be organized during development, but placed anywhere when deployed
|
17
|
+
#
|
18
|
+
class AssetHandler < ::Sprockets::Environment
|
19
|
+
attr_reader :asset_env
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def map!
|
23
|
+
fpaths = [:javascripts_path, :css_path, :images_path].collect{ |p| File.basename(Tipsy::Site.send(p)) }
|
24
|
+
fpaths.inject({}) do |hash, path|
|
25
|
+
hash.merge!("/#{path}" => self.new)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize
|
31
|
+
::Sprockets.register_engine '.scss', Tipsy::Handler::SassHandler
|
32
|
+
super(Tipsy.root) do |env|
|
33
|
+
@asset_env = env
|
34
|
+
end
|
35
|
+
append_path "assets/javascripts"
|
36
|
+
append_path "assets/images"
|
37
|
+
append_path "assets/stylesheets"
|
38
|
+
|
39
|
+
configure_compass!
|
40
|
+
self
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Setup compressors for compilation
|
46
|
+
#
|
47
|
+
def prepare_compiler
|
48
|
+
asset_env.css_compressor = Tipsy::Compressors::CssCompressor.new
|
49
|
+
asset_env.js_compressor = Tipsy::Compressors::JavascriptCompressor.new
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# When exceptions are thrown through Sprockets, ensure that the
|
54
|
+
# current indexes are expired. This ensures we never receive a CircularDependency error.
|
55
|
+
#
|
56
|
+
def javascript_exception_response(exception)
|
57
|
+
expire_index!
|
58
|
+
super(exception)
|
59
|
+
end
|
60
|
+
|
61
|
+
def css_exception_response(exception)
|
62
|
+
expire_index!
|
63
|
+
super(exception)
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def configure_compass!
|
69
|
+
begin
|
70
|
+
require 'compass'
|
71
|
+
require 'sass/plugin'
|
72
|
+
|
73
|
+
compass_config = ::Compass::Configuration::Data.new("project")
|
74
|
+
compass_config.project_type = :stand_alone
|
75
|
+
compass_config.project_path = Tipsy.root
|
76
|
+
compass_config.images_dir = File.join('assets', 'images')
|
77
|
+
compass_config.sass_dir = File.join('assets', 'stylesheets')
|
78
|
+
compass_config.http_images_path = "/#{File.basename(Tipsy::Site.images_path)}"
|
79
|
+
compass_config.relative_assets = false
|
80
|
+
compass_config.line_comments = false
|
81
|
+
|
82
|
+
Compass.add_project_configuration(compass_config)
|
83
|
+
::Sass::Plugin.engine_options.merge!(Compass.sass_engine_options)
|
84
|
+
|
85
|
+
rescue LoadError
|
86
|
+
require 'tipsy/helpers/sass'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "erubis"
|
2
|
+
##
|
3
|
+
# The ErbHandler hacks erubis in the same manner as Rails.
|
4
|
+
# This allows support for Rails view helpers.
|
5
|
+
#
|
6
|
+
module Tipsy
|
7
|
+
module Handler
|
8
|
+
class ErbHandler < ::Tilt::ErubisTemplate
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Erubis::Eruby
|
14
|
+
def add_text(src, text)
|
15
|
+
return if text.empty? || text.nil?
|
16
|
+
src << "@output_buffer.concat('" << escape_text(text) << "');"
|
17
|
+
end
|
18
|
+
|
19
|
+
BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/
|
20
|
+
|
21
|
+
def add_expr_literal(src, code)
|
22
|
+
return if code.nil?
|
23
|
+
if code.to_s =~ BLOCK_EXPR
|
24
|
+
src << '@output_buffer << ' << code.to_s
|
25
|
+
else
|
26
|
+
src << '@output_buffer << (' << code.to_s << ');'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_expr_escaped(src, code)
|
31
|
+
return if code.nil?
|
32
|
+
if code.to_s =~ BLOCK_EXPR
|
33
|
+
src << "@output_buffer << " << code.to_s
|
34
|
+
else
|
35
|
+
src << "@output_buffer.concat((" << code.to_s << ").to_s);"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_postamble(src)
|
40
|
+
src << '@output_buffer.to_s'
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
|
3
|
+
module Tipsy
|
4
|
+
module Handler
|
5
|
+
##
|
6
|
+
# The PHP engine allows processing/rendering of php templates within the server
|
7
|
+
# environment. To process php templates, use the template.html.php naming syntax.
|
8
|
+
#
|
9
|
+
class PhpHandler < Tilt::Template
|
10
|
+
|
11
|
+
self.default_mime_type = 'text/html'
|
12
|
+
|
13
|
+
def prepare
|
14
|
+
@engine = PhpProcessor.new(data)
|
15
|
+
end
|
16
|
+
|
17
|
+
def evaluate(scope, locals, &block)
|
18
|
+
@output ||= @engine.render
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class PhpProcessor
|
23
|
+
attr_accessor :data
|
24
|
+
|
25
|
+
def initialize(d)
|
26
|
+
@data = d
|
27
|
+
end
|
28
|
+
|
29
|
+
def render
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
Tilt.register(Tipsy::Handler::PhpHandler, 'php')
|
@@ -1,39 +1,13 @@
|
|
1
|
-
|
2
|
-
require '
|
3
|
-
|
1
|
+
begin
|
2
|
+
require 'compass'
|
3
|
+
rescue LoadError
|
4
|
+
end
|
4
5
|
|
5
|
-
##
|
6
|
-
# Most of this was extracted and modified from the sass-rails plugin, since most of the
|
7
|
-
# Sprockets functionality is the same.
|
8
|
-
#
|
9
6
|
module Tipsy
|
10
|
-
module
|
11
|
-
class
|
12
|
-
self.default_mime_type = 'text/css'
|
13
|
-
|
14
|
-
class Resolver
|
15
|
-
attr_accessor :context
|
16
|
-
def initialize(context)
|
17
|
-
@context = context
|
18
|
-
end
|
19
|
-
def resolve(path, content_type = :self)
|
20
|
-
options = {}
|
21
|
-
options[:content_type] = content_type unless content_type.nil?
|
22
|
-
context.resolve(path, options)
|
23
|
-
rescue Sprockets::FileNotFound, Sprockets::ContentTypeMismatch
|
24
|
-
nil
|
25
|
-
end
|
26
|
-
def public_path(path, scope)
|
27
|
-
context.asset_paths.compute_public_path(path, scope)
|
28
|
-
end
|
29
|
-
def process(path)
|
30
|
-
context.environment[path].to_s
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
|
7
|
+
module Handler
|
8
|
+
class SassHandler < ::Tilt::ScssTemplate
|
35
9
|
class Importer
|
36
|
-
|
10
|
+
|
37
11
|
GLOB = /\*|\[.+\]/
|
38
12
|
PARTIAL = /^_/
|
39
13
|
HAS_EXTENSION = /\.css(.s[ac]ss)?$/
|
@@ -43,14 +17,14 @@ module Tipsy
|
|
43
17
|
".sass" => :sass,
|
44
18
|
".scss" => :scss
|
45
19
|
}
|
46
|
-
|
20
|
+
|
47
21
|
attr_reader :context
|
48
22
|
|
49
23
|
def initialize(context)
|
50
24
|
@context = context
|
51
25
|
@resolver = Resolver.new(context)
|
52
26
|
end
|
53
|
-
|
27
|
+
|
54
28
|
def sass_file?(filename)
|
55
29
|
filename = filename.to_s
|
56
30
|
SASS_EXTENSIONS.keys.any?{|ext| filename[ext]}
|
@@ -61,7 +35,7 @@ module Tipsy
|
|
61
35
|
SASS_EXTENSIONS.each {|ext, syntax| return syntax if filename[(ext.size+2)..-1][ext]}
|
62
36
|
nil
|
63
37
|
end
|
64
|
-
|
38
|
+
|
65
39
|
def render_with_engine(data, pathname, options = {})
|
66
40
|
::Sass::Engine.new(data, options.merge(:filename => pathname.to_s, :importer => self, :syntax => syntax(pathname)))
|
67
41
|
end
|
@@ -75,7 +49,7 @@ module Tipsy
|
|
75
49
|
partial_name = name.dirname.join("_#{name.basename}")
|
76
50
|
@resolver.resolve(name) || @resolver.resolve(partial_name)
|
77
51
|
end
|
78
|
-
|
52
|
+
|
79
53
|
def find_relative(name, base, options)
|
80
54
|
base_pathname = Pathname.new(base)
|
81
55
|
if pathname = resolve(name, base_pathname.dirname)
|
@@ -89,7 +63,7 @@ module Tipsy
|
|
89
63
|
nil
|
90
64
|
end
|
91
65
|
end
|
92
|
-
|
66
|
+
|
93
67
|
def find(name, options)
|
94
68
|
if pathname = resolve(name)
|
95
69
|
context.depend_on(pathname)
|
@@ -112,26 +86,14 @@ module Tipsy
|
|
112
86
|
def key(name, options)
|
113
87
|
["Sprockets:" + File.dirname(File.expand_path(name)), File.basename(name)]
|
114
88
|
end
|
115
|
-
|
89
|
+
|
116
90
|
def resolve_sass_path(name, options = {}, relative = false)
|
117
91
|
prefix = ( relative === false ? "" : "./" )
|
118
92
|
(context.resolve("#{prefix}#{name}", options) || context.resolve("#{prefix}_#{name}", options))
|
119
93
|
end
|
120
|
-
|
121
|
-
end
|
122
|
-
|
123
|
-
def prepare
|
94
|
+
|
124
95
|
end
|
125
|
-
|
126
|
-
def evaluate(scope, locals, &block)
|
127
|
-
::Sass::Engine.new(data, {
|
128
|
-
:filename => eval_file,
|
129
|
-
:line => line,
|
130
|
-
:syntax => :scss,
|
131
|
-
:importer => Importer.new(scope)
|
132
|
-
}.reverse_merge!(::Compass.sass_engine_options)).render
|
133
|
-
end
|
134
|
-
|
96
|
+
|
135
97
|
end
|
136
98
|
end
|
137
99
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Tipsy
|
2
|
+
module Handler
|
3
|
+
class SassHandler < ::Tilt::ScssTemplate
|
4
|
+
|
5
|
+
class Resolver
|
6
|
+
attr_accessor :context
|
7
|
+
|
8
|
+
def initialize(context)
|
9
|
+
@context = context
|
10
|
+
end
|
11
|
+
|
12
|
+
def resolve(path, content_type = :self)
|
13
|
+
options = {}
|
14
|
+
options[:content_type] = content_type unless content_type.nil?
|
15
|
+
context.resolve(path, options)
|
16
|
+
rescue Sprockets::FileNotFound, Sprockets::ContentTypeMismatch
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def public_path(path, scope)
|
21
|
+
context.asset_paths.compute_public_path(path, scope)
|
22
|
+
end
|
23
|
+
|
24
|
+
def process(path)
|
25
|
+
context.environment[path].to_s
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|