sproutcore 0.9.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 (270) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +269 -0
  4. data/README.txt +67 -0
  5. data/Rakefile +4 -0
  6. data/app_generators/sproutcore/USAGE +5 -0
  7. data/app_generators/sproutcore/sproutcore_generator.rb +66 -0
  8. data/app_generators/sproutcore/templates/README +77 -0
  9. data/app_generators/sproutcore/templates/environment.yml +4 -0
  10. data/bin/sc-build +145 -0
  11. data/bin/sc-gen +24 -0
  12. data/bin/sc-server +63 -0
  13. data/bin/sproutcore +21 -0
  14. data/clients/sc_docs/controllers/docs.js +118 -0
  15. data/clients/sc_docs/core.js +19 -0
  16. data/clients/sc_docs/english.lproj/body.css +159 -0
  17. data/clients/sc_docs/english.lproj/body.rhtml +33 -0
  18. data/clients/sc_docs/english.lproj/controls.css +0 -0
  19. data/clients/sc_docs/english.lproj/icons/small/next.png +0 -0
  20. data/clients/sc_docs/english.lproj/icons/small/reset.png +0 -0
  21. data/clients/sc_docs/english.lproj/images/gradients.png +0 -0
  22. data/clients/sc_docs/english.lproj/images/indicator.gif +0 -0
  23. data/clients/sc_docs/english.lproj/images/toolbar.png +0 -0
  24. data/clients/sc_docs/english.lproj/no_docs.rhtml +7 -0
  25. data/clients/sc_docs/english.lproj/strings.js +14 -0
  26. data/clients/sc_docs/english.lproj/warning.rhtml +6 -0
  27. data/clients/sc_docs/fixtures/doc.js +11 -0
  28. data/clients/sc_docs/main.js +21 -0
  29. data/clients/sc_docs/models/doc.js +9 -0
  30. data/clients/sc_docs/tests/controllers/docs.rhtml +21 -0
  31. data/clients/sc_docs/tests/models/doc.rhtml +21 -0
  32. data/clients/sc_docs/tests/views/doc_frame.rhtml +21 -0
  33. data/clients/sc_docs/tests/views/doc_label_view.rhtml +21 -0
  34. data/clients/sc_docs/views/doc_frame.js +33 -0
  35. data/clients/sc_docs/views/doc_label.js +20 -0
  36. data/clients/sc_test_runner/controllers/runner.js +175 -0
  37. data/clients/sc_test_runner/core.js +19 -0
  38. data/clients/sc_test_runner/english.lproj/body.css +151 -0
  39. data/clients/sc_test_runner/english.lproj/body.rhtml +35 -0
  40. data/clients/sc_test_runner/english.lproj/controls.css +0 -0
  41. data/clients/sc_test_runner/english.lproj/icons/small/next.png +0 -0
  42. data/clients/sc_test_runner/english.lproj/icons/small/reset.png +0 -0
  43. data/clients/sc_test_runner/english.lproj/images/gradients.png +0 -0
  44. data/clients/sc_test_runner/english.lproj/images/indicator.gif +0 -0
  45. data/clients/sc_test_runner/english.lproj/images/toolbar.png +0 -0
  46. data/clients/sc_test_runner/english.lproj/no_tests.rhtml +6 -0
  47. data/clients/sc_test_runner/english.lproj/strings.js +14 -0
  48. data/clients/sc_test_runner/english.lproj/warning.rhtml +6 -0
  49. data/clients/sc_test_runner/fixtures/test.js +12 -0
  50. data/clients/sc_test_runner/main.js +26 -0
  51. data/clients/sc_test_runner/models/test.js +11 -0
  52. data/clients/sc_test_runner/views/runner_frame.js +72 -0
  53. data/clients/sc_test_runner/views/test_label.js +20 -0
  54. data/config/hoe.rb +70 -0
  55. data/config/requirements.rb +17 -0
  56. data/environment.yml +9 -0
  57. data/frameworks/prototype/prototype.js +4186 -0
  58. data/frameworks/sproutcore/Core.js +378 -0
  59. data/frameworks/sproutcore/README +3 -0
  60. data/frameworks/sproutcore/controllers/array.js +236 -0
  61. data/frameworks/sproutcore/controllers/collection.js +305 -0
  62. data/frameworks/sproutcore/controllers/controller.js +323 -0
  63. data/frameworks/sproutcore/controllers/object.js +372 -0
  64. data/frameworks/sproutcore/drag/drag.js +549 -0
  65. data/frameworks/sproutcore/drag/drag_data_source.js +32 -0
  66. data/frameworks/sproutcore/drag/drag_source.js +64 -0
  67. data/frameworks/sproutcore/drag/drop_target.js +153 -0
  68. data/frameworks/sproutcore/english.lproj/blank.gif +0 -0
  69. data/frameworks/sproutcore/english.lproj/buttons.css +589 -0
  70. data/frameworks/sproutcore/english.lproj/buttons.png +0 -0
  71. data/frameworks/sproutcore/english.lproj/inline_text_editor.css +21 -0
  72. data/frameworks/sproutcore/english.lproj/menu.css +121 -0
  73. data/frameworks/sproutcore/english.lproj/panels/background-fat.jpg +0 -0
  74. data/frameworks/sproutcore/english.lproj/panels/background-thin.jpg +0 -0
  75. data/frameworks/sproutcore/english.lproj/panels/bottom-edge.png +0 -0
  76. data/frameworks/sproutcore/english.lproj/panels/bottom-left-corner.png +0 -0
  77. data/frameworks/sproutcore/english.lproj/panels/bottom-right-corner.png +0 -0
  78. data/frameworks/sproutcore/english.lproj/panels/left-edge.png +0 -0
  79. data/frameworks/sproutcore/english.lproj/panels/overlay.png +0 -0
  80. data/frameworks/sproutcore/english.lproj/panels/right-edge.png +0 -0
  81. data/frameworks/sproutcore/english.lproj/panels/top-edge.png +0 -0
  82. data/frameworks/sproutcore/english.lproj/panels/top-left-corner.png +0 -0
  83. data/frameworks/sproutcore/english.lproj/panels/top-right-corner.png +0 -0
  84. data/frameworks/sproutcore/english.lproj/panes.css +155 -0
  85. data/frameworks/sproutcore/english.lproj/picker.css +22 -0
  86. data/frameworks/sproutcore/english.lproj/strings.js +15 -0
  87. data/frameworks/sproutcore/english.lproj/tab.css +23 -0
  88. data/frameworks/sproutcore/english.lproj/tests.css +67 -0
  89. data/frameworks/sproutcore/english.lproj/theme.css +77 -0
  90. data/frameworks/sproutcore/foundation/animator.js +670 -0
  91. data/frameworks/sproutcore/foundation/application.js +199 -0
  92. data/frameworks/sproutcore/foundation/array.js +348 -0
  93. data/frameworks/sproutcore/foundation/benchmark.js +211 -0
  94. data/frameworks/sproutcore/foundation/binding.js +384 -0
  95. data/frameworks/sproutcore/foundation/date.js +357 -0
  96. data/frameworks/sproutcore/foundation/error.js +39 -0
  97. data/frameworks/sproutcore/foundation/input_manager.js +153 -0
  98. data/frameworks/sproutcore/foundation/json.js +296 -0
  99. data/frameworks/sproutcore/foundation/mock.js +42 -0
  100. data/frameworks/sproutcore/foundation/node_descriptor.js +56 -0
  101. data/frameworks/sproutcore/foundation/object.js +777 -0
  102. data/frameworks/sproutcore/foundation/observable.js +451 -0
  103. data/frameworks/sproutcore/foundation/page.js +63 -0
  104. data/frameworks/sproutcore/foundation/path_module.js +413 -0
  105. data/frameworks/sproutcore/foundation/responder.js +310 -0
  106. data/frameworks/sproutcore/foundation/routes.js +371 -0
  107. data/frameworks/sproutcore/foundation/run_loop.js +21 -0
  108. data/frameworks/sproutcore/foundation/server.js +491 -0
  109. data/frameworks/sproutcore/foundation/set.js +96 -0
  110. data/frameworks/sproutcore/foundation/string.js +149 -0
  111. data/frameworks/sproutcore/foundation/undo_manager.js +186 -0
  112. data/frameworks/sproutcore/foundation/unittest.js +622 -0
  113. data/frameworks/sproutcore/foundation/utils.js +61 -0
  114. data/frameworks/sproutcore/globals/panels.js +182 -0
  115. data/frameworks/sproutcore/globals/popups.js +60 -0
  116. data/frameworks/sproutcore/globals/window.js +381 -0
  117. data/frameworks/sproutcore/lib/index.rhtml +66 -0
  118. data/frameworks/sproutcore/models/collection.js +395 -0
  119. data/frameworks/sproutcore/models/record.js +622 -0
  120. data/frameworks/sproutcore/models/store.js +295 -0
  121. data/frameworks/sproutcore/panes/dialog.js +16 -0
  122. data/frameworks/sproutcore/panes/manager.js +164 -0
  123. data/frameworks/sproutcore/panes/menu.js +45 -0
  124. data/frameworks/sproutcore/panes/overlay.js +231 -0
  125. data/frameworks/sproutcore/panes/pane.js +90 -0
  126. data/frameworks/sproutcore/panes/panel.js +19 -0
  127. data/frameworks/sproutcore/panes/picker.js +45 -0
  128. data/frameworks/sproutcore/tests/controllers/array.rhtml +86 -0
  129. data/frameworks/sproutcore/tests/controllers/controller.rhtml +273 -0
  130. data/frameworks/sproutcore/tests/controllers/object.rhtml +327 -0
  131. data/frameworks/sproutcore/tests/foundation/application.rhtml +125 -0
  132. data/frameworks/sproutcore/tests/foundation/array.rhtml +221 -0
  133. data/frameworks/sproutcore/tests/foundation/object.rhtml +69 -0
  134. data/frameworks/sproutcore/tests/globals/window.rhtml +45 -0
  135. data/frameworks/sproutcore/tests/panes/pane.rhtml +88 -0
  136. data/frameworks/sproutcore/tests/views/collection.rhtml +137 -0
  137. data/frameworks/sproutcore/tests/views/popup_button.rhtml +115 -0
  138. data/frameworks/sproutcore/tests/views/text_field.rhtml +37 -0
  139. data/frameworks/sproutcore/validators/credit_card.js +92 -0
  140. data/frameworks/sproutcore/validators/date.js +36 -0
  141. data/frameworks/sproutcore/validators/email.js +29 -0
  142. data/frameworks/sproutcore/validators/not_empty.js +24 -0
  143. data/frameworks/sproutcore/validators/number.js +55 -0
  144. data/frameworks/sproutcore/validators/password.js +78 -0
  145. data/frameworks/sproutcore/validators/validator.js +304 -0
  146. data/frameworks/sproutcore/views/button.js +425 -0
  147. data/frameworks/sproutcore/views/checkbox_field.js +30 -0
  148. data/frameworks/sproutcore/views/collection.js +1521 -0
  149. data/frameworks/sproutcore/views/container.js +62 -0
  150. data/frameworks/sproutcore/views/error_explanation.js +45 -0
  151. data/frameworks/sproutcore/views/field.js +214 -0
  152. data/frameworks/sproutcore/views/filter_button.js +29 -0
  153. data/frameworks/sproutcore/views/form.js +591 -0
  154. data/frameworks/sproutcore/views/image.js +141 -0
  155. data/frameworks/sproutcore/views/inline_text_editor.js +96 -0
  156. data/frameworks/sproutcore/views/label.js +176 -0
  157. data/frameworks/sproutcore/views/menu_item.js +90 -0
  158. data/frameworks/sproutcore/views/pagination.js +54 -0
  159. data/frameworks/sproutcore/views/popup_button.js +86 -0
  160. data/frameworks/sproutcore/views/popup_menu.js +137 -0
  161. data/frameworks/sproutcore/views/progress.js +100 -0
  162. data/frameworks/sproutcore/views/radio_field.js +107 -0
  163. data/frameworks/sproutcore/views/radio_group.js +48 -0
  164. data/frameworks/sproutcore/views/segmented.js +80 -0
  165. data/frameworks/sproutcore/views/select_field.js +272 -0
  166. data/frameworks/sproutcore/views/spinner.js +11 -0
  167. data/frameworks/sproutcore/views/tab.js +126 -0
  168. data/frameworks/sproutcore/views/text_field.js +179 -0
  169. data/frameworks/sproutcore/views/textarea_field.js +14 -0
  170. data/frameworks/sproutcore/views/toolbar.js +29 -0
  171. data/frameworks/sproutcore/views/view.js +1389 -0
  172. data/frameworks/sproutcore/views/workspace.js +170 -0
  173. data/generators/client/README +3 -0
  174. data/generators/client/USAGE +12 -0
  175. data/generators/client/client_generator.rb +53 -0
  176. data/generators/client/templates/core.js +19 -0
  177. data/generators/client/templates/english.lproj/body.css +0 -0
  178. data/generators/client/templates/english.lproj/body.rhtml +3 -0
  179. data/generators/client/templates/english.lproj/controls.css +0 -0
  180. data/generators/client/templates/english.lproj/strings.js +14 -0
  181. data/generators/client/templates/main.js +37 -0
  182. data/generators/controller/USAGE +16 -0
  183. data/generators/controller/controller_generator.rb +51 -0
  184. data/generators/controller/templates/controller.js +21 -0
  185. data/generators/controller/templates/test.rhtml +21 -0
  186. data/generators/framework/README +7 -0
  187. data/generators/framework/USAGE +12 -0
  188. data/generators/framework/framework_generator.rb +53 -0
  189. data/generators/framework/templates/core.js +20 -0
  190. data/generators/framework/templates/english.lproj/body.css +0 -0
  191. data/generators/framework/templates/english.lproj/body.rhtml +3 -0
  192. data/generators/framework/templates/english.lproj/controls.css +0 -0
  193. data/generators/framework/templates/english.lproj/strings.js +14 -0
  194. data/generators/language/USAGE +16 -0
  195. data/generators/language/language_generator.rb +47 -0
  196. data/generators/language/templates/strings.js +10 -0
  197. data/generators/model/USAGE +24 -0
  198. data/generators/model/model_generator.rb +55 -0
  199. data/generators/model/templates/fixture.js +11 -0
  200. data/generators/model/templates/model.js +20 -0
  201. data/generators/model/templates/test.rhtml +21 -0
  202. data/generators/test/USAGE +16 -0
  203. data/generators/test/templates/test.rhtml +21 -0
  204. data/generators/test/test_generator.rb +47 -0
  205. data/generators/view/USAGE +16 -0
  206. data/generators/view/templates/test.rhtml +21 -0
  207. data/generators/view/templates/view.js +20 -0
  208. data/generators/view/view_generator.rb +51 -0
  209. data/jsdoc/README.txt +119 -0
  210. data/jsdoc/app/DocFile.js +137 -0
  211. data/jsdoc/app/DocTag.js +110 -0
  212. data/jsdoc/app/Doclet.js +63 -0
  213. data/jsdoc/app/Dumper.js +143 -0
  214. data/jsdoc/app/JsDoc.js +103 -0
  215. data/jsdoc/app/JsHilite.js +45 -0
  216. data/jsdoc/app/JsIO.js +163 -0
  217. data/jsdoc/app/JsParse.js +385 -0
  218. data/jsdoc/app/JsPlate.js +130 -0
  219. data/jsdoc/app/JsTestrun.js +129 -0
  220. data/jsdoc/app/JsToke.js +564 -0
  221. data/jsdoc/app/Symbol.js +298 -0
  222. data/jsdoc/app/Transformer.js +14 -0
  223. data/jsdoc/app/Util.js +97 -0
  224. data/jsdoc/app/js.jar +0 -0
  225. data/jsdoc/app/run.js +144 -0
  226. data/jsdoc/plugins/min.js +316 -0
  227. data/jsdoc/plugins/strip.js +20 -0
  228. data/jsdoc/templates/sproutcore/class.tmpl +438 -0
  229. data/jsdoc/templates/sproutcore/default.css +241 -0
  230. data/jsdoc/templates/sproutcore/index.html +13 -0
  231. data/jsdoc/templates/sproutcore/index.tmpl +21 -0
  232. data/jsdoc/templates/sproutcore/prototype.js +4186 -0
  233. data/jsdoc/templates/sproutcore/publish.js +236 -0
  234. data/jsdoc/templates/sproutcore/splash.html +7 -0
  235. data/lib/sproutcore/build_tools/html_builder.rb +88 -0
  236. data/lib/sproutcore/build_tools/resource_builder.rb +194 -0
  237. data/lib/sproutcore/build_tools.rb +44 -0
  238. data/lib/sproutcore/bundle.rb +517 -0
  239. data/lib/sproutcore/bundle_manifest.rb +397 -0
  240. data/lib/sproutcore/generator_helper.rb +170 -0
  241. data/lib/sproutcore/helpers/capture_helper.rb +42 -0
  242. data/lib/sproutcore/helpers/static_helper.rb +80 -0
  243. data/lib/sproutcore/helpers/tag_helper.rb +110 -0
  244. data/lib/sproutcore/helpers/text_helper.rb +336 -0
  245. data/lib/sproutcore/helpers.rb +3 -0
  246. data/lib/sproutcore/jsdoc.rb +40 -0
  247. data/lib/sproutcore/jsmin.rb +247 -0
  248. data/lib/sproutcore/library.rb +258 -0
  249. data/lib/sproutcore/merb/bundle_controller.rb +179 -0
  250. data/lib/sproutcore/merb/router.rb +43 -0
  251. data/lib/sproutcore/merb.rb +27 -0
  252. data/lib/sproutcore/version.rb +9 -0
  253. data/lib/sproutcore/view_helpers/button_views.rb +302 -0
  254. data/lib/sproutcore/view_helpers/core_views.rb +284 -0
  255. data/lib/sproutcore/view_helpers/form_views.rb +258 -0
  256. data/lib/sproutcore/view_helpers/menu_views.rb +94 -0
  257. data/lib/sproutcore/view_helpers.rb +628 -0
  258. data/lib/sproutcore.rb +30 -0
  259. data/script/destroy +14 -0
  260. data/script/generate +14 -0
  261. data/script/txt2html +74 -0
  262. data/setup.rb +1585 -0
  263. data/spec/spec.opts +1 -0
  264. data/spec/spec_helper.rb +7 -0
  265. data/spec/sproutcore_spec.rb +11 -0
  266. data/tasks/deployment.rake +34 -0
  267. data/tasks/environment.rake +7 -0
  268. data/tasks/rspec.rake +21 -0
  269. data/tasks/website.rake +17 -0
  270. metadata +365 -0
