pakunok 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile +2 -11
- data/Gemfile.lock +16 -2
- data/HISTORY.md +7 -0
- data/MIT-LICENSE +1 -1
- data/README.md +82 -66
- data/assets.md +51 -0
- data/lib/pakunok.rb +8 -0
- data/lib/pakunok/haml_js_template.rb +83 -0
- data/lib/pakunok/version.rb +1 -1
- data/pakunok.gemspec +1 -0
- data/spec/{colorpicker_spec.rb → assets/colorpicker_spec.rb} +0 -0
- data/spec/{fileuploader_spec.rb → assets/fileuploader_spec.rb} +0 -0
- data/spec/{jquery-ui_spec.rb → assets/jquery-ui_spec.rb} +0 -0
- data/spec/{jquery_spec.rb → assets/jquery_spec.rb} +0 -0
- data/spec/{misc_spec.rb → assets/misc_spec.rb} +2 -0
- data/spec/dummy/app/assets/javascripts/application.js +3 -0
- data/spec/dummy/app/assets/javascripts/haml/haml-foo-bar.js.hamljs +2 -0
- data/spec/dummy/app/assets/javascripts/haml/not-haml.js.erb +1 -0
- data/spec/dummy/app/assets/javascripts/pages.js.coffee +8 -0
- data/spec/dummy/app/assets/javascripts/sample.js.hamljs +3 -0
- data/spec/dummy/app/views/pages/index.html.erb +11 -1
- data/spec/fixtures/name.js.haml-js +0 -0
- data/spec/haml_js_template_spec.rb +102 -0
- data/vendor/assets/javascripts/pakunok/haml.js +651 -0
- metadata +38 -14
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,14 +1,5 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
gem 'sprockets', '2.0.0.beta13'
|
3
|
+
gemspec
|
5
4
|
|
6
|
-
|
7
|
-
# gem 'rails', :git => 'git://github.com/rails/rails.git'
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# To use debugger
|
12
|
-
# gem 'ruby-debug19', :require => 'ruby-debug'
|
13
|
-
|
14
|
-
gem 'rspec', :group => :test
|
5
|
+
gem 'coffee-script', :require => false
|
data/Gemfile.lock
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
pakunok (0.0.2)
|
5
|
+
execjs
|
6
|
+
rails (>= 3.1.0.rc5)
|
7
|
+
sprockets (>= 2.0.0.beta13)
|
8
|
+
|
1
9
|
GEM
|
2
10
|
remote: http://rubygems.org/
|
3
11
|
specs:
|
@@ -33,8 +41,14 @@ GEM
|
|
33
41
|
arel (2.1.4)
|
34
42
|
bcrypt-ruby (2.1.4)
|
35
43
|
builder (3.0.0)
|
44
|
+
coffee-script (2.2.0)
|
45
|
+
coffee-script-source
|
46
|
+
execjs
|
47
|
+
coffee-script-source (1.1.2)
|
36
48
|
diff-lcs (1.1.2)
|
37
49
|
erubis (2.7.0)
|
50
|
+
execjs (1.2.4)
|
51
|
+
multi_json (~> 1.0)
|
38
52
|
hike (1.2.0)
|
39
53
|
i18n (0.6.0)
|
40
54
|
mail (2.3.0)
|
@@ -93,6 +107,6 @@ PLATFORMS
|
|
93
107
|
ruby
|
94
108
|
|
95
109
|
DEPENDENCIES
|
96
|
-
|
110
|
+
coffee-script
|
111
|
+
pakunok!
|
97
112
|
rspec
|
98
|
-
sprockets (= 2.0.0.beta13)
|
data/HISTORY.md
ADDED
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -2,57 +2,7 @@
|
|
2
2
|
|
3
3
|
_Pakunok_ contains a set of prepackaged assets that you can easily include into your Rails 3.1 application (using assets pipeline).
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
- jquery (defaults to 1.6.2)
|
8
|
-
- jquery/jquery-1.6.2
|
9
|
-
- jquery/jquery-1.5.2
|
10
|
-
- jquery.validate
|
11
|
-
- colorpicker (has CSS)
|
12
|
-
- fileuploader (has CSS)
|
13
|
-
- innershiv
|
14
|
-
- jquery.form
|
15
|
-
- jquery.validate
|
16
|
-
- jquery.jscrollpane (has CSS)
|
17
|
-
- jquery.mousewheel (optional improvement for jquery.jscrollpane)
|
18
|
-
- mwheelIntent (optional improvement for jquery.jscrollpane)
|
19
|
-
- jquery.viewport
|
20
|
-
- jquery-ui - standalone files (`jquery-ui/`): no dependencies tracked, serve these when part of jQueryUI has already been included elsewhere
|
21
|
-
- accordion
|
22
|
-
- autocomplete
|
23
|
-
- button
|
24
|
-
- core
|
25
|
-
- datepicker
|
26
|
-
- dialog
|
27
|
-
- draggable
|
28
|
-
- droppable
|
29
|
-
- effects (all effects, does not require jQuery-UI core)
|
30
|
-
- mouse
|
31
|
-
- position
|
32
|
-
- progressbar
|
33
|
-
- resizable
|
34
|
-
- selectable
|
35
|
-
- slider
|
36
|
-
- sortable
|
37
|
-
- tabs
|
38
|
-
- widget
|
39
|
-
- jquery-ui - combined (`jquery-ui/pack/`): ready-to-go options, you can include multiple into only one script file
|
40
|
-
- accordion
|
41
|
-
- autocomplete
|
42
|
-
- basic (includes core, widget, position, mouse components)
|
43
|
-
- button
|
44
|
-
- datepicker
|
45
|
-
- dialog
|
46
|
-
- draggable
|
47
|
-
- droppable
|
48
|
-
- effects (same as standalone)
|
49
|
-
- progressbar
|
50
|
-
- resizable
|
51
|
-
- selectable
|
52
|
-
- slider
|
53
|
-
- sortable
|
54
|
-
- tabs
|
55
|
-
|
5
|
+
You can see all the included [assets](assets.md). (reference those prefixed with `pakunok/`):
|
56
6
|
|
57
7
|
Tested on MRI Ruby 1.9.2.
|
58
8
|
|
@@ -71,12 +21,11 @@ Then `bundle install`.
|
|
71
21
|
|
72
22
|
# Usage
|
73
23
|
|
74
|
-
|
75
|
-
Let's see
|
76
|
-
|
24
|
+
Reference as you normally do with Sprockets.
|
25
|
+
Let's see some examples:
|
77
26
|
|
78
27
|
|
79
|
-
## JavaScript
|
28
|
+
## JavaScript-only libraries
|
80
29
|
|
81
30
|
You can simply reference plain JS libraries that do not require other assets (CSS, images) like this:
|
82
31
|
|
@@ -91,7 +40,7 @@ You can simply reference plain JS libraries that do not require other assets (CS
|
|
91
40
|
|
92
41
|
//= require 'pakunok/innershiv'
|
93
42
|
|
94
|
-
// jQuery plug-ins do no
|
43
|
+
// jQuery plug-ins do no depend on jQuery to allow using as a separate HTTP resource
|
95
44
|
//= require 'pakunok/jquery.form'
|
96
45
|
//= require 'pakunok/jquery.jscrollpane'
|
97
46
|
//= require 'pakunok/jquery.mousewheel'
|
@@ -103,8 +52,6 @@ You can simply reference plain JS libraries that do not require other assets (CS
|
|
103
52
|
//= require 'pakunok/jquery.viewport'
|
104
53
|
```
|
105
54
|
|
106
|
-
It is also possible to reference the assets directly from the views.
|
107
|
-
|
108
55
|
## Libraries with related resources
|
109
56
|
|
110
57
|
If the library has a related CSS file, then it can be included into your CSS (or served as a separate file).
|
@@ -122,26 +69,23 @@ It is named after the JavaScript library.
|
|
122
69
|
|
123
70
|
# Precompilation
|
124
71
|
By default Rails precompiles all the assets of all included libraries.
|
125
|
-
This means that
|
72
|
+
This means that _ALL_ of the assets will be compiled (although you rarely need that).
|
126
73
|
|
127
|
-
Please run `RAILS_ENV=production bundle exec rake assets:clean assets:precompile && tree public/assets` to verify necessary
|
74
|
+
Please run `RAILS_ENV=production bundle exec rake assets:clean assets:precompile && tree public/assets` to verify necessary files.
|
128
75
|
|
129
|
-
It is recommended to change the default behaviour so that you
|
76
|
+
It is recommended to change the default behaviour so that you are not precompiling assets that the application will never use:
|
130
77
|
|
131
78
|
```ruby
|
132
79
|
# config/application.rb
|
133
80
|
|
134
|
-
# Something like this is the default
|
81
|
+
# Something like this is the Rails default
|
135
82
|
#config.assets.precompile = [/\w+\.(?!js|css).+/, /application.(css|js)$/]
|
136
83
|
|
137
84
|
# Recommended: Explicitly add assets that you use (colorpicker),
|
138
85
|
# so that images and styles are available.
|
139
86
|
config.assets.precompile = [/application.(css|js)$/, /pakunok\/colorpicker/]
|
140
87
|
|
141
|
-
#
|
142
|
-
config.assets.precompile = [/application.(css|js)$/, 'expclicit-file.js', 'pakunok/colorpicker']
|
143
|
-
|
144
|
-
# Exclude all pakunok assets from precompilation (it's ok if you reference only JS)
|
88
|
+
# Exclude all pakunok assets from precompilation (it's ok if you don't have direct HTTP request to them)
|
145
89
|
config.assets.precompile = [/(!pakunok)\w+\.(?!js|css).+/, /application.(css|js)$/]
|
146
90
|
|
147
91
|
# Exclude all pakunok assets, but explicitly add ones that you use (colorpicker),
|
@@ -160,9 +104,81 @@ All the files under `pakunok/jquery-ui/*` do not automatically include depndenci
|
|
160
104
|
But if you want to include all the dependencies into a single file, then use `pakunok/jquery-ui/pack/*`.
|
161
105
|
|
162
106
|
|
107
|
+
# HAML for client side templating
|
108
|
+
_Pakunok_ provides a new templating engine for Rails 3.1 that can be used to produce JavsScript templates.
|
109
|
+
|
110
|
+
What you need to do is to use `.hamljs` extension on a javascript file with the HAML content.
|
111
|
+
It will generate a plain optimised JavaScipt function that you can use on the client.
|
112
|
+
|
113
|
+
For example, assuming you have a file `app/assets/javascripts/comment.js.hamljs` with the content:
|
114
|
+
|
115
|
+
```haml
|
116
|
+
.comment
|
117
|
+
.text= text
|
118
|
+
.author= author
|
119
|
+
```
|
120
|
+
|
121
|
+
Then you can `require comment` from the `application.js`.
|
122
|
+
This gives you access to `JST.comment` function allowing you to write JavaScript like:
|
123
|
+
|
124
|
+
```javascript
|
125
|
+
var html = JST.comment({author: 'Dima', text: 'Awesome'});
|
126
|
+
$("#commit").append(html)
|
127
|
+
```
|
128
|
+
|
129
|
+
*NOTE*: [HAML-JS](https://github.com/creationix/haml-js) is a little bit different from the original HAML for Ruby.
|
130
|
+
|
131
|
+
In case _pakunok_ could magically provide a good name for your template function, you can access it as `JST['what ever it is!']`.
|
132
|
+
The name of the template function is derrived from the file name. Some examples for you:
|
133
|
+
|
134
|
+
```
|
135
|
+
file => file
|
136
|
+
file.js.erb.hamljs => file
|
137
|
+
file-with-dash.hamljs => fileWithDash
|
138
|
+
file_with_underscore => fileWithUnderscore
|
139
|
+
dir/foo_bar => dir_fooBar
|
140
|
+
win\dir\foo_bar => win_dir_fooBar
|
141
|
+
d1/d2/foo_bar.js.a.b.c.d => d1_d2_fooBar
|
142
|
+
```
|
143
|
+
|
144
|
+
Yes, it uses one global variable `JST` to add all the functions but you can change it (see example further).
|
145
|
+
|
146
|
+
_Pakunok_ will escape the HTML using simple built-in function.
|
147
|
+
The escaping function is generated inside each template resulting in larger JavaScript code base.
|
148
|
+
It is *highly* recommended to set it to your own when you have more than a couple of templates.
|
149
|
+
|
150
|
+
|
151
|
+
## HAML Configuration options
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
# Somewhere in your app...
|
155
|
+
require 'pakunok/haml_js_template'
|
156
|
+
|
157
|
+
# Change the escapeHTML function
|
158
|
+
Pakunok::HamlJsTemplate.custom_escape = 'YourApp.html_escape' # default is nil - built-in
|
159
|
+
|
160
|
+
# Change the global variable to attach templates to
|
161
|
+
Pakunok::HamlJsTemplate.root_variable = 'Templates' # default is 'JST'
|
162
|
+
|
163
|
+
|
164
|
+
# Change the prefix from where to start naming the templates
|
165
|
+
Pakunok::HamlJsTemplate.name_prefix = 'javascripts/templates' # default is 'javascripts/'
|
166
|
+
# This option will automatically be set to 'backbone/templates/' if back
|
167
|
+
```
|
168
|
+
|
169
|
+
When option `name_prefix` is not set and [rails-backbone](https://github.com/codebrew/backbone-rails) is available then `backbone/templates/` is used by default.
|
170
|
+
|
171
|
+
|
163
172
|
# Development
|
164
173
|
|
165
174
|
- Source hosted at [GitHub](https://github.com/dnagir/pakunok)
|
166
175
|
- Report issues and feature requests to [GitHub Issues](https://github.com/dnagir/pakunok/issues)
|
167
176
|
|
168
177
|
Pull requests are very welcome! But please write the specs.
|
178
|
+
|
179
|
+
To start, clone the repo and then:
|
180
|
+
|
181
|
+
```shell
|
182
|
+
bundle install
|
183
|
+
bundle exec rspec spec/
|
184
|
+
```
|
data/assets.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
List of all the assets that can be served (reference those prefixed with `pakunok/`)
|
2
|
+
|
3
|
+
- haml (also includes Rails 3.1 precompilation)
|
4
|
+
- jquery (defaults to 1.6.2)
|
5
|
+
- jquery/jquery-1.6.2
|
6
|
+
- jquery/jquery-1.5.2
|
7
|
+
- jquery.validate
|
8
|
+
- colorpicker (has CSS)
|
9
|
+
- fileuploader (has CSS)
|
10
|
+
- innershiv
|
11
|
+
- jquery.form
|
12
|
+
- jquery.validate
|
13
|
+
- jquery.jscrollpane (has CSS)
|
14
|
+
- jquery.mousewheel (optional improvement for jquery.jscrollpane)
|
15
|
+
- mwheelIntent (optional improvement for jquery.jscrollpane)
|
16
|
+
- jquery.viewport
|
17
|
+
- jquery-ui - standalone files (`jquery-ui/`): no dependencies tracked, serve these when part of jQueryUI has already been included elsewhere
|
18
|
+
- accordion
|
19
|
+
- autocomplete
|
20
|
+
- button
|
21
|
+
- core
|
22
|
+
- datepicker
|
23
|
+
- dialog
|
24
|
+
- draggable
|
25
|
+
- droppable
|
26
|
+
- effects (all effects, does not require jQuery-UI core)
|
27
|
+
- mouse
|
28
|
+
- position
|
29
|
+
- progressbar
|
30
|
+
- resizable
|
31
|
+
- selectable
|
32
|
+
- slider
|
33
|
+
- sortable
|
34
|
+
- tabs
|
35
|
+
- widget
|
36
|
+
- jquery-ui - combined (`jquery-ui/pack/`): ready-to-go options, you can include multiple into only one script file
|
37
|
+
- accordion
|
38
|
+
- autocomplete
|
39
|
+
- basic (includes core, widget, position, mouse components)
|
40
|
+
- button
|
41
|
+
- datepicker
|
42
|
+
- dialog
|
43
|
+
- draggable
|
44
|
+
- droppable
|
45
|
+
- effects (same as standalone)
|
46
|
+
- progressbar
|
47
|
+
- resizable
|
48
|
+
- selectable
|
49
|
+
- slider
|
50
|
+
- sortable
|
51
|
+
- tabs
|
data/lib/pakunok.rb
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
module Pakunok
|
2
2
|
class Engine < Rails::Engine
|
3
|
+
initializer "pakunok.configure_rails_initialization" do |app|
|
4
|
+
next unless app.config.assets.enabled
|
5
|
+
|
6
|
+
require 'sprockets'
|
7
|
+
require 'sprockets/engines'
|
8
|
+
require 'pakunok/haml_js_template'
|
9
|
+
Sprockets.register_engine '.hamljs', ::Pakunok::HamlJsTemplate
|
10
|
+
end
|
3
11
|
end
|
4
12
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'tilt/template'
|
2
|
+
|
3
|
+
module Pakunok
|
4
|
+
class HamlJsTemplate < Tilt::Template
|
5
|
+
self.default_mime_type = 'application/javascript'
|
6
|
+
|
7
|
+
|
8
|
+
def self.engine_initialized?
|
9
|
+
defined? ::ExecJS
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize_engine
|
13
|
+
require_template_library 'execjs'
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def prepare
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def evaluate(scope, locals, &block)
|
22
|
+
ns = self.class.root_variable || 'JST'
|
23
|
+
@output ||= <<-TEMPLATE
|
24
|
+
(function(scope){
|
25
|
+
(scope.#{ns} || (scope.#{ns} = {}))['#{client_name}'] = #{compile_to_function};
|
26
|
+
})(this);
|
27
|
+
TEMPLATE
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def client_name
|
32
|
+
prefix = self.class.name_prefix || if defined?(BackboneRails)
|
33
|
+
'backbone/templates/'
|
34
|
+
else
|
35
|
+
'javascripts/'
|
36
|
+
end
|
37
|
+
path = eval_file
|
38
|
+
name_start = path.rindex(prefix)
|
39
|
+
path = file[(name_start + prefix.length)..-1] if name_start
|
40
|
+
|
41
|
+
|
42
|
+
parts = path.split(/-|_/)
|
43
|
+
res = parts[0] + (parts[1..-1] || []).map {|w| w.capitalize }.join
|
44
|
+
res = res.gsub(/\/|\\/, '_')
|
45
|
+
res.split('.').first.sub(/^_/, '') # chomp of the extensions
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def compile_to_function
|
50
|
+
function = ExecJS.
|
51
|
+
compile(self.class.haml_source).
|
52
|
+
eval "Haml('#{js_string data}', {escapeHtmlByDefault: true, customEscape: #{js_custom_escape}}).toString()"
|
53
|
+
# make sure function is annonymous
|
54
|
+
function.sub /function \w+/, "function "
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def js_string str
|
59
|
+
(str || '').
|
60
|
+
gsub("'") {|m| "\\'" }.
|
61
|
+
gsub("\n") {|m| "\\n" }
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def js_custom_escape
|
66
|
+
self.class.custom_escape ? "'#{js_string self.class.custom_escape}'" : 'null'
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
class << self
|
71
|
+
attr_accessor :custom_escape
|
72
|
+
attr_accessor :root_variable
|
73
|
+
attr_accessor :name_prefix
|
74
|
+
|
75
|
+
def haml_source
|
76
|
+
# Haml source is an asset
|
77
|
+
@haml_source ||= IO.read File.expand_path('../../../vendor/assets/javascripts/pakunok/haml.js', __FILE__)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
data/lib/pakunok/version.rb
CHANGED
data/pakunok.gemspec
CHANGED
File without changes
|
File without changes
|