backbone_handlebars 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +1 -0
- data/backbone_handlebars.gemspec +22 -0
- data/lib/backbone_handlebars/engine.rb +26 -0
- data/lib/backbone_handlebars/template.rb +58 -0
- data/lib/backbone_handlebars/version.rb +3 -0
- data/lib/backbone_handlebars.rb +2 -0
- data/lib/generators/backbone_handlebars/helpers.rb +47 -0
- data/lib/generators/backbone_handlebars/install/install_generator.rb +68 -0
- data/lib/generators/backbone_handlebars/install/templates/app.coffee +10 -0
- data/vendor/assets/handlebars/development/handlebars.js +1920 -0
- data/vendor/assets/handlebars/production/handlebars.js +241 -0
- data/vendor/assets/javascripts/backbone.js +1498 -0
- data/vendor/assets/javascripts/underscore.js +1221 -0
- metadata +110 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Blake Williams
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# BackboneHandlebars
|
2
|
+
|
3
|
+
A gem that vendors the latest Backbone, Underscore, and Handlebars libraries and compiles/precompiles Handlebars templates.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'backbone_handlebars'
|
11
|
+
```
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
|
15
|
+
rails generate backbone_handlebars:install
|
16
|
+
|
17
|
+
This will generate the applications structure in the app/assets/javascripts directory and add the precompile option to your production environment.
|
18
|
+
|
19
|
+
## Options
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
config.handlebars.precompile
|
23
|
+
```
|
24
|
+
|
25
|
+
Enables precompilation and will serve only the Handlebars runtime instead of the full library.
|
26
|
+
|
27
|
+
```
|
28
|
+
config.handlebars.path
|
29
|
+
```
|
30
|
+
|
31
|
+
Changes the path of the Handlebars library that compiles/precompiles your templates
|
32
|
+
|
33
|
+
If you want to use your own Handlebars or Handlebars runtime you have to place them in `vendor/assets/handlebars/development` and `vendor/assets/handlebars/production` respectively.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'backbone_handlebars/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "backbone_handlebars"
|
8
|
+
gem.version = BackboneHandlebars::VERSION
|
9
|
+
gem.authors = ["Blake Williams"]
|
10
|
+
gem.email = ["blake@blakewilliams.me"]
|
11
|
+
gem.summary = %q{Backbone and Handlebars for Rails 3.1+}
|
12
|
+
gem.homepage = "http://github.com/BlakeWilliams/backbone_handlebars"
|
13
|
+
|
14
|
+
gem.files = `git ls-files`.split($/)
|
15
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
|
+
gem.require_paths = ["lib"]
|
18
|
+
|
19
|
+
gem.add_dependency "execjs"
|
20
|
+
gem.add_dependency "sprockets"
|
21
|
+
gem.add_dependency "tilt"
|
22
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'backbone_handlebars/template'
|
2
|
+
|
3
|
+
module BackboneHandlebars
|
4
|
+
class Engine < Rails::Engine
|
5
|
+
config.handlebars = ActiveSupport::OrderedOptions.new
|
6
|
+
|
7
|
+
config.handlebars.path = File.expand_path("../../../vendor/assets/handlebars/development/handlebars.js", __FILE__)
|
8
|
+
config.handlebars.templates_root "templates"
|
9
|
+
|
10
|
+
initializer "backbone_handlebars.setup", after: 'sprockets.environment', group: :all do |app|
|
11
|
+
version = "production" if app.config.handlebars.precompile == true
|
12
|
+
version ||= "development"
|
13
|
+
|
14
|
+
path = File.expand_path("../../../vendor/assets/handlebars/#{version}", __FILE__)
|
15
|
+
app.config.assets.paths.push(path.to_s)
|
16
|
+
|
17
|
+
path = app.root.join("vendor/assets/handlebars/#{version}")
|
18
|
+
app.config.assets.paths.unshift(path.to_s) if path.exist?
|
19
|
+
|
20
|
+
next unless app.assets
|
21
|
+
app.assets.register_engine '.handlebars', BackboneHandlebars::Template
|
22
|
+
app.assets.register_engine '.hbs', BackboneHandlebars::Template
|
23
|
+
app.assets.register_engine '.hjs', BackboneHandlebars::Template
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'sprockets'
|
2
|
+
require 'sprockets/engines'
|
3
|
+
require 'execjs'
|
4
|
+
|
5
|
+
module BackboneHandlebars
|
6
|
+
class Template < Tilt::Template
|
7
|
+
|
8
|
+
def self.handlebars
|
9
|
+
@@handlebars ||= File.new(::Rails.configuration.handlebars.path).read
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.default_mime_type
|
13
|
+
'application/javascript'
|
14
|
+
end
|
15
|
+
|
16
|
+
def prepare; end
|
17
|
+
|
18
|
+
def evaluate(scope, locals, &block)
|
19
|
+
path = scope.logical_path.gsub(/^templates\//i, '')
|
20
|
+
|
21
|
+
if ::Rails.configuration.handlebars.precompile == true
|
22
|
+
template = precompile_handlebars(path, data)
|
23
|
+
else
|
24
|
+
template = compile_handlebars(path, data)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def compile_handlebars(path, string)
|
30
|
+
<<-TARGET.gsub /^\s{/, ''\
|
31
|
+
(function() {
|
32
|
+
Handlebars.templates || (Handlebars.templates = {})
|
33
|
+
Handlebars.templates['#{path}'] = Handlebars.compile(#{indent(string).inspect});
|
34
|
+
}).call(this);
|
35
|
+
TARGET
|
36
|
+
end
|
37
|
+
|
38
|
+
def precompile_handlebars(path, string)
|
39
|
+
context = ExecJS.compile(BackboneHandlebars::Template.handlebars)
|
40
|
+
template = context.call "Handlebars.precompile", strip(string)
|
41
|
+
<<-TARGET.gsub /^\s{/, ''\
|
42
|
+
(function() {
|
43
|
+
Handlebars.templates || (Handlebars.templates = {})
|
44
|
+
Handlebars.templates['#{path}'] = Handlebars.template(#{template});
|
45
|
+
}).call(this);
|
46
|
+
TARGET
|
47
|
+
end
|
48
|
+
|
49
|
+
def indent(string)
|
50
|
+
string.gsub(/$(.)/m, "\\1 ").strip
|
51
|
+
end
|
52
|
+
|
53
|
+
def strip(string)
|
54
|
+
string.gsub(/\n/, '')
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module BackboneHandlebars
|
2
|
+
module Generators
|
3
|
+
module Helpers
|
4
|
+
|
5
|
+
def assets_path
|
6
|
+
File.join('app', 'assets')
|
7
|
+
end
|
8
|
+
|
9
|
+
def javascripts_path
|
10
|
+
File.join(assets_path, 'javascripts')
|
11
|
+
end
|
12
|
+
|
13
|
+
def models_path
|
14
|
+
File.join(javascripts_path, 'models')
|
15
|
+
end
|
16
|
+
|
17
|
+
def collections_path
|
18
|
+
File.join(javascripts_path, 'collections')
|
19
|
+
end
|
20
|
+
|
21
|
+
def helpers_path
|
22
|
+
File.join(javascripts_path, 'helpers')
|
23
|
+
end
|
24
|
+
|
25
|
+
def routers_path
|
26
|
+
File.join(javascripts_path, 'routers')
|
27
|
+
end
|
28
|
+
|
29
|
+
def views_path
|
30
|
+
File.join(javascripts_path, 'views')
|
31
|
+
end
|
32
|
+
|
33
|
+
def templates_path
|
34
|
+
File.join(javascripts_path, 'templates')
|
35
|
+
end
|
36
|
+
|
37
|
+
def production_config_path
|
38
|
+
File.join('config', 'environments', 'production.rb')
|
39
|
+
end
|
40
|
+
|
41
|
+
def app_name
|
42
|
+
Rails.application.class.name.split('::').first.camelize
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'generators/backbone_handlebars/helpers'
|
2
|
+
|
3
|
+
module BackboneHandlebars
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
6
|
+
include BackboneHandlebars::Generators::Helpers
|
7
|
+
|
8
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
|
+
|
10
|
+
desc "Generates Backbone skeleton directory structure"
|
11
|
+
|
12
|
+
class_option :manifest,
|
13
|
+
type: :string,
|
14
|
+
aliases: "-m",
|
15
|
+
default: "application.js",
|
16
|
+
desc: "Javascript manifest file to modify"
|
17
|
+
|
18
|
+
def create_dir_layout
|
19
|
+
empty_directory collections_path
|
20
|
+
empty_directory helpers_path
|
21
|
+
empty_directory models_path
|
22
|
+
empty_directory routers_path
|
23
|
+
empty_directory templates_path
|
24
|
+
empty_directory views_path
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_app_file
|
28
|
+
template "app.coffee", "#{javascripts_path}/#{app_name.downcase}.coffee"
|
29
|
+
end
|
30
|
+
|
31
|
+
def inject_files
|
32
|
+
manifest = File.join(javascripts_path, options.manifest)
|
33
|
+
|
34
|
+
libs = %w[underscore backbone handlebars]
|
35
|
+
paths = %w(./helpers ./templates ./models ./collections ./views ./routers)
|
36
|
+
|
37
|
+
out = []
|
38
|
+
out << libs.map { |lib| "//= require #{lib}" }
|
39
|
+
out << "//= require #{app_name.downcase}"
|
40
|
+
out << paths.map { |path| "//= require_tree #{path}" }
|
41
|
+
out = out.join("\n") + "\n"
|
42
|
+
|
43
|
+
in_root do
|
44
|
+
return unless File.exists?(manifest)
|
45
|
+
if File.open(manifest).read().include?('//= require_tree .')
|
46
|
+
inject_into_file(manifest, out, before: '//= require_tree .')
|
47
|
+
else
|
48
|
+
append_file(manifest, out)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def inject_production_config
|
54
|
+
in_root do
|
55
|
+
return unless File.exists?(production_config_path)
|
56
|
+
|
57
|
+
out = []
|
58
|
+
out << [" # Specify if you want Handlebars precompiled in this environment"]
|
59
|
+
out << [" config.handlebars.precompile = true"]
|
60
|
+
out = "\n#{out.join("\n")}\n"
|
61
|
+
|
62
|
+
inject_into_file(production_config_path, out, before: "\nend")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|