@@ -0,0 +1,236 @@
1
+ require("app/JsHilite.js");
2
+
3
+ function basename(filename) {
4
+ filename.match(/([^\/\\]+)\.[^\/\\]+$/);
5
+ return RegExp.$1;
6
+ }
7
+
8
+ // This is the orginial function from Stuart Langridge at http://www.kryogenix.org/
9
+ // This is the update function from Jeff Minard - http://www.jrm.cc/
10
+ function superTextile(s) {
11
+
12
+ // CAJ - First, strip out extra newlines and whitespace at the start
13
+ // of comments. This will yield more appropriate text for formatting.
14
+ s = s.split("\n").map(function(l) { return ((l=='') || (l.match(/^\s+$/))) ? "" : l.replace(/^\s+/,'') ; }).join("\n") ;
15
+
16
+ var r = s;
17
+ // quick tags first
18
+ qtags = [ ['\\*', '\\*', 'strong'],
19
+ ['\\?\\?', '\\?\\?', 'cite'],
20
+ ['\\+', '\\+', 'ins'], //fixed
21
+ ['~', '~', 'sub'],
22
+ ['\\^', '\\^', 'sup'], // me
23
+ ['{{{', '}}}', 'code']];
24
+
25
+ for (var i=0;i<qtags.length;i++) {
26
+ var ttag_o = qtags[i][0], ttag_c = qtags[i][1], htag = qtags[i][2];
27
+ re = new RegExp(ttag_o+'\\b(.+?)\\b'+ttag_c,'g');
28
+ r = r.replace(re,'<'+htag+'>'+'$1'+'</'+htag+'>');
29
+ };
30
+
31
+ // underscores count as part of a word, so do them separately
32
+ re = new RegExp('\\b_(.+?)_\\b','g');
33
+ r = r.replace(re,'<em>$1</em>');
34
+
35
+ //jeff: so do dashes
36
+ re = new RegExp('[\s\n]-(.+?)-[\s\n]','g');
37
+ r = r.replace(re,'<del>$1</del>');
38
+
39
+ // links
40
+ re = new RegExp('"\\b(.+?)\\(\\b(.+?)\\b\\)":([^\\s]+)','g');
41
+ r = r.replace(re,'<a href="$3" title="$2">$1</a>');
42
+
43
+ re = new RegExp('"\\b(.+?)\\b":([^\\s]+)','g');
44
+ r = r.replace(re,'<a href="$2">$1</a>');
45
+
46
+ // images
47
+ re = new RegExp('!\\b(.+?)\\(\\b(.+?)\\b\\)!','g');
48
+ r = r.replace(re,'<img src="$1" alt="$2">');
49
+ re = new RegExp('!\\b(.+?)\\b!','g');
50
+ r = r.replace(re,'<img src="$1">');
51
+
52
+ // block level formatting
53
+ lines = r.split('\n');
54
+ out = [] ;
55
+ nr = '';
56
+ var incode = 0 ;
57
+ var cur_block = [] ; // collect lines into a block before processing them.
58
+ for (var i=0;i<lines.length;i++) {
59
+ var line = lines[i].replace(/\s*$/,'');
60
+ changed = 0;
61
+
62
+ // handle incode behavior.
63
+ if (incode) {
64
+
65
+ // Look for end closing bracket and process it.
66
+ if (line.match(/^\s*}}}\s*$/)) {
67
+ incode = 0 ;
68
+ out.push("<p class=\"code\"><code>" + cur_block.join("<br />") + "</code></p>") ;
69
+ cur_block = [] ;
70
+
71
+ // otherwise, just add the line to the current block
72
+ } else {
73
+ cur_block.push(line) ;
74
+ }
75
+
76
+ // for normal text, look for line-level items to replace. If no
77
+ // replacement is found, then add the line to the current block.
78
+ } else {
79
+
80
+ // an empty line means we should end the current paragraph
81
+ if ((line == '') || line.match(/^\s+$/)) {
82
+ changed = 1 ;
83
+ line = '' ;
84
+
85
+ // convert bq. => blockquote.
86
+ } else if (line.search(/^\s*bq\.\s+/) != -1) {
87
+ line = line.replace(/^\s*bq\.\s+/,'\t<blockquote>')+'</blockquote>';
88
+ changed = 1;
89
+
90
+ // convert h* => heading
91
+ } else if (line.search(/^\s*h[1|2|3|4|5|6]\.\s+/) != -1) {
92
+ line = line.replace(/^\s*h([1|2|3|4|5|6])\.(.+)/, '<h$1>$2</h$1>');
93
+ changed = 1;
94
+
95
+ // convert * to bulletted list. liu tag will be fixed later.
96
+ } else if (line.search(/^\s*\*\s+/) != -1) {
97
+ line = line.replace(/^\s*\*\s+/,'\t<liu>') + '</liu>'; changed = 1;
98
+ changed = 1;
99
+
100
+ // convert # to numbered list. lio tag will be fixed later.
101
+ } else if (line.search(/^\s*#\s+/) != -1) {
102
+ line = line.replace(/^\s*#\s+/,'\t<lio>') + '</lio>'; changed = 1;
103
+ changed = 1;
104
+
105
+ // open code tag will start code
106
+ } else if (line.match(/^\s*\{\{\{\s*$/)) {
107
+ incode++ ;
108
+ line = '' ;
109
+ changed = 1;
110
+ }
111
+
112
+ // if the line was changed, the emit the current block as a paragraph
113
+ // and emit the line itself. Otherwise, just push the line into the
114
+ // current block.
115
+ if (changed > 0) {
116
+ if (cur_block.length > 0) {
117
+ out.push("<p>" + cur_block.join(" ") + '</p>') ;
118
+ cur_block = [] ;
119
+ }
120
+ out.push(line) ;
121
+ } else {
122
+ cur_block.push(line) ;
123
+ }
124
+ }
125
+ }
126
+
127
+ // done. if there are any lines left, in the current block, emit it.
128
+ if (cur_block.length > 0) {
129
+ out.push("<p>" + cur_block.join(" ") + '</p>') ;
130
+ cur_block = [] ;
131
+ }
132
+
133
+ // Second pass to do lists. This will wrap the lists in <li> | <ol> tags.
134
+ inlist = 0;
135
+ listtype = '';
136
+ for (var i=0;i<out.length;i++) {
137
+ line = out[i];
138
+ var addin = null ;
139
+
140
+ if (inlist && listtype == 'ul' && !line.match(/^\t<liu/)) {
141
+ addin = '</ul>\n'; inlist = 0;
142
+ }
143
+
144
+ if (inlist && listtype == 'ol' && !line.match(/^\t<lio/)) {
145
+ addin = '</ol>\n'; inlist = 0;
146
+ }
147
+
148
+ if (!inlist && line.match(/^\t<liu/)) {
149
+ line = '<ul>' + line; inlist = 1; listtype = 'ul';
150
+ }
151
+
152
+ if (!inlist && line.match(/^\t<lio/)) {
153
+ line = '<ol>' + line; inlist = 1; listtype = 'ol';
154
+ }
155
+
156
+ if (addin) line = addin + line ;
157
+ out[i] = line;
158
+ }
159
+
160
+ // Now we can join the string. Yay!
161
+ r = out.join('\n');
162
+
163
+ // jeff added : will correctly replace <li(o|u)> AND </li(o|u)>
164
+ r = r.replace(/li[o|u]>/g,'li>');
165
+
166
+ return r;
167
+ } ;
168
+
169
+ function publish(fileGroup, context) {
170
+ var classTemplate = new JsPlate(context.t+"class.tmpl");
171
+ var indexTemplate = new JsPlate(context.t+"index.tmpl");
172
+
173
+ var allFiles = {};
174
+ var allClasses = {};
175
+ var globals = {methods:[], properties:[], alias:"GLOBALS", isStatic:true};
176
+
177
+ for (var i = 0; i < fileGroup.files.length; i++) {
178
+ var file_basename = basename(fileGroup.files[i].filename);
179
+ var file_srcname = file_basename+".src.html";
180
+
181
+ for (var s = 0; s < fileGroup.files[i].symbols.length; s++) {
182
+ if (fileGroup.files[i].symbols[s].isa == "CONSTRUCTOR") {
183
+ var thisClass = fileGroup.files[i].symbols[s];
184
+ // sort inherited methods by class
185
+ var inheritedMethods = fileGroup.files[i].symbols[s].getInheritedMethods();
186
+ if (inheritedMethods.length > 0) {
187
+ thisClass.inherited = {};
188
+ for (var n = 0; n < inheritedMethods.length; n++) {
189
+ if (! thisClass.inherited[inheritedMethods[n].memberof]) thisClass.inherited[inheritedMethods[n].memberof] = [];
190
+ thisClass.inherited[inheritedMethods[n].memberof].push(inheritedMethods[n]);
191
+ }
192
+ }
193
+
194
+ thisClass.name = fileGroup.files[i].symbols[s].alias;
195
+ thisClass.source = file_srcname;
196
+ thisClass.filename = fileGroup.files[i].filename;
197
+ thisClass.docs = thisClass.name+".html";
198
+
199
+ if (!allClasses[thisClass.name]) allClasses[thisClass.name] = [];
200
+ allClasses[thisClass.name].push(thisClass);
201
+ }
202
+ else if (fileGroup.files[i].symbols[s].alias == fileGroup.files[i].symbols[s].name) {
203
+ if (fileGroup.files[i].symbols[s].isa == "FUNCTION") {
204
+ globals.methods.push(fileGroup.files[i].symbols[s]);
205
+ }
206
+ else {
207
+ globals.properties.push(fileGroup.files[i].symbols[s]);
208
+ }
209
+ }
210
+ }
211
+
212
+ if (!allFiles[fileGroup.files[i].path]) {
213
+ var hiliter = new JsHilite(IO.readFile(fileGroup.files[i].path), JsDoc.opt.e);
214
+ IO.saveFile(context.d, file_srcname, hiliter.hilite());
215
+ }
216
+ fileGroup.files[i].source = file_srcname;
217
+ allFiles[fileGroup.files[i].path] = true;
218
+ }
219
+
220
+ for (var c in allClasses) {
221
+ outfile = c+".html";
222
+ allClasses[c].outfile = outfile;
223
+ var output = classTemplate.process(allClasses[c]);
224
+ IO.saveFile(context.d, outfile, output);
225
+ }
226
+
227
+ output = classTemplate.process([globals]);
228
+ IO.saveFile(context.d, "globals.html", output);
229
+
230
+ var output = indexTemplate.process(allClasses);
231
+ IO.saveFile(context.d, "classes.js", output);
232
+ IO.copyFile(context.t+"index.html", context.d);
233
+ IO.copyFile(context.t+"splash.html", context.d);
234
+ IO.copyFile(context.t+"default.css", context.d) ;
235
+ IO.copyFile(context.t+"prototype.js", context.d) ;
236
+ }
@@ -0,0 +1,7 @@
1
+ <html>
2
+ <head>
3
+ <title>JsDoc</title>
4
+ </head>
5
+ <body>
6
+ </body>
7
+ </html>
@@ -0,0 +1,88 @@
1
+ require 'erubis'
2
+ require 'sproutcore/helpers'
3
+ require 'sproutcore/view_helpers'
4
+
5
+ module SproutCore
6
+
7
+ module BuildTools
8
+
9
+ # Whenever you build an HTML file for a SproutCore client, an instance of this class
10
+ # is created to actually process and build the HTML using Erubus. If you want to add
11
+ # more methods to use in your HTML files, just include them in HtmlContext.
12
+ #
13
+ class HtmlContext
14
+
15
+ include SproutCore::Helpers::TagHelper
16
+ include SproutCore::Helpers::TextHelper
17
+ include SproutCore::Helpers::CaptureHelper
18
+ include SproutCore::Helpers::StaticHelper
19
+ include SproutCore::ViewHelpers
20
+
21
+ attr_reader :entry, :bundle, :filenames, :filename, :language, :library
22
+
23
+ def initialize(entry, bundle)
24
+ @entry = nil
25
+ @language = entry.language
26
+ @filenames = entry.composite.nil? ? [entry.filename] : entry.composite
27
+ @bundle = bundle
28
+ @library = bundle.library
29
+ end
30
+
31
+ # Actually builds the HTML file from the entry (actually from any composite entries)
32
+ def build
33
+
34
+ @layout_path = bundle.layout_path
35
+
36
+ # Render each filename. By default, the output goes to the resources string
37
+ @content_for_resources = ''
38
+ filenames.each { |fn| _render_one(fn) }
39
+
40
+ # Finally, render the layout. This should produce the final output to return
41
+ input = File.read(@layout_path)
42
+ return eval(Erubis::Eruby.new.convert(input))
43
+ end
44
+
45
+ # render a single entry
46
+ def _render_one(filename)
47
+ @filename = filename
48
+ @entry = bundle.entry_for(filename, :hidden => :include, :language => language)
49
+
50
+ # avoid double render of layout path
51
+ return if @entry.source_path == @layout_path
52
+
53
+ # render. Result goes into @content_for_resources
54
+ input = File.read(@entry.source_path)
55
+ @content_for_resources += eval(Erubis::Eruby.new.convert(input))
56
+
57
+ @filename =nil
58
+ @entry = nil
59
+ end
60
+
61
+
62
+ # Returns the current bundle name. Often useful for generating titles, etc.
63
+ def bundle_name; bundle.bundle_name; end
64
+
65
+ #### For Rails Compatibility. render() does not do anything useful since the
66
+ # new build system is nice about putting things into the right place for output.
67
+ def render; ''; end
68
+
69
+ end
70
+
71
+ def self.build_html(entry, bundle)
72
+ context = HtmlContext.new(entry,bundle)
73
+ output = context.build
74
+
75
+ puts "saving: #{entry.filename} to #{entry.build_path}: size: #{output.size}"
76
+ FileUtils.mkdir_p(File.dirname(entry.build_path))
77
+ f = File.open(entry.build_path, 'w')
78
+ f.write(output)
79
+ f.close
80
+
81
+ end
82
+
83
+ # Building a test is just like building a single page except that we do not include
84
+ # all the other html templates in the project
85
+ def self.build_test(entry, bundle); build_html(entry, bundle); end
86
+
87
+ end
88
+ end
@@ -0,0 +1,194 @@
1
+ module SproutCore
2
+
3
+ module BuildTools
4
+
5
+ # Set to override the default behavior (which will follow the build mode)
6
+ def self.minify?; @minify.nil? ? (Bundle.build_mode != :development) : @minify; end
7
+ def self.minify=(setting); @minify = setting; end
8
+
9
+ # The ResourceBuilder can combine all of the source files listed in the passed entry
10
+ # including some basic pre-processing. The JavaScriptBuilder extends this to do some
11
+ # JavaScript specific rewriting of URLs, etc. as well.
12
+ #
13
+ # The ResourceBuilder knows how
14
+ class ResourceBuilder
15
+
16
+ attr_reader :bundle, :language, :filenames
17
+
18
+ # Utility method you can call to get the items sorted by load order
19
+ def self.sort_entries_by_load_order(entries, language, bundle)
20
+ filenames = entries.map { |e| e.filename }
21
+ hashed = {}
22
+ entries.each { |e| hashed[e.filename] = e }
23
+
24
+ sorted = self.new(filenames, language, bundle).required
25
+ sorted.map { |filename| hashed[filename] }
26
+ end
27
+
28
+ def initialize(filenames, language, bundle)
29
+ @bundle = bundle; @language = language; @filenames = filenames
30
+ end
31
+
32
+ # Simply returns the filenames in the order that they were required
33
+ def required
34
+ lines = []; required = []
35
+ while filename = next_filename
36
+ lines, required = _build_one(filename, lines, required, true)
37
+ end
38
+ return lines
39
+ end
40
+
41
+ # Actually perform the build. Returns the compiled resource as a single string.
42
+ def build
43
+
44
+ # setup context
45
+ lines = []
46
+ required = []
47
+
48
+ # process files
49
+ while filename = next_filename
50
+ lines, required = _build_one(filename, lines, required)
51
+ end
52
+
53
+ return join(lines)
54
+ end
55
+
56
+ # Join the lines together. This is one last chance to do some prep of the data
57
+ # (such as minifcation and comment stripping)
58
+ def join(lines); lines.join; end
59
+
60
+ # Tries to build a single resource. This may call itself recursively to handle
61
+ # requires.
62
+ #
63
+ # ==== Returns
64
+ # [lines, required] to be passed into the next call
65
+ #
66
+ def _build_one(filename, lines, required, link_only = false)
67
+ return [lines, required] if required.include?(filename)
68
+ required << filename
69
+
70
+ entry = bundle.entry_for(filename, :hidden => :include, :language => language)
71
+ if entry.nil?
72
+ puts "WARNING: Could not find require file: #{filename}"
73
+ return [lines, required]
74
+ end
75
+
76
+ file_lines = []
77
+ io = entry.source_path.nil? ? [] : File.new(entry.source_path)
78
+ io.each do | line |
79
+
80
+ # check for requires. Only follow a require if the require is in the list
81
+ # of filenames.
82
+ required_file = _require_for(filename, line)
83
+ unless required_file.nil? || !filenames.include?(required_file)
84
+ lines, required = _build_one(required_file, lines, required, link_only)
85
+ end
86
+
87
+ file_lines << _rewrite_static_urls(line) unless link_only
88
+ end
89
+
90
+ # The list of already required filenames is slightly out of order from the actual
91
+ # load order. Instead, we use the lines array to hold the list of filenames as they
92
+ # are processed.
93
+ if link_only
94
+ lines << filename
95
+
96
+ elsif file_lines.size > 0
97
+ lines += file_lines
98
+ lines << "\n"
99
+ end
100
+
101
+ return [lines, required]
102
+ end
103
+
104
+ # Overridden by subclasses to choose first filename.
105
+ def next_filename; filenames.delete(filenames.first); end
106
+
107
+ # This will look for calls to static_url() and rewrite them with an actual
108
+ # string to the URL. Assumes the input text is JavaScript or CSS.
109
+ def _rewrite_static_urls(line)
110
+ line.gsub(/static_url\([\'\"](.+)[\'\"]\)/) do | rsrc |
111
+ entry = bundle.find_resource_entry($1, :language => language)
112
+ static_url(entry.nil? ? '' : entry.url)
113
+ end
114
+ end
115
+
116
+ # Overridden by subclass to handle static_url() in a language specific way.
117
+ def static_url(url); "url('#{url}')"; end
118
+
119
+ # check line for required() pattern. understands JS and CSS.
120
+ def _require_for(filename,line)
121
+ new_file = line.scan(/require\(['"](.*)['"]\)/)
122
+ ret = (new_file.size > 0) ? new_file.first.first : nil
123
+ ret.nil? ? nil : filename_for_require(ret)
124
+ end
125
+
126
+ def filename_for_require(ret); "#{ret}.css"; end
127
+
128
+ end
129
+
130
+ class JavaScriptResourceBuilder < ResourceBuilder
131
+
132
+ # Final processing of file. Remove comments & minify
133
+ def join(lines)
134
+
135
+ if BuildTools.minify?
136
+ # first suck out any comments that should be retained
137
+ comments = []
138
+ include_line = false
139
+ lines.each do | line |
140
+ is_mark = (line =~ /@license/)
141
+ unless include_line
142
+ include_line = true if is_mark
143
+ is_mark = false
144
+ end
145
+
146
+ comments << line if include_line
147
+ include_line = false if include_line && is_mark
148
+ end
149
+
150
+ # now minify and prepend any static
151
+ comments.push "\n" unless comments.empty?
152
+ comments.push SproutCore::JSMin.run(lines * '')
153
+ lines = comments
154
+ end
155
+
156
+ lines.join
157
+ end
158
+
159
+ def static_url(url); "'#{url}'"; end
160
+ def filename_for_require(ret); "#{ret}.js"; end
161
+
162
+ def next_filename
163
+ filenames.delete('strings.js') || filenames.delete('core.js') || filenames.delete('Core.js') || filenames.delete('utils.js') || filenames.delete(filenames.first)
164
+ end
165
+
166
+ end
167
+
168
+ def self.build_stylesheet(entry, bundle)
169
+ filenames = entry.composite.nil? ? [entry.filename] : entry.composite
170
+ builder = ResourceBuilder.new(filenames, entry.language, bundle)
171
+ if output = builder.build
172
+ FileUtils.mkdir_p(File.dirname(entry.build_path))
173
+ f = File.open(entry.build_path, 'w')
174
+ f.write(output)
175
+ f.close
176
+ end
177
+ end
178
+
179
+ def self.build_javascript(entry, bundle)
180
+ filenames = entry.composite.nil? ? [entry.filename] : entry.composite
181
+ builder = JavaScriptResourceBuilder.new(filenames, entry.language, bundle)
182
+ if output = builder.build
183
+ FileUtils.mkdir_p(File.dirname(entry.build_path))
184
+ f = File.open(entry.build_path, 'w')
185
+ f.write(output)
186
+ f.close
187
+ end
188
+ end
189
+
190
+ def self.build_fixture(entry, bundle); build_javascript(entry, bundle); end
191
+
192
+ end
193
+
194
+ end
@@ -0,0 +1,44 @@
1
+ module SproutCore
2
+
3
+ # This module contains entry points to builds tools that handle various types of resources
4
+ # in a SproutCore client. Each build tool has a method "build_xx(entry, bundle)" that can
5
+ # be called here.
6
+ #
7
+ # You can add your own build tools to the system here .
8
+ #
9
+ module BuildTools
10
+
11
+ # Resources are sometimes accessed through a symlink while running in devmode. This
12
+ # method should simply ensure that symlink exists.
13
+ #
14
+ def self.build_symlink(entry, bundle)
15
+ symlink_path = File.join(bundle.build_root, '_src')
16
+ source_path = bundle.source_root
17
+ unless File.exist?(symlink_path)
18
+ FileUtils.mkdir_p(bundle.build_root)
19
+ FileUtils.ln_sf(source_path, symlink_path)
20
+ end
21
+ end
22
+
23
+ # Regular resources and tests are simply copied. Note that normally in development mode,
24
+ # these resources will be accessed via a symlink
25
+ def self.copy_resource(entry, bundle)
26
+ FileUtils.mkdir_p(File.dirname(entry.build_path))
27
+
28
+ # Make the source file exists
29
+ unless File.exists?(entry.source_path)
30
+ raise "Could not copy resource #{entry.filename} because source: #{entry.source_path} does not exist!"
31
+ end
32
+
33
+ # Now do the copy
34
+ FileUtils.cp_r(entry.source_path, entry.build_path)
35
+ end
36
+
37
+ def self.build_resource(entry, bundle); copy_resource(entry, bundle); end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ # Load other build tools. The above are the simple ones.
44
+ Dir.glob(File.join(File.dirname(__FILE__),'build_tools','**','*.rb')).each { |x| require x }