tennpipes-init 3.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.rdoc +163 -0
  4. data/Rakefile +1 -0
  5. data/bin/tennpipes-init +16 -0
  6. data/lib/tennpipes-init.rb +73 -0
  7. data/lib/tennpipes-init/command.rb +18 -0
  8. data/lib/tennpipes-init/generators/actions.rb +630 -0
  9. data/lib/tennpipes-init/generators/app.rb +75 -0
  10. data/lib/tennpipes-init/generators/app/app.rb.tt +72 -0
  11. data/lib/tennpipes-init/generators/app/app.rb.tt~ +72 -0
  12. data/lib/tennpipes-init/generators/cli.rb +57 -0
  13. data/lib/tennpipes-init/generators/component.rb +73 -0
  14. data/lib/tennpipes-init/generators/components/actions.rb +208 -0
  15. data/lib/tennpipes-init/generators/components/mocks/mocha.rb +10 -0
  16. data/lib/tennpipes-init/generators/components/mocks/rr.rb +13 -0
  17. data/lib/tennpipes-init/generators/components/orms/activerecord.rb +201 -0
  18. data/lib/tennpipes-init/generators/components/orms/couchrest.rb +55 -0
  19. data/lib/tennpipes-init/generators/components/orms/datamapper.rb +140 -0
  20. data/lib/tennpipes-init/generators/components/orms/dynamoid.rb +67 -0
  21. data/lib/tennpipes-init/generators/components/orms/minirecord.rb +165 -0
  22. data/lib/tennpipes-init/generators/components/orms/mongoid.rb +113 -0
  23. data/lib/tennpipes-init/generators/components/orms/mongomapper.rb +43 -0
  24. data/lib/tennpipes-init/generators/components/orms/mongomatic.rb +84 -0
  25. data/lib/tennpipes-init/generators/components/orms/ohm.rb +65 -0
  26. data/lib/tennpipes-init/generators/components/orms/ripple.rb +75 -0
  27. data/lib/tennpipes-init/generators/components/orms/sequel.rb +99 -0
  28. data/lib/tennpipes-init/generators/components/renderers/erb.rb +3 -0
  29. data/lib/tennpipes-init/generators/components/renderers/haml.rb +3 -0
  30. data/lib/tennpipes-init/generators/components/renderers/liquid.rb +4 -0
  31. data/lib/tennpipes-init/generators/components/renderers/slim.rb +3 -0
  32. data/lib/tennpipes-init/generators/components/scripts/dojo.rb +10 -0
  33. data/lib/tennpipes-init/generators/components/scripts/extcore.rb +10 -0
  34. data/lib/tennpipes-init/generators/components/scripts/jquery.rb +10 -0
  35. data/lib/tennpipes-init/generators/components/scripts/mootools.rb +10 -0
  36. data/lib/tennpipes-init/generators/components/scripts/prototype.rb +12 -0
  37. data/lib/tennpipes-init/generators/components/scripts/rightjs.rb +10 -0
  38. data/lib/tennpipes-init/generators/components/stylesheets/compass.rb +39 -0
  39. data/lib/tennpipes-init/generators/components/stylesheets/compass/application.scss +43 -0
  40. data/lib/tennpipes-init/generators/components/stylesheets/compass/partials/_base.scss +12 -0
  41. data/lib/tennpipes-init/generators/components/stylesheets/less.rb +25 -0
  42. data/lib/tennpipes-init/generators/components/stylesheets/sass.rb +15 -0
  43. data/lib/tennpipes-init/generators/components/stylesheets/scss.rb +16 -0
  44. data/lib/tennpipes-init/generators/components/tests/bacon.rb +103 -0
  45. data/lib/tennpipes-init/generators/components/tests/cucumber.rb +86 -0
  46. data/lib/tennpipes-init/generators/components/tests/minitest.rb +110 -0
  47. data/lib/tennpipes-init/generators/components/tests/riot.rb +117 -0
  48. data/lib/tennpipes-init/generators/components/tests/rspec.rb +111 -0
  49. data/lib/tennpipes-init/generators/components/tests/shoulda.rb +114 -0
  50. data/lib/tennpipes-init/generators/components/tests/steak.rb +114 -0
  51. data/lib/tennpipes-init/generators/controller.rb +77 -0
  52. data/lib/tennpipes-init/generators/helper.rb +50 -0
  53. data/lib/tennpipes-init/generators/mailer.rb +52 -0
  54. data/lib/tennpipes-init/generators/migration.rb +43 -0
  55. data/lib/tennpipes-init/generators/model.rb +113 -0
  56. data/lib/tennpipes-init/generators/plugin.rb +67 -0
  57. data/lib/tennpipes-init/generators/project.rb +160 -0
  58. data/lib/tennpipes-init/generators/project/config.ru +9 -0
  59. data/lib/tennpipes-init/generators/project/config/apps.rb.tt +35 -0
  60. data/lib/tennpipes-init/generators/project/config/boot.rb +49 -0
  61. data/lib/tennpipes-init/generators/project/public/favicon.ico +0 -0
  62. data/lib/tennpipes-init/generators/project/public/images/booking.com.png +0 -0
  63. data/lib/tennpipes-init/generators/project/public/images/causes.png +0 -0
  64. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bg.jpg +0 -0
  65. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bluelogo.png +0 -0
  66. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_bluelogo.svg +68 -0
  67. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_whitelogo.png +0 -0
  68. data/lib/tennpipes-init/generators/project/public/images/ennkeypee_whitelogo.svg +65 -0
  69. data/lib/tennpipes-init/generators/project/public/images/forever21.png +0 -0
  70. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.eot +0 -0
  71. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.svg +970 -0
  72. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.ttf +0 -0
  73. data/lib/tennpipes-init/generators/project/public/images/icons/foundation-icons.woff +0 -0
  74. data/lib/tennpipes-init/generators/project/public/images/icons/tennpipes-icons.css +598 -0
  75. data/lib/tennpipes-init/generators/project/public/images/image1.jpg +0 -0
  76. data/lib/tennpipes-init/generators/project/public/images/image11.jpg +0 -0
  77. data/lib/tennpipes-init/generators/project/public/images/image2.jpg +0 -0
  78. data/lib/tennpipes-init/generators/project/public/images/image3.jpg +0 -0
  79. data/lib/tennpipes-init/generators/project/public/images/intuit.png +0 -0
  80. data/lib/tennpipes-init/generators/project/public/images/krispykreme.png +0 -0
  81. data/lib/tennpipes-init/generators/project/public/images/placeholders/README.md +302 -0
  82. data/lib/tennpipes-init/generators/project/public/images/placeholders/bower.json +4 -0
  83. data/lib/tennpipes-init/generators/project/public/images/placeholders/composer.json +34 -0
  84. data/lib/tennpipes-init/generators/project/public/images/placeholders/gulpfile.js +92 -0
  85. data/lib/tennpipes-init/generators/project/public/images/placeholders/holder.js +1920 -0
  86. data/lib/tennpipes-init/generators/project/public/images/placeholders/holder.min.js +12 -0
  87. data/lib/tennpipes-init/generators/project/public/images/placeholders/package.json +46 -0
  88. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/holder.js +1411 -0
  89. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/augment.js +27 -0
  90. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/ondomready.js +155 -0
  91. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/lib/polyfills.js +177 -0
  92. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/scenegraph.js +101 -0
  93. data/lib/tennpipes-init/generators/project/public/images/placeholders/src/utils.js +129 -0
  94. data/lib/tennpipes-init/generators/project/public/images/priceline.com.png +0 -0
  95. data/lib/tennpipes-init/generators/project/public/images/stripe.png +0 -0
  96. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes.min.js +6081 -0
  97. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.abide.js +340 -0
  98. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.accordion.js +67 -0
  99. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.alert.js +43 -0
  100. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.clearing.js +556 -0
  101. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.dropdown.js +448 -0
  102. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.equalizer.js +77 -0
  103. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.interchange.js +354 -0
  104. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.joyride.js +932 -0
  105. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.js +703 -0
  106. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.magellan.js +203 -0
  107. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.offcanvas.js +152 -0
  108. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.orbit.js +476 -0
  109. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.reveal.js +471 -0
  110. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.slider.js +263 -0
  111. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.tab.js +237 -0
  112. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.tooltip.js +307 -0
  113. data/lib/tennpipes-init/generators/project/public/javascripts/tennpipes/tennpipes.topbar.js +452 -0
  114. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/fastclick.js +8 -0
  115. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/jquery.cookie.js +8 -0
  116. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/jquery.js +26 -0
  117. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/modernizr.js +8 -0
  118. data/lib/tennpipes-init/generators/project/public/javascripts/vendor/placeholder.js +2 -0
  119. data/lib/tennpipes-init/generators/project/public/stylesheets/app.css~ +178 -0
  120. data/lib/tennpipes-init/generators/project/public/stylesheets/app1.css~ +177 -0
  121. data/lib/tennpipes-init/generators/project/public/stylesheets/ennkeypee.css +214 -0
  122. data/lib/tennpipes-init/generators/project/public/stylesheets/ennkeypee.css~ +214 -0
  123. data/lib/tennpipes-init/generators/project/public/stylesheets/normalize.css +427 -0
  124. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.css +6201 -0
  125. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.css~ +6201 -0
  126. data/lib/tennpipes-init/generators/project/public/stylesheets/tennpipes.min.css +1 -0
  127. data/lib/tennpipes-init/generators/runner.rb +139 -0
  128. data/lib/tennpipes-init/generators/task.rb +45 -0
  129. data/lib/tennpipes-init/generators/templates/Gemfile.tt +32 -0
  130. data/lib/tennpipes-init/generators/templates/Rakefile.tt +8 -0
  131. data/lib/tennpipes-init/generators/templates/controller.rb.tt +22 -0
  132. data/lib/tennpipes-init/generators/templates/gem/README.md.tt +29 -0
  133. data/lib/tennpipes-init/generators/templates/gem/gemspec.tt +19 -0
  134. data/lib/tennpipes-init/generators/templates/gem/lib/libname.tt +6 -0
  135. data/lib/tennpipes-init/generators/templates/gem/lib/libname/version.tt +3 -0
  136. data/lib/tennpipes-init/generators/templates/helper.rb.tt +13 -0
  137. data/lib/tennpipes-init/generators/templates/initializer.rb.tt +5 -0
  138. data/lib/tennpipes-init/generators/templates/mailer.rb.tt +54 -0
  139. data/lib/tennpipes-init/generators/templates/project_bin.tt +14 -0
  140. data/lib/tennpipes-init/generators/templates/task.rb.tt +7 -0
  141. data/lib/tennpipes-init/tennpipes-tasks/activerecord.rb +377 -0
  142. data/lib/tennpipes-init/tennpipes-tasks/database.rb +12 -0
  143. data/lib/tennpipes-init/tennpipes-tasks/datamapper.rb +94 -0
  144. data/lib/tennpipes-init/tennpipes-tasks/minirecord.rb +19 -0
  145. data/lib/tennpipes-init/tennpipes-tasks/mongoid.rb +215 -0
  146. data/lib/tennpipes-init/tennpipes-tasks/mongomapper.rb +55 -0
  147. data/lib/tennpipes-init/tennpipes-tasks/sequel.rb +85 -0
  148. data/lib/tennpipes-init/tennpipes-tasks/sql-helpers.rb +72 -0
  149. data/test/fixtures/admin_template.rb +7 -0
  150. data/test/fixtures/example_template.rb +15 -0
  151. data/test/fixtures/git_template.rb +4 -0
  152. data/test/fixtures/plugin_template.rb +13 -0
  153. data/test/fixtures/rake_template.rb +9 -0
  154. data/test/helper.rb +103 -0
  155. data/test/test_app_generator.rb +142 -0
  156. data/test/test_cli.rb +27 -0
  157. data/test/test_component_generator.rb +98 -0
  158. data/test/test_controller_generator.rb +272 -0
  159. data/test/test_generator.rb +13 -0
  160. data/test/test_helper_generator.rb +133 -0
  161. data/test/test_mailer_generator.rb +69 -0
  162. data/test/test_migration_generator.rb +222 -0
  163. data/test/test_model_generator.rb +553 -0
  164. data/test/test_plugin_generator.rb +152 -0
  165. data/test/test_project_generator.rb +757 -0
  166. data/test/test_task_generator.rb +53 -0
  167. metadata +285 -0
