pagescript 0.2.0 → 0.3.0

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.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +137 -0
  4. data/Rakefile +21 -0
  5. data/app/assets/config/pagescript_manifest.js +1 -0
  6. data/app/assets/javascripts/pagescript.js +125 -0
  7. data/app/assets/stylesheets/pagescript/application.css +15 -0
  8. data/lib/pagescript.rb +6 -0
  9. data/lib/pagescript/engine.rb +9 -0
  10. data/lib/pagescript/helpers/tags_helper.rb +60 -0
  11. data/lib/pagescript/version.rb +3 -0
  12. data/spec/dummy/Rakefile +6 -0
  13. data/spec/dummy/app/assets/config/manifest.js +5 -0
  14. data/spec/dummy/app/assets/javascripts/application.js +33 -0
  15. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  16. data/spec/dummy/app/controllers/application_controller.rb +4 -0
  17. data/spec/dummy/app/controllers/haikus_controller.rb +14 -0
  18. data/spec/dummy/app/helpers/application_helper.rb +4 -0
  19. data/spec/dummy/app/models/haiku.rb +5 -0
  20. data/spec/dummy/app/views/haikus/index.html.erb +13 -0
  21. data/spec/dummy/app/views/haikus/new.html.erb +3 -0
  22. data/spec/dummy/app/views/haikus/show.html.erb +5 -0
  23. data/spec/dummy/app/views/layouts/application.html.erb +16 -0
  24. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  25. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  26. data/spec/dummy/bin/bundle +3 -0
  27. data/spec/dummy/bin/rails +4 -0
  28. data/spec/dummy/bin/rake +4 -0
  29. data/spec/dummy/bin/setup +34 -0
  30. data/spec/dummy/bin/update +29 -0
  31. data/spec/dummy/config.ru +5 -0
  32. data/spec/dummy/config/application.rb +22 -0
  33. data/spec/dummy/config/boot.rb +5 -0
  34. data/spec/dummy/config/cable.yml +9 -0
  35. data/spec/dummy/config/environment.rb +5 -0
  36. data/spec/dummy/config/environments/development.rb +51 -0
  37. data/spec/dummy/config/environments/test.rb +42 -0
  38. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  39. data/spec/dummy/config/initializers/assets.rb +11 -0
  40. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  41. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  42. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  43. data/spec/dummy/config/initializers/inflections.rb +16 -0
  44. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  45. data/spec/dummy/config/initializers/new_framework_defaults.rb +21 -0
  46. data/spec/dummy/config/initializers/session_store.rb +3 -0
  47. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  48. data/spec/dummy/config/locales/en.yml +23 -0
  49. data/spec/dummy/config/puma.rb +47 -0
  50. data/spec/dummy/config/routes.rb +3 -0
  51. data/spec/dummy/config/secrets.yml +22 -0
  52. data/spec/dummy/config/spring.rb +6 -0
  53. data/spec/dummy/log/test.log +37 -0
  54. data/spec/dummy/public/404.html +67 -0
  55. data/spec/dummy/public/422.html +67 -0
  56. data/spec/dummy/public/500.html +66 -0
  57. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  58. data/spec/dummy/public/apple-touch-icon.png +0 -0
  59. data/spec/dummy/public/favicon.ico +0 -0
  60. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-a/-aX9Yk8ywq6ZNPFEh9x8ZXUaKG9XFVqq8Qe9pE8jYEA.cache +1 -0
  61. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0Q/0QUwm-186bFoV7AViyynrzoj-7yzGD5By1fEpB2uxVo.cache +2 -0
  62. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2K/2KOLH54mhXL0432j0sUROyG3QXNSteLvubePSU6JKGk.cache +1 -0
  63. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2Y/2Yxyfmf6W4pqC3WQ6tpt5Wh8teZlZElaRzJkLfYs17M.cache +0 -0
  64. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/44/44BQmJl1Jgw0aArQu3fgjMySa-iNLYB_GkYZX1p49Do.cache +2 -0
  65. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9o/9oV17Pqvr4n5vPsYQG3ThkqetgHhyg8NpqutJZ5gAe8.cache +1 -0
  66. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bh/Bhc1z03rEiBD6gs8mAXjqNOibA-_pA4qmvPyjSgECuo.cache +1 -0
  67. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/CR/CRAjazM6UdeSHQf3veWIBtbRjNfQQTFhWWJ-IJXwi0c.cache +3 -0
  68. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cw/Cwdcaf1mJHhaYA36TsU77OPqZnJuwTWa1DeB5f2lk6E.cache +1 -0
  69. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/EX/EX_WKAJGVlPMg5zwBKnMGl5U9CHYyLk2qxbCxuRPThQ.cache +2 -0
  70. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Et/Et0SNyP-LInBe4_tGeAtKOzgOTB_ZTrdgvEFCMIibV8.cache +1 -0
  71. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F7/F7djknrhxZzDPkr_GuNlLI42uZucXTil7rkXu2Y1uC4.cache +0 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FK/FK7dFJpljHVHEgfFDKbzQxc3bN1cBS6aSJ-DOMlqIKE.cache +1 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hp/HpUhFMmSUe4uCbQU6s6bG1PnrDgA1H9_9o0RrJhBgQ0.cache +2 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Jy/JyE243RJvJzq3yK-XqdyUe7zU9T6yPuY_EgZ3bWlnGA.cache +0 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/La/LaIBsM-mWqVhZAmk7D_BWHCeRDXV8vg6WvlE0B2XRaY.cache +1 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/NR/NR8R5f_QAUHndvPgXstl0cFg2tpLVrAsYaBuTZt_my4.cache +1 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/P5/P5sQBymdtF9XBsdSsgjmCLl_ORDWblQp1mpor46xJJg.cache +0 -0
  78. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Pw/PwjCIwNybpEUCYlZaKIZAws5YGks7lVzWV9SeHmTqac.cache +1 -0
  79. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QO/QOvpUM1_uH4V310ujW5C0kMeUlikClz4YXa0XSpwkwA.cache +2 -0
  80. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qw/QwzTWa228RodRfDR7WXC0QDEwzOzeVnSUKmxYDPrBxE.cache +2 -0
  81. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RU/RUFMlDf7ywaGVksh50Vk8_ONxwa4eYivyhfDH6J8CtA.cache +1 -0
  82. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V9/V9s1wLOdRtuJ74soXvCFMzbg17kLZxHa4w38rQxEpBc.cache +1 -0
  83. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W_/W_mQqQPd_8QBLVXKKQ10CBW7NAvJvF_-NaduHDHQOoM.cache +1 -0
  84. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yw/YwwwIoIi78wfB4J-Zs2BLGOirh1dJ8_FQuyuxZGykq4.cache +1 -0
  85. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ap/apD-0maW7C6annZSgLs5trt4EtDUGOB116_kayPXKVI.cache +0 -0
  86. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bI/bIGc1lmBvbXcF9e-rFY05l-olKGgid1fK_LZ5wU7lHE.cache +0 -0
  87. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cD/cD6lksrcljcRHGndfCqKKDF_w8TQMxTakOGjxB0K3_8.cache +1 -0
  88. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/el/elVa94gSE1wrKZXkRFEHPfP1x7vOc7aLY4ApIopl-DM.cache +1 -0
  89. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fN/fNM97zlRlEo55oJjbyozttYPHQf1Q0KCnhzcRYjfdNs.cache +1 -0
  90. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fQ/fQ9HtpTjfAGLh0l6oo-Xrr6GhWKlvgRRB7vPpGyjQ6Q.cache +1 -0
  91. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gj/gjbuFfGzO6JtMDzQwTjsKLQzM6iNnWoTO75xJexVgW4.cache +2 -0
  92. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/h6/h6AXhPdiVtyEEmqBLOSJKh9xt6V9LQtOVK0X1EKEfCM.cache +1 -0
  93. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hF/hFAc_e-m9RsUzbJ-j0znwH0gO1GabvsEk6-NIx8SoC4.cache +0 -0
  94. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/i8/i8Pwia6e1VcMTF-76YtlYRvbj6YsIRz94H6XCG2EpcY.cache +1 -0
  95. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +0 -0
  96. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +0 -0
  97. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qv/qvBZRNrA3BgC-8ZhUkrkQeIm7uObAakyTvcIfn2Yusk.cache +0 -0
  98. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rN/rNflwRtdyDrdC7dBuqwIKxXkfRUPWL1YjuvazJQtrck.cache +0 -0
  99. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sz/sz2VK7Ev0ExN5b-fZ51PqWIaUzXqODmWw6fXlNXOKBA.cache +0 -0
  100. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tN/tN7UU773XH9oEu5z0jnw1uKLKV_4UG5YHTOdsAyPHiM.cache +3 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/u-/u-9psQcvMhMVXGCghlghMq5CxdjWbUfBTDsLPccAe5k.cache +1 -0
  102. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xA/xAwVWATNEW09m5X31uBt_T3rxHC0nStO8akIoBmmPUg.cache +1 -0
  103. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xU/xUUA7mtxZIxTVdmDMa6sqgpOkubyGjAvNkeMGEB1peM.cache +0 -0
  104. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zJ/zJSuXh9W2t5W2MRaoTu4trOegf0HoyuaRWOTPZdavPo.cache +1 -0
  105. data/spec/examples.txt +22 -0
  106. data/spec/features/pagescript_js_spec.rb +35 -0
  107. data/spec/helpers/pagescript/tags_helper_spec.rb +98 -0
  108. data/spec/rails_helper.rb +48 -0
  109. data/spec/spec_helper.rb +96 -0
  110. metadata +226 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 209386553acce320c125f04412f86c3b980e1d39