@@ -0,0 +1,27 @@
1
+ var Factory = function () {};
2
+ var slice = Array.prototype.slice;
3
+
4
+ var augment = function (base, body) {
5
+ var uber = Factory.prototype = typeof base === "function" ? base.prototype : base;
6
+ var prototype = new Factory(), properties = body.apply(prototype, slice.call(arguments, 2).concat(uber));
7
+ if (typeof properties === "object") for (var key in properties) prototype[key] = properties[key];
8
+ if (!prototype.hasOwnProperty("constructor")) return prototype;
9
+ var constructor = prototype.constructor;
10
+ constructor.prototype = prototype;
11
+ return constructor;
12
+ };
13
+
14
+ augment.defclass = function (prototype) {
15
+ var constructor = prototype.constructor;
16
+ constructor.prototype = prototype;
17
+ return constructor;
18
+ };
19
+
20
+ augment.extend = function (base, body) {
21
+ return augment(base, function (uber) {
22
+ this.uber = uber;
23
+ return body;
24
+ });
25
+ };
26
+
27
+ module.exports = augment;
@@ -0,0 +1,155 @@
1
+ /*!
2
+ * onDomReady.js 1.4.0 (c) 2013 Tubal Martin - MIT license
3
+ *
4
+ * Specially modified to work with Holder.js
5
+ */
6
+
7
+ function _onDomReady(win) {
8
+ //Lazy loading fix for Firefox < 3.6
9
+ //http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
10
+ if (document.readyState == null && document.addEventListener) {
11
+ document.addEventListener("DOMContentLoaded", function DOMContentLoaded() {
12
+ document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
13
+ document.readyState = "complete";
14
+ }, false);
15
+ document.readyState = "loading";
16
+ }
17
+
18
+ var doc = win.document,
19
+ docElem = doc.documentElement,
20
+
21
+ LOAD = "load",
22
+ FALSE = false,
23
+ ONLOAD = "on"+LOAD,
24
+ COMPLETE = "complete",
25
+ READYSTATE = "readyState",
26
+ ATTACHEVENT = "attachEvent",
27
+ DETACHEVENT = "detachEvent",
28
+ ADDEVENTLISTENER = "addEventListener",
29
+ DOMCONTENTLOADED = "DOMContentLoaded",
30
+ ONREADYSTATECHANGE = "onreadystatechange",
31
+ REMOVEEVENTLISTENER = "removeEventListener",
32
+
33
+ // W3C Event model
34
+ w3c = ADDEVENTLISTENER in doc,
35
+ _top = FALSE,
36
+
37
+ // isReady: Is the DOM ready to be used? Set to true once it occurs.
38
+ isReady = FALSE,
39
+
40
+ // Callbacks pending execution until DOM is ready
41
+ callbacks = [];
42
+
43
+ // Handle when the DOM is ready
44
+ function ready( fn ) {
45
+ if ( !isReady ) {
46
+
47
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
48
+ if ( !doc.body ) {
49
+ return defer( ready );
50
+ }
51
+
52
+ // Remember that the DOM is ready
53
+ isReady = true;
54
+
55
+ // Execute all callbacks
56
+ while ( fn = callbacks.shift() ) {
57
+ defer( fn );
58
+ }
59
+ }
60
+ }
61
+
62
+ // The ready event handler
63
+ function completed( event ) {
64
+ // readyState === "complete" is good enough for us to call the dom ready in oldIE
65
+ if ( w3c || event.type === LOAD || doc[READYSTATE] === COMPLETE ) {
66
+ detach();
67
+ ready();
68
+ }
69
+ }
70
+
71
+ // Clean-up method for dom ready events
72
+ function detach() {
73
+ if ( w3c ) {
74
+ doc[REMOVEEVENTLISTENER]( DOMCONTENTLOADED, completed, FALSE );
75
+ win[REMOVEEVENTLISTENER]( LOAD, completed, FALSE );
76
+ } else {
77
+ doc[DETACHEVENT]( ONREADYSTATECHANGE, completed );
78
+ win[DETACHEVENT]( ONLOAD, completed );
79
+ }
80
+ }
81
+
82
+ // Defers a function, scheduling it to run after the current call stack has cleared.
83
+ function defer( fn, wait ) {
84
+ // Allow 0 to be passed
85
+ setTimeout( fn, +wait >= 0 ? wait : 1 );
86
+ }
87
+
88
+ // Attach the listeners:
89
+
90
+ // Catch cases where onDomReady is called after the browser event has already occurred.
91
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
92
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
93
+ if ( doc[READYSTATE] === COMPLETE ) {
94
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
95
+ defer( ready );
96
+
97
+ // Standards-based browsers support DOMContentLoaded
98
+ } else if ( w3c ) {
99
+ // Use the handy event callback
100
+ doc[ADDEVENTLISTENER]( DOMCONTENTLOADED, completed, FALSE );
101
+
102
+ // A fallback to window.onload, that will always work
103
+ win[ADDEVENTLISTENER]( LOAD, completed, FALSE );
104
+
105
+ // If IE event model is used
106
+ } else {
107
+ // Ensure firing before onload, maybe late but safe also for iframes
108
+ doc[ATTACHEVENT]( ONREADYSTATECHANGE, completed );
109
+
110
+ // A fallback to window.onload, that will always work
111
+ win[ATTACHEVENT]( ONLOAD, completed );
112
+
113
+ // If IE and not a frame
114
+ // continually check to see if the document is ready
115
+ try {
116
+ _top = win.frameElement == null && docElem;
117
+ } catch(e) {}
118
+
119
+ if ( _top && _top.doScroll ) {
120
+ (function doScrollCheck() {
121
+ if ( !isReady ) {
122
+ try {
123
+ // Use the trick by Diego Perini
124
+ // http://javascript.nwbox.com/IEContentLoaded/
125
+ _top.doScroll("left");
126
+ } catch(e) {
127
+ return defer( doScrollCheck, 50 );
128
+ }
129
+
130
+ // detach all dom ready events
131
+ detach();
132
+
133
+ // and execute any waiting functions
134
+ ready();
135
+ }
136
+ })();
137
+ }
138
+ }
139
+
140
+ function onDomReady( fn ) {
141
+ // If DOM is ready, execute the function (async), otherwise wait
142
+ isReady ? defer( fn ) : callbacks.push( fn );
143
+ }
144
+
145
+ // Add version
146
+ onDomReady.version = "1.4.0";
147
+ // Add method to check if DOM is ready
148
+ onDomReady.isReady = function(){
149
+ return isReady;
150
+ };
151
+
152
+ return onDomReady;
153
+ }
154
+
155
+ module.exports = typeof window !== "undefined" && _onDomReady(window);
@@ -0,0 +1,177 @@
1
+ //https://github.com/inexorabletash/polyfill/blob/master/web.js
2
+ if (!document.querySelectorAll) {
3
+ document.querySelectorAll = function (selectors) {
4
+ var style = document.createElement('style'), elements = [], element;
5
+ document.documentElement.firstChild.appendChild(style);
6
+ document._qsa = [];
7
+
8
+ style.styleSheet.cssText = selectors + '{x-qsa:expression(document._qsa && document._qsa.push(this))}';
9
+ window.scrollBy(0, 0);
10
+ style.parentNode.removeChild(style);
11
+
12
+ while (document._qsa.length) {
13
+ element = document._qsa.shift();
14
+ element.style.removeAttribute('x-qsa');
15
+ elements.push(element);
16
+ }
17
+ document._qsa = null;
18
+ return elements;
19
+ };
20
+ }
21
+
22
+ if (!document.querySelector) {
23
+ document.querySelector = function (selectors) {
24
+ var elements = document.querySelectorAll(selectors);
25
+ return (elements.length) ? elements[0] : null;
26
+ };
27
+ }
28
+
29
+ if (!document.getElementsByClassName) {
30
+ document.getElementsByClassName = function (classNames) {
31
+ classNames = String(classNames).replace(/^|\s+/g, '.');
32
+ return document.querySelectorAll(classNames);
33
+ };
34
+ }
35
+
36
+ //https://github.com/inexorabletash/polyfill
37
+ // ES5 15.2.3.14 Object.keys ( O )
38
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys
39
+ if (!Object.keys) {
40
+ Object.keys = function (o) {
41
+ if (o !== Object(o)) { throw TypeError('Object.keys called on non-object'); }
42
+ var ret = [], p;
43
+ for (p in o) {
44
+ if (Object.prototype.hasOwnProperty.call(o, p)) {
45
+ ret.push(p);
46
+ }
47
+ }
48
+ return ret;
49
+ };
50
+ }
51
+
52
+ //https://github.com/inexorabletash/polyfill/blob/master/web.js
53
+ (function (global) {
54
+ var B64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
55
+ global.atob = global.atob || function (input) {
56
+ input = String(input);
57
+ var position = 0,
58
+ output = [],
59
+ buffer = 0, bits = 0, n;
60
+
61
+ input = input.replace(/\s/g, '');
62
+ if ((input.length % 4) === 0) { input = input.replace(/=+$/, ''); }
63
+ if ((input.length % 4) === 1) { throw Error('InvalidCharacterError'); }
64
+ if (/[^+/0-9A-Za-z]/.test(input)) { throw Error('InvalidCharacterError'); }
65
+
66
+ while (position < input.length) {
67
+ n = B64_ALPHABET.indexOf(input.charAt(position));
68
+ buffer = (buffer << 6) | n;
69
+ bits += 6;
70
+
71
+ if (bits === 24) {
72
+ output.push(String.fromCharCode((buffer >> 16) & 0xFF));
73
+ output.push(String.fromCharCode((buffer >> 8) & 0xFF));
74
+ output.push(String.fromCharCode(buffer & 0xFF));
75
+ bits = 0;
76
+ buffer = 0;
77
+ }
78
+ position += 1;
79
+ }
80
+
81
+ if (bits === 12) {
82
+ buffer = buffer >> 4;
83
+ output.push(String.fromCharCode(buffer & 0xFF));
84
+ } else if (bits === 18) {
85
+ buffer = buffer >> 2;
86
+ output.push(String.fromCharCode((buffer >> 8) & 0xFF));
87
+ output.push(String.fromCharCode(buffer & 0xFF));
88
+ }
89
+
90
+ return output.join('');
91
+ };
92
+
93
+ global.btoa = global.btoa || function (input) {
94
+ input = String(input);
95
+ var position = 0,
96
+ out = [],
97
+ o1, o2, o3,
98
+ e1, e2, e3, e4;
99
+
100
+ if (/[^\x00-\xFF]/.test(input)) { throw Error('InvalidCharacterError'); }
101
+
102
+ while (position < input.length) {
103
+ o1 = input.charCodeAt(position++);
104
+ o2 = input.charCodeAt(position++);
105
+ o3 = input.charCodeAt(position++);
106
+
107
+ // 111111 112222 222233 333333
108
+ e1 = o1 >> 2;
109
+ e2 = ((o1 & 0x3) << 4) | (o2 >> 4);
110
+ e3 = ((o2 & 0xf) << 2) | (o3 >> 6);
111
+ e4 = o3 & 0x3f;
112
+
113
+ if (position === input.length + 2) {
114
+ e3 = 64; e4 = 64;
115
+ }
116
+ else if (position === input.length + 1) {
117
+ e4 = 64;
118
+ }
119
+
120
+ out.push(B64_ALPHABET.charAt(e1),
121
+ B64_ALPHABET.charAt(e2),
122
+ B64_ALPHABET.charAt(e3),
123
+ B64_ALPHABET.charAt(e4));
124
+ }
125
+
126
+ return out.join('');
127
+ };
128
+ }(this));
129
+
130
+ //https://gist.github.com/jimeh/332357
131
+ if (!Object.prototype.hasOwnProperty){
132
+ /*jshint -W001, -W103 */
133
+ Object.prototype.hasOwnProperty = function(prop) {
134
+ var proto = this.__proto__ || this.constructor.prototype;
135
+ return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
136
+ };
137
+ /*jshint +W001, +W103 */
138
+ }
139
+
140
+ //requestAnimationFrame polyfill for older Firefox/Chrome versions
141
+ if (!window.requestAnimationFrame) {
142
+ if (window.webkitRequestAnimationFrame) {
143
+ //https://github.com/Financial-Times/polyfill-service/blob/master/polyfills/requestAnimationFrame/polyfill-webkit.js
144
+ (function (global) {
145
+ // window.requestAnimationFrame
146
+ global.requestAnimationFrame = function (callback) {
147
+ return webkitRequestAnimationFrame(function () {
148
+ callback(global.performance.now());
149
+ });
150
+ };
151
+
152
+ // window.cancelAnimationFrame
153
+ global.cancelAnimationFrame = webkitCancelAnimationFrame;
154
+ }(this));
155
+ } else if (window.mozRequestAnimationFrame) {
156
+ //https://github.com/Financial-Times/polyfill-service/blob/master/polyfills/requestAnimationFrame/polyfill-moz.js
157
+ (function (global) {
158
+ // window.requestAnimationFrame
159
+ global.requestAnimationFrame = function (callback) {
160
+ return mozRequestAnimationFrame(function () {
161
+ callback(global.performance.now());
162
+ });
163
+ };
164
+
165
+ // window.cancelAnimationFrame
166
+ global.cancelAnimationFrame = mozCancelAnimationFrame;
167
+ }(this));
168
+ } else {
169
+ (function (global) {
170
+ global.requestAnimationFrame = function (callback) {
171
+ return global.setTimeout(callback, 1000 / 60);
172
+ };
173
+
174
+ global.cancelAnimationFrame = global.clearTimeout;
175
+ })(this);
176
+ }
177
+ }
@@ -0,0 +1,101 @@
1
+ var augment = require('./lib/augment');
2
+
3
+ var SceneGraph = function(sceneProperties) {
4
+ var nodeCount = 1;
5
+
6
+ //todo: move merge to helpers section
7
+ function merge(parent, child) {
8
+ for (var prop in child) {
9
+ parent[prop] = child[prop];
10
+ }
11
+ return parent;
12
+ }
13
+
14
+ var SceneNode = augment.defclass({
15
+ constructor: function(name) {
16
+ nodeCount++;
17
+ this.parent = null;
18
+ this.children = {};
19
+ this.id = nodeCount;
20
+ this.name = 'n' + nodeCount;
21
+ if (name != null) {
22
+ this.name = name;
23
+ }
24
+ this.x = 0;
25
+ this.y = 0;
26
+ this.z = 0;
27
+ this.width = 0;
28
+ this.height = 0;
29
+ },
30
+ resize: function(width, height) {
31
+ if (width != null) {
32
+ this.width = width;
33
+ }
34
+ if (height != null) {
35
+ this.height = height;
36
+ }
37
+ },
38
+ moveTo: function(x, y, z) {
39
+ this.x = x != null ? x : this.x;
40
+ this.y = y != null ? y : this.y;
41
+ this.z = z != null ? z : this.z;
42
+ },
43
+ add: function(child) {
44
+ var name = child.name;
45
+ if (this.children[name] == null) {
46
+ this.children[name] = child;
47
+ child.parent = this;
48
+ } else {
49
+ throw 'SceneGraph: child with that name already exists: ' + name;
50
+ }
51
+ }
52
+ });
53
+
54
+ var RootNode = augment(SceneNode, function(uber) {
55
+ this.constructor = function() {
56
+ uber.constructor.call(this, 'root');
57
+ this.properties = sceneProperties;
58
+ };
59
+ });
60
+
61
+ var Shape = augment(SceneNode, function(uber) {
62
+ function constructor(name, props) {
63
+ uber.constructor.call(this, name);
64
+ this.properties = {
65
+ fill: '#000'
66
+ };
67
+ if (props != null) {
68
+ merge(this.properties, props);
69
+ } else if (name != null && typeof name !== 'string') {
70
+ throw 'SceneGraph: invalid node name';
71
+ }
72
+ }
73
+
74
+ this.Group = augment.extend(this, {
75
+ constructor: constructor,
76
+ type: 'group'
77
+ });
78
+
79
+ this.Rect = augment.extend(this, {
80
+ constructor: constructor,
81
+ type: 'rect'
82
+ });
83
+
84
+ this.Text = augment.extend(this, {
85
+ constructor: function(text) {
86
+ constructor.call(this);
87
+ this.properties.text = text;
88
+ },
89
+ type: 'text'
90
+ });
91
+ });
92
+
93
+ var root = new RootNode();
94
+
95
+ this.Shape = Shape;
96
+ this.root = root;
97
+
98
+ return this;
99
+ };
100
+
101
+ module.exports = SceneGraph;