4
- data.tar.gz: 4d9bd8086a239d56595d7a84c196849ece8abe85
3
+ metadata.gz: cf788c27bc7710e84c048a762da8f5ea3de504d3
4
+ data.tar.gz: 712e21fa0c410c61db48cc8cac287424fd7831c0
5
5
  SHA512:
6
- metadata.gz: 363a152f746ae6478b181f195893b84295e72c4696916288723767a8cd3c2624f0aa4c00f09f42f6a48c5a03943e06a900b49dd6a57002d4209301529910b861
7
- data.tar.gz: 834d210617c0302b15b99e0ecc2cc7b66e5953158ad633b1882a61bfd7d13f5052a4c2965e848b3730d9bf982c4cf409dc7f5c860241eb40b8f377f84359cf47
6
+ metadata.gz: fb896ad96e0ff850547c6919c9757c77045abcbd5f74be4db91377569ad998768eabfe1a8163c63522c1729b82253c084cc687c663f89b449a0201f85e49b939
7
+ data.tar.gz: 7c2e61a82c66b59bfaaf17324fcc61b902c608b1b6926a3f74b05d97fc672ca79711f0cd5cc0ec347f6c9f066b4299ace8f64ecd13924e25d181c38f548786ba
@@ -0,0 +1,20 @@
1
+ Copyright 2016 Max Calabrese
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,137 @@
1
+ # Pagescript
2
+
3
+ So you're ready to put on the big girl/boy pants and stop using inline
4
+ script tags in your views?
5
+
6
+ Can't figure out how to hook javascript to specific actions in your Rails app?
7
+
8
+ Pagescript can help. It fires custom events based on what controller / action
9
+ was called and makes it simple to add event handlers.
10
+
11
+ Pagescript is intended for classical web applications where Rails
12
+ handles rendering views. SPA's have better mechanisms for this anyways.
13
+
14
+ It is designed to integrate seamlessly with [Turbolinks](https://github.com/turbolinks/turbolinks).
15
+
16
+ ## Dependencies
17
+ - Sprockets
18
+ - jQuery
19
+ - Turbolinks (optional)
20
+
21
+ ## Installation
22
+ Add this line to your application's Gemfile:
23
+
24
+ ```ruby
25
+ gem 'pagescript'
26
+ ```
27
+
28
+ And then execute:
29
+ ```bash
30
+ $ bundle
31
+ ```
32
+
33
+ ## Usage
34
+
35
+ Replace your the body tag in your `app/views/layouts/application.html.erb`
36
+ with `<%= body_tag %>`. This adds [*data* attributes](https://developer.mozilla.org/docs/Web/Guide/HTML/Using_data_attributes) that we can hook onto.
37
+
38
+ You can optionally pass the `params_as_metadata: true` option to attach
39
+ the url parameters to the body element. See [The pagescript event][#the-pagescript-event] for more details.
40
+
41
+ ```javascript
42
+ //= pagescript
43
+ Pagescript.on('users#*', function(){
44
+ console.log('some action belonging to UsersController was rendered');
45
+ }) // all methods are chainable
46
+ .on('users#show', function(){
47
+ console.log('Users#show action was called');
48
+ }) // you can remove handlers as well.
49
+ .off('users#*');
50
+
51
+ // This is only required if you are not using Turbolinks
52
+ Pagescript.jumpstart();
53
+ ```
54
+
55
+ Note that you should not wrap this in a `$(document).ready` callback.
56
+
57
+ ## Pagescript Event types
58
+ On each page replacement (or load) Pagescript will fire multiple events that you can listen to.
59
+ `*` symbolizes a wildcard.
60
+
61
+ ```JS
62
+ // A specific controller_name and action
63
+ $.on('pagescript:controller_name#action_name')
64
+ // Any action belonging to a specific controller
65
+ $.on('pagescript:controller_name#*')
66
+ // Any action matching action_name
67
+ $.on('pagescript:*#action_name')
68
+ // Any page load
69
+ $.on('pagescript:*')
70
+ ```
71
+
72
+ When using the Pagescript API methods you don't need to include the `pagescript:`
73
+ "namespace".
74
+
75
+ ## The Pagescript Event
76
+ The [Event object](https://api.jquery.com/category/events/event-object/) which
77
+ is passed to event handlers has the following extra properties:
78
+
79
+ - controller [String]
80
+ - action [String]
81
+ - params [object]
82
+
83
+ The params object is only populated if you have used the `params_as_metadata: true` option.
84
+
85
+ ```erb
86
+ <%= body_tag(params_as_metadata: true) %>
87
+ ```
88
+
89
+ The param keys are cast to `camelCase` by jQuery.
90
+
91
+ ## Javascript API
92
+ All methods return the Pagescript module and can be chained.
93
+
94
+ When using the Pagescript API methods you don't need to include the `pagescript:`
95
+ "namespace" in the event name.
96
+
97
+ `on`, `off` and `one` proxy to their jQuery counterparts. Please see the jQuery
98
+ documentation for more details.
99
+
100
+ ### Pagescript.kickstart
101
+ Used to start hook Pagescript to the `document.ready` event in the absense of
102
+ Turbolinks
103
+
104
+ ### Pagescript.off
105
+ Removes all handlers for the given event.
106
+ See [jQuery.off](http://api.jquery.com/off/)
107
+
108
+ ### Pagescript.on
109
+ Attaches an event handler to a controller, a particular action or any action
110
+ matching the name.
111
+
112
+ ```JS
113
+ Pagescript.on('foo#bar', function(e){
114
+ console.log( e.controller, e.action_name, e.params );
115
+ // "foo", "bar", {}
116
+ });
117
+ ```
118
+
119
+ See [jQuery.on](http://api.jquery.com/on/)
120
+
121
+ ### Pagescript.one
122
+ Like `.on`, but the handler only fires once.
123
+
124
+ See [jQuery.one](http://api.jquery.com/one/)
125
+
126
+ ### Pagescript.start
127
+ Adds the main event handler which Pagescript hinges on.
128
+
129
+ ### Pagescript.stop
130
+ Halts any Pagescript events from being fired - does not remove user created handlers. Call `.start` to reverse the effect.
131
+
132
+ ## License
133
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
134
+
135
+ ## Want to help?
136
+ See [Contributing](CONTRIBUTING.md) for how you can help and [Devlopment](DEVELOPMENT.md) for instructions to setup the test suite and
137
+ what is expected of you.
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+ require 'bundler/gem_tasks'
9
+ require 'yard'
10
+ require 'rspec/core/rake_task'
11
+
12
+ Bundler::GemHelper.install_tasks
13
+
14
+ APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
15
+ load 'rails/tasks/engine.rake'
16
+ load 'rails/tasks/statistics.rake'
17
+
18
+ YARD::Rake::YardocTask.new
19
+ RSpec::Core::RakeTask.new(:spec)
20
+
21
+ task default: :spec
@@ -0,0 +1 @@
1
+ //= link_directory ../javascripts/pagescript .js
@@ -0,0 +1,125 @@
1
+ //= require jquery
2
+ var Pagescript = (function(ps, $){
3
+ var $doc = $(document);
4
+
5
+ // "private" methods
6
+ function namespace(str){
7
+ return str.match(/pagescript:/) ? str : 'pagescript:' + str;
8
+ }
9
+
10
+ function trigger(str, data){
11
+ return $doc.trigger({
12
+ type: namespace(str),
13
+ controller: data.controller,
14
+ action: data.action,
15
+ params: filter_params(data)
16
+ });
17
+ }
18
+
19
+ function filter_params(obj) {
20
+ var re = /^params([A-Z])(.*)/;
21
+ var filtered = {};
22
+ $.each( obj, function( key, value ) {
23
+ var matches = key.match(re);
24
+ if (matches) {
25
+ filtered[ matches[1].toLowerCase() + (matches[2] || "") ] = value;
26
+ }
27
+ });
28
+ return filtered;
29
+ }
30
+
31
+
32
+ function parseEvents(str) {
33
+ return jQuery.map(str.split(' '), function(s){
34
+ return namespace(s);
35
+ }).join(' ');
36
+ }
37
+
38
+ // Integrate with turbolinks
39
+ // 'page:change' is the turbolinks-classic api
40
+ // 'turbolinks:load' is the Turbolinks 5+ api
41
+ $doc.on('page:change turbolinks:load', function(){
42
+ $doc.trigger('pagescript:load');
43
+ });
44
+
45
+ /**
46
+ * Adds the main event handler
47
+ * @api
48
+ * @return this [Object]
49
+ */
50
+ ps.start = function() {
51
+ ps.stop();
52
+ $doc.on('pagescript:load', function(){
53
+ var data = $('body').data();
54
+ trigger(data.controller + "#" + data.action, data);
55
+ trigger(data.controller + "#*", data);
56
+ trigger("*#" + data.action , data);
57
+ trigger('*', data);
58
+ });
59
+ return ps;
60
+ };
61
+ /**
62
+ * Halts any Pagescript events from being fired - does not remove the handlers.
63
+ * @api
64
+ * @return this [Object]
65
+ **/
66
+ ps.stop = function(){
67
+ $doc.off('pagescript:load');
68
+ return this;
69
+ };
70
+ /**
71
+ * Used to hook Pagescript to the `document.ready`
72
+ * event in the absense of Turbolinks.
73
+ * @api
74
+ * @return this [Object]
75
+ **/
76
+ ps.kickstart = function(){
77
+ $doc.ready(function(){ $doc.trigger('pagescript:load'); });
78
+ return this;
79
+ };
80
+ /**
81
+ * Attaches an event handler to a controller, a particular action or any action.
82
+ * @api
83
+ * @param events [String]
84
+ * @param selector [String] optional
85
+ * @param data [Object] optional
86
+ * @param handler [Function]
87
+ * @return this [Object]
88
+ **/
89
+ ps.on = function( events, selector, data, handler ){
90
+ var args = $.makeArray( arguments );
91
+ args[0] = parseEvents(args[0]);
92
+ $doc.on.apply($doc, args);
93
+ return this;
94
+ };
95
+ /**
96
+ * @api
97
+ * @param events [String]
98
+ * @param selector [String] optional
99
+ * @param handler [Function]
100
+ * @return this [Object]
101
+ **/
102
+ ps.off = function( events, selector, handler ){
103
+ var args = $.makeArray( arguments );
104
+ args[0] = parseEvents(args[0]);
105
+ $doc.off.apply($doc, args);
106
+ return this;
107
+ };
108
+ /**
109
+ * @api
110
+ * @param events [String]
111
+ * @param selector [String] optional
112
+ * @param data [Object] optional
113
+ * @param handler [Function]
114
+ * @return this [Object]
115
+ **/
116
+ ps.one = function( events, selector, data, handler ){
117
+ var args = $.makeArray( arguments );
118
+ args[0] = parseEvents(args[0]);
119
+ $doc.one.apply($doc, args);
120
+ return this;
121
+ }
122
+
123
+ // Export module
124
+ return ps.start();
125
+ }(Pagescript || {}, jQuery));
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,6 @@
1
+ require 'pagescript/helpers/tags_helper'
2
+ require 'pagescript/engine'
3
+
4
+ # Main level module for engine
5
+ module Pagescript
6
+ end
@@ -0,0 +1,9 @@
1
+ module Pagescript
2
+ # Main Rails integration.
3
+ # Used primarily to add the gem assets to the Sprockets pipeline.
4
+ class Engine < ::Rails::Engine
5
+ require 'jquery-rails'
6
+ isolate_namespace Pagescript
7
+ ActionView::Base.send :include, Pagescript::TagsHelper
8
+ end
9
+ end
@@ -0,0 +1,60 @@
1
+ module Pagescript
2
+ # A helper that creates elements with metadata attached as data attributes.
3
+ module TagsHelper
4
+ # Generates a `<body>` tag
5
+ # with HTML5 data attributes for the controller & action name.
6
+ # The keyword arguments are forwarded to tag and content_tag.
7
+ # @see http://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html ActionView::Helpers::TagHelper
8
+ # @return [String]
9
+ # @yield Yields flow to an optional block.
10
+ # Using a block adds a closing </body> tag.
11
+ # @param [Boolean] params_as_metadata default: false.
12
+ # Includes params from the URL as data attributes.
13
+ # The data attributes are prefixed with `param-`.
14
+ # Underscores in the param name are converted to '-'.
15
+ # @example when called without a block
16
+ # body_tag
17
+ # => <body data-controller="foo" data-action="bar">
18
+ # @example when called with a block
19
+ # body_tag { 'hello world' }
20
+ # => <body data-controller="foo" data-action="bar">Hello World</body>
21
+ # @example when called with keyword arguments
22
+ # body_tag(foo: 'bar', data: { x: 2 })
23
+ # => <body data-controller="foo" data-action="bar" foo="" data-x="2">
24
+ # @example when params_as_metadata is true
25
+ # body_tag(params_as_metadata: true)
26
+ # => <body data-controller="foo" data-action="bar" data-params-user-id="2">
27
+ # @since 0.1.0
28
+ # @api
29
+ def body_tag(params_as_metadata: false, **kwargs)
30
+ options = kwargs.deep_merge( data: data_attrs(params_as_metadata) )
31
+ if block_given?
32
+ content_tag(:body, options) { yield }
33
+ else
34
+ tag(:body, options, true)
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def data_attrs(params_as_metadata = false)
41
+ {
42
+ controller: controller_name,
43
+ action: action_name
44
+ }.tap do |hash|
45
+ if params_as_metadata
46
+ params_from_url.each do |k, v|
47
+ hash["params-#{k}"] = v
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def params_from_url
54
+ {}.tap do |h|
55
+ h.merge! request.path_parameters
56
+ h.merge! request.query_parameters
57
+ end.except(:controller, :action)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,3 @@
1
+ module Pagescript
2
+ VERSION = '0.3.0'.freeze
3
+ end
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative 'config/application'
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,5 @@
1
+
2
+ //= link_tree ../images
3
+ //= link_directory ../javascripts .js
4
+ //= link_directory ../stylesheets .css
5
+ //= link pagescript_manifest.js
@@ -0,0 +1,33 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //= require jquery
13
+ //= require jquery_ujs
14
+ //= require pagescript
15
+ //= require_tree .
16
+
17
+ function log(e){
18
+ $("#logger").append('<li>'+e.type+'</li>');
19
+ }
20
+
21
+ Pagescript
22
+ .on('haikus#* *#index haikus#index', log)
23
+ .on('*#show', log)
24
+ .on('haikus#show', log)
25
+ .on('pagescript:*', function(e){
26
+ $('#test').text(JSON.stringify({
27
+ type: e.type,
28
+ params: e.params,
29
+ action: e.action,
30
+ controller: e.controller
31
+ }));
32
+ })
33
+ .kickstart();