opal 0.2.2 → 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 (325) hide show
  1. data/.gitignore +5 -10
  2. data/LICENSE +75 -0
  3. data/README.md +55 -3
  4. data/Rakefile +62 -139
  5. data/bin/opal +7 -10
  6. data/gems/core/README.md +5 -0
  7. data/gems/core/Rakefile +7 -0
  8. data/gems/core/core.gemspec +13 -0
  9. data/gems/core/lib/core.rb +33 -0
  10. data/gems/core/lib/core/array.rb +1470 -0
  11. data/gems/core/lib/core/basic_object.rb +15 -0
  12. data/gems/core/lib/core/class.rb +31 -0
  13. data/gems/core/lib/core/dir.rb +26 -0
  14. data/gems/core/lib/core/error.rb +43 -0
  15. data/gems/core/lib/core/false_class.rb +21 -0
  16. data/gems/core/lib/core/file.rb +54 -0
  17. data/gems/core/lib/core/hash.rb +725 -0
  18. data/gems/core/lib/core/kernel.rb +240 -0
  19. data/gems/core/lib/core/module.rb +98 -0
  20. data/gems/core/lib/core/nil_class.rb +41 -0
  21. data/gems/core/lib/core/numeric.rb +370 -0
  22. data/gems/core/lib/core/proc.rb +11 -0
  23. data/gems/core/lib/core/range.rb +17 -0
  24. data/gems/core/lib/core/regexp.rb +18 -0
  25. data/gems/core/lib/core/string.rb +328 -0
  26. data/gems/core/lib/core/symbol.rb +15 -0
  27. data/gems/core/lib/core/top_self.rb +8 -0
  28. data/gems/core/lib/core/true_class.rb +20 -0
  29. data/gems/core/lib/core/vm.rb +16 -0
  30. data/{opals/opal/opal → gems/core}/spec/core/array/append_spec.rb +0 -0
  31. data/{opals/opal/opal → gems/core}/spec/core/array/assoc_spec.rb +0 -0
  32. data/{opals/opal/opal → gems/core}/spec/core/array/at_spec.rb +0 -0
  33. data/{opals/opal/opal → gems/core}/spec/core/array/clear_spec.rb +1 -1
  34. data/{opals/opal/opal → gems/core}/spec/core/array/collect_bang_spec.rb +0 -0
  35. data/{opals/opal/opal → gems/core}/spec/core/array/collect_spec.rb +0 -0
  36. data/gems/core/spec/core/array/compact_spec.rb +41 -0
  37. data/{opals/opal/opal → gems/core}/spec/core/array/concat_spec.rb +0 -0
  38. data/{opals/opal/opal → gems/core}/spec/core/array/constructor_spec.rb +0 -0
  39. data/{opals/opal/opal → gems/core}/spec/core/array/each_spec.rb +0 -0
  40. data/{opals/opal/opal → gems/core}/spec/core/array/element_reference_spec.rb +0 -0
  41. data/{opals/opal/opal → gems/core}/spec/core/array/first_spec.rb +1 -1
  42. data/{opals/opal/opal → gems/core}/spec/core/array/include_spec.rb +0 -0
  43. data/gems/core/spec/core/array/join_spec.rb +6 -0
  44. data/gems/core/spec/core/array/last_spec.rb +51 -0
  45. data/gems/core/spec/core/array/length_spec.rb +6 -0
  46. data/{opals/opal/opal → gems/core}/spec/core/array/map_spec.rb +2 -0
  47. data/gems/core/spec/core/array/reverse_spec.rb +6 -0
  48. data/{opals/opal/opal → gems/core}/spec/core/builtin_constants/builtin_constants_spec.rb +0 -0
  49. data/{opals/opal/opal → gems/core}/spec/core/false/and_spec.rb +0 -0
  50. data/{opals/opal/opal → gems/core}/spec/core/false/inspect_spec.rb +0 -0
  51. data/{opals/opal/opal → gems/core}/spec/core/false/or_spec.rb +0 -0
  52. data/{opals/opal/opal → gems/core}/spec/core/false/to_s_spec.rb +0 -0
  53. data/{opals/opal/opal → gems/core}/spec/core/false/xor_spec.rb +0 -0
  54. data/{opals/opal/opal → gems/core}/spec/core/file/join_spec.rb +1 -1
  55. data/gems/core/spec/core/hash/assoc_spec.rb +32 -0
  56. data/{opals/opal/opal → gems/core}/spec/core/kernel/instance_eval_spec.rb +0 -0
  57. data/{opals/opal/opal → gems/core}/spec/core/kernel/loop_spec.rb +0 -0
  58. data/{opals/opal/opal → gems/core}/spec/core/kernel/raise_spec.rb +0 -0
  59. data/{opals/opal/opal → gems/core}/spec/core/module/attr_accessor_spec.rb +0 -0
  60. data/{opals/opal/opal → gems/core}/spec/core/number/lt_spec.rb +0 -0
  61. data/gems/core/spec/core/string/sub_spec.rb +24 -0
  62. data/{opals/opal/opal → gems/core}/spec/core/true/and_spec.rb +0 -0
  63. data/{opals/opal/opal → gems/core}/spec/core/true/inspect_spec.rb +0 -0
  64. data/{opals/opal/opal → gems/core}/spec/core/true/or_spec.rb +0 -0
  65. data/{opals/opal/opal → gems/core}/spec/core/true/to_s_spec.rb +0 -0
  66. data/{opals/opal/opal → gems/core}/spec/core/true/xor_spec.rb +0 -0
  67. data/{opals/opal/opal → gems/core}/spec/language/and_spec.rb +2 -3
  68. data/{opals/opal/opal → gems/core}/spec/language/array_spec.rb +21 -5
  69. data/gems/core/spec/language/block_spec.rb +38 -0
  70. data/{opals/opal/opal → gems/core}/spec/language/break_spec.rb +0 -0
  71. data/gems/core/spec/language/case_spec.rb +103 -0
  72. data/{opals/opal/opal → gems/core}/spec/language/def_spec.rb +11 -1
  73. data/{opals/opal/opal → gems/core}/spec/language/eigenclass_spec.rb +0 -0
  74. data/gems/core/spec/language/file_spec.rb +13 -0
  75. data/gems/core/spec/language/fixtures/block.rb +21 -0
  76. data/gems/core/spec/language/fixtures/super.rb +293 -0
  77. data/{opals/opal/opal → gems/core}/spec/language/hash_spec.rb +0 -0
  78. data/{opals/opal/opal → gems/core}/spec/language/if_spec.rb +0 -0
  79. data/{opals/opal/opal → gems/core}/spec/language/loop_spec.rb +0 -0
  80. data/gems/core/spec/language/metaclass_spec.rb +21 -0
  81. data/{opals/opal/opal → gems/core}/spec/language/method_spec.rb +60 -0
  82. data/{opals/opal/opal → gems/core}/spec/language/next_spec.rb +0 -0
  83. data/{opals/opal/opal → gems/core}/spec/language/or_spec.rb +0 -0
  84. data/{opals/opal/opal → gems/core}/spec/language/redo_spec.rb +0 -0
  85. data/gems/core/spec/language/regexp_spec.rb +26 -0
  86. data/{opals/opal/opal → gems/core}/spec/language/rescue_spec.rb +0 -0
  87. data/{opals/opal/opal → gems/core}/spec/language/return_spec.rb +0 -0
  88. data/{opals/opal/opal → gems/core}/spec/language/string_spec.rb +0 -0
  89. data/gems/core/spec/language/super_spec.rb +32 -0
  90. data/{opals/opal/opal → gems/core}/spec/language/until_spec.rb +47 -47
  91. data/gems/core/spec/language/variables_spec.rb +155 -0
  92. data/{opals/opal/opal → gems/core}/spec/language/while_spec.rb +47 -47
  93. data/{opals/opal/opal → gems/core}/spec/spec_helper.rb +1 -1
  94. data/gems/core_fs/README.md +19 -0
  95. data/gems/dev/Rakefile +5 -0
  96. data/gems/dev/lib/dev.js +99 -0
  97. data/gems/dev/lib/dev/generator.js +1264 -0
  98. data/gems/dev/lib/dev/parser.js +979 -0
  99. data/gems/dev/lib/dev/ruby_parser.js +1088 -0
  100. data/gems/dev/lib/dev/ruby_parser.y +1267 -0
  101. data/gems/dev/lib/dev/string_scanner.js +38 -0
  102. data/gems/dev/tools/racc2js/README.md +39 -0
  103. data/gems/dev/tools/racc2js/math_parser.js +222 -0
  104. data/gems/dev/tools/racc2js/math_parser.rb +133 -0
  105. data/gems/dev/tools/racc2js/math_parser.y +28 -0
  106. data/gems/dev/tools/racc2js/parser.js +218 -0
  107. data/gems/dev/tools/racc2js/racc2js.rb +153 -0
  108. data/gems/json/README.md +4 -0
  109. data/gems/json/json.gemspec +14 -0
  110. data/gems/json/lib/json.rb +64 -0
  111. data/gems/json/lib/json/ext.rb +51 -0
  112. data/{opals/opal/browser/lib/browser/json_parse.js → gems/json/lib/json/json2.js} +197 -37
  113. data/gems/ospec/README.md +0 -0
  114. data/gems/ospec/lib/ospec.rb +6 -0
  115. data/gems/ospec/lib/ospec/autorun.rb +3 -0
  116. data/gems/ospec/lib/ospec/dsl.rb +15 -0
  117. data/gems/ospec/lib/ospec/example.rb +11 -0
  118. data/gems/ospec/lib/ospec/example/before_and_after_hooks.rb +56 -0
  119. data/gems/ospec/lib/ospec/example/errors.rb +17 -0
  120. data/gems/ospec/lib/ospec/example/example_group.rb +12 -0
  121. data/gems/ospec/lib/ospec/example/example_group_factory.rb +21 -0
  122. data/gems/ospec/lib/ospec/example/example_group_hierarchy.rb +20 -0
  123. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/example/example_group_methods.rb +26 -68
  124. data/gems/ospec/lib/ospec/example/example_group_proxy.rb +14 -0
  125. data/gems/ospec/lib/ospec/example/example_methods.rb +46 -0
  126. data/gems/ospec/lib/ospec/example/example_proxy.rb +18 -0
  127. data/gems/ospec/lib/ospec/expectations.rb +19 -0
  128. data/gems/ospec/lib/ospec/expectations/errors.rb +8 -0
  129. data/gems/ospec/lib/ospec/expectations/fail_with.rb +8 -0
  130. data/gems/ospec/lib/ospec/expectations/handler.rb +27 -0
  131. data/gems/ospec/lib/ospec/matchers.rb +24 -0
  132. data/{opals/opal/Rakefile → gems/ospec/lib/ospec/matchers/be.rb} +0 -0
  133. data/gems/ospec/lib/ospec/matchers/generated_descriptions.rb +20 -0
  134. data/gems/ospec/lib/ospec/matchers/operator_matcher.rb +52 -0
  135. data/gems/ospec/lib/ospec/runner.rb +40 -0
  136. data/gems/ospec/lib/ospec/runner/example_group_runner.rb +44 -0
  137. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/formatter/html_formatter.rb +31 -40
  138. data/gems/ospec/lib/ospec/runner/formatter/terminal_formatter.rb +48 -0
  139. data/gems/ospec/lib/ospec/runner/options.rb +36 -0
  140. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/reporter.rb +23 -55
  141. data/gems/ospec/ospec.gemspec +0 -0
  142. data/gems/rquery/README.md +9 -0
  143. data/gems/rquery/lib/rquery.rb +10 -0
  144. data/gems/rquery/lib/rquery/ajax.rb +4 -0
  145. data/gems/rquery/lib/rquery/css.rb +96 -0
  146. data/gems/rquery/lib/rquery/document.rb +25 -0
  147. data/gems/rquery/lib/rquery/element.rb +292 -0
  148. data/gems/rquery/lib/rquery/event.rb +108 -0
  149. data/gems/rquery/lib/rquery/jquery.js +8177 -0
  150. data/gems/rquery/lib/rquery/request.rb +138 -0
  151. data/gems/rquery/lib/rquery/response.rb +49 -0
  152. data/gems/rquery/rquery.gemspec +16 -0
  153. data/lib/opal.js +1597 -0
  154. data/lib/opal.rb +6 -69
  155. data/lib/opal/builder.rb +115 -0
  156. data/lib/opal/bundle.rb +131 -0
  157. data/lib/opal/command.rb +11 -0
  158. data/lib/opal/context.rb +69 -0
  159. data/lib/opal/context/console.rb +12 -0
  160. data/lib/opal/context/file_system.rb +19 -0
  161. data/lib/opal/context/loader.rb +117 -0
  162. data/lib/opal/gem.rb +153 -0
  163. data/lib/opal/ruby/nodes.rb +1302 -0
  164. data/lib/opal/ruby/parser.rb +780 -0
  165. data/lib/opal/ruby/ruby_parser.rb +5170 -0
  166. data/lib/opal/ruby/ruby_parser.y +1298 -0
  167. data/opal.gemspec +11 -256
  168. metadata +179 -240
  169. data/.gitmodules +0 -6
  170. data/Opalfile +0 -384
  171. data/VERSION +0 -1
  172. data/demos/apps/browser_demo/index.html +0 -11
  173. data/demos/apps/browser_demo/lib/browser_demo.rb +0 -31
  174. data/demos/apps/simple_opal/Opalfile +0 -13
  175. data/demos/apps/simple_opal/index.html +0 -11
  176. data/demos/apps/simple_opal/lib/app_controller.rb +0 -62
  177. data/demos/apps/simple_opal/lib/main_window.rb +0 -146
  178. data/demos/browser/request/index.html +0 -52
  179. data/demos/browser/request/request.rb +0 -48
  180. data/gen/browser/__PROJECT_NAME__/Rakefile +0 -12
  181. data/gen/browser/__PROJECT_NAME__/index.html +0 -11
  182. data/gen/browser/__PROJECT_NAME__/javascripts/opal.debug.js +0 -4687
  183. data/gen/browser/__PROJECT_NAME__/javascripts/opal.min.js +0 -175
  184. data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +0 -1
  185. data/lib/opal/builders/base.rb +0 -50
  186. data/lib/opal/builders/css.rb +0 -46
  187. data/lib/opal/builders/javascript.rb +0 -44
  188. data/lib/opal/builders/opal.rb +0 -79
  189. data/lib/opal/builders/ruby.rb +0 -50
  190. data/lib/opal/builders/ruby/generate.rb +0 -1851
  191. data/lib/opal/builders/ruby/nodes.rb +0 -210
  192. data/lib/opal/builders/ruby/ruby.rb +0 -916
  193. data/lib/opal/builders/ruby/ruby_parser.rb +0 -6008
  194. data/lib/opal/builders/ruby/ruby_parser.rb.y +0 -1451
  195. data/lib/opal/models/build_item.rb +0 -104
  196. data/lib/opal/models/hash_struct.rb +0 -40
  197. data/lib/opal/models/project.rb +0 -252
  198. data/lib/opal/models/struct_accessors.rb +0 -58
  199. data/lib/opal/models/target.rb +0 -176
  200. data/lib/opal/opal/build.rb +0 -169
  201. data/lib/opal/opal/env/console.rb +0 -66
  202. data/lib/opal/opal/env/fs.rb +0 -98
  203. data/lib/opal/opal/env/object.rb +0 -48
  204. data/lib/opal/opal/environment.rb +0 -139
  205. data/lib/opal/opal/gen.rb +0 -62
  206. data/lib/opal/opal/opal.rb +0 -75
  207. data/lib/opal/opal/repl.rb +0 -38
  208. data/lib/opal/opalfile/dsl.rb +0 -62
  209. data/lib/opal/opalfile/opalfile.rb +0 -133
  210. data/lib/opal/opalfile/task.rb +0 -96
  211. data/lib/opal/opalfile/task_manager.rb +0 -63
  212. data/lib/opal/opalfile/task_scope.rb +0 -52
  213. data/lib/opal/rack/app_server.rb +0 -119
  214. data/lib/opal/rake/opal_task.rb +0 -34
  215. data/opals/opal/README.md +0 -37
  216. data/opals/opal/browser/Opalfile +0 -11
  217. data/opals/opal/browser/README.md +0 -146
  218. data/opals/opal/browser/SIZZLE_LICESNSE.txt +0 -148
  219. data/opals/opal/browser/lib/browser.rb +0 -118
  220. data/opals/opal/browser/lib/browser/builder.rb +0 -41
  221. data/opals/opal/browser/lib/browser/canvas_context.rb +0 -115
  222. data/opals/opal/browser/lib/browser/dimensions.rb +0 -50
  223. data/opals/opal/browser/lib/browser/document.rb +0 -146
  224. data/opals/opal/browser/lib/browser/element.rb +0 -487
  225. data/opals/opal/browser/lib/browser/element/attributes.rb +0 -88
  226. data/opals/opal/browser/lib/browser/element/css.rb +0 -290
  227. data/opals/opal/browser/lib/browser/element/form.rb +0 -146
  228. data/opals/opal/browser/lib/browser/event/dom_events.rb +0 -81
  229. data/opals/opal/browser/lib/browser/event/event.rb +0 -177
  230. data/opals/opal/browser/lib/browser/event/trigger_events.rb +0 -53
  231. data/opals/opal/browser/lib/browser/geometry.rb +0 -97
  232. data/opals/opal/browser/lib/browser/json.rb +0 -32
  233. data/opals/opal/browser/lib/browser/request/request.rb +0 -201
  234. data/opals/opal/browser/lib/browser/sizzle.js +0 -1068
  235. data/opals/opal/browser/lib/browser/string.rb +0 -42
  236. data/opals/opal/browser/lib/browser/touch.rb +0 -37
  237. data/opals/opal/browser/lib/browser/vml_context.js +0 -33
  238. data/opals/opal/browser/lib/browser/window.rb +0 -36
  239. data/opals/opal/browser/spec/browser/browser_detection_spec.rb +0 -7
  240. data/opals/opal/browser/spec/document/aref_spec.rb +0 -110
  241. data/opals/opal/browser/spec/document/ready_spec.rb +0 -16
  242. data/opals/opal/browser/spec/element/body_spec.rb +0 -11
  243. data/opals/opal/browser/spec/element/clear_spec.rb +0 -26
  244. data/opals/opal/browser/spec/element/empty_spec.rb +0 -29
  245. data/opals/opal/browser/spec/element/has_class_spec.rb +0 -40
  246. data/opals/opal/browser/spec/element/hidden_spec.rb +0 -23
  247. data/opals/opal/browser/spec/element/hide_spec.rb +0 -31
  248. data/opals/opal/browser/spec/element/remove_spec.rb +0 -25
  249. data/opals/opal/browser/spec/element/show_spec.rb +0 -31
  250. data/opals/opal/browser/spec/element/style_spec.rb +0 -69
  251. data/opals/opal/browser/spec/element/toggle_spec.rb +0 -31
  252. data/opals/opal/browser/spec/element/visible_spec.rb +0 -23
  253. data/opals/opal/browser/spec/spec_helper.rb +0 -1
  254. data/opals/opal/opal/Opalfile +0 -14
  255. data/opals/opal/opal/spec/core/array/compact_spec.rb +0 -15
  256. data/opals/opal/opal/spec/fixtures/super.rb +0 -70
  257. data/opals/opal/opal/spec/language/____temp_remove_this.rb +0 -12
  258. data/opals/opal/opal/spec/language/block_spec.rb +0 -18
  259. data/opals/opal/opal/spec/language/case_spec.rb +0 -103
  260. data/opals/opal/opal/spec/language/metaclass_spec.rb +0 -21
  261. data/opals/opal/opal/spec/language/super_spec.rb +0 -26
  262. data/opals/opal/runtime/Opalfile +0 -78
  263. data/opals/opal/runtime/README.md +0 -12
  264. data/opals/opal/runtime/docs/debugging.md +0 -51
  265. data/opals/opal/runtime/lib/array.rb +0 -1516
  266. data/opals/opal/runtime/lib/basic_object.rb +0 -49
  267. data/opals/opal/runtime/lib/class.rb +0 -54
  268. data/opals/opal/runtime/lib/dir.rb +0 -36
  269. data/opals/opal/runtime/lib/error.rb +0 -49
  270. data/opals/opal/runtime/lib/false_class.rb +0 -52
  271. data/opals/opal/runtime/lib/file.rb +0 -79
  272. data/opals/opal/runtime/lib/hash.rb +0 -791
  273. data/opals/opal/runtime/lib/io.rb +0 -39
  274. data/opals/opal/runtime/lib/kernel.rb +0 -288
  275. data/opals/opal/runtime/lib/match_data.rb +0 -36
  276. data/opals/opal/runtime/lib/module.rb +0 -109
  277. data/opals/opal/runtime/lib/nil_class.rb +0 -69
  278. data/opals/opal/runtime/lib/number.rb +0 -398
  279. data/opals/opal/runtime/lib/proc.rb +0 -77
  280. data/opals/opal/runtime/lib/range.rb +0 -63
  281. data/opals/opal/runtime/lib/regexp.rb +0 -111
  282. data/opals/opal/runtime/lib/ruby.rb +0 -30
  283. data/opals/opal/runtime/lib/string.rb +0 -328
  284. data/opals/opal/runtime/lib/symbol.rb +0 -40
  285. data/opals/opal/runtime/lib/top_self.rb +0 -33
  286. data/opals/opal/runtime/lib/true_class.rb +0 -45
  287. data/opals/opal/runtime/runtime/browser.js +0 -287
  288. data/opals/opal/runtime/runtime/debug.js +0 -180
  289. data/opals/opal/runtime/runtime/opal.js +0 -1008
  290. data/opals/opal/runtime/runtime/post_opal.js +0 -1
  291. data/opals/opal/runtime/runtime/pre_opal.js +0 -2
  292. data/opals/opal/runtime/runtime/server_side.js +0 -50
  293. data/opals/opal/spec/LICENSE.txt +0 -26
  294. data/opals/opal/spec/Opalfile +0 -5
  295. data/opals/opal/spec/bin/spec.rb +0 -43
  296. data/opals/opal/spec/lib/spec.rb +0 -33
  297. data/opals/opal/spec/lib/spec/dsl.rb +0 -41
  298. data/opals/opal/spec/lib/spec/example.rb +0 -35
  299. data/opals/opal/spec/lib/spec/example/before_and_after_hooks.rb +0 -81
  300. data/opals/opal/spec/lib/spec/example/errors.rb +0 -42
  301. data/opals/opal/spec/lib/spec/example/example_group.rb +0 -37
  302. data/opals/opal/spec/lib/spec/example/example_group_factory.rb +0 -43
  303. data/opals/opal/spec/lib/spec/example/example_group_hierarchy.rb +0 -45
  304. data/opals/opal/spec/lib/spec/example/example_group_proxy.rb +0 -41
  305. data/opals/opal/spec/lib/spec/example/example_methods.rb +0 -73
  306. data/opals/opal/spec/lib/spec/example/example_proxy.rb +0 -48
  307. data/opals/opal/spec/lib/spec/expectations.rb +0 -46
  308. data/opals/opal/spec/lib/spec/expectations/errors.rb +0 -35
  309. data/opals/opal/spec/lib/spec/expectations/fail_with.rb +0 -37
  310. data/opals/opal/spec/lib/spec/expectations/handler.rb +0 -48
  311. data/opals/opal/spec/lib/spec/matchers.rb +0 -50
  312. data/opals/opal/spec/lib/spec/matchers/be.rb +0 -26
  313. data/opals/opal/spec/lib/spec/matchers/generated_descriptions.rb +0 -47
  314. data/opals/opal/spec/lib/spec/matchers/operator_matcher.rb +0 -66
  315. data/opals/opal/spec/lib/spec/runner.rb +0 -48
  316. data/opals/opal/spec/lib/spec/runner/example_group_runner.rb +0 -71
  317. data/opals/opal/spec/lib/spec/runner/formatter/terminal_formatter.rb +0 -82
  318. data/opals/opal/spec/lib/spec/runner/options.rb +0 -63
  319. data/opals/opal/spec/resources/index.html +0 -25
  320. data/opals/opal/spec/resources/spec.css +0 -132
  321. data/spec/cherry_kit/iseq_spec.rb +0 -38
  322. data/spec/spec_helper.rb +0 -16
  323. data/spec/vienna_spec.rb +0 -7
  324. data/yard/index.html +0 -43
  325. data/yard/style.css +0 -765
@@ -1,146 +0,0 @@
1
- #
2
- # document.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
- # The [Document] module.
28
- module Document
29
-
30
- # Search the DOM using the given CSS3 `selector`. This will return a single
31
- # element when used with a symbol or a string representing an id, or an array
32
- # otherwise.
33
- #
34
- # @example HTML
35
- # !!!plain
36
- # <div id="foo" class="a"></div>
37
- # <div class="b"></div>
38
- # <div class="a"></div>
39
- #
40
- # @example Ruby
41
- # Document[:foo]
42
- # # => #<Element div, id="foo">
43
- # Document [:baz]
44
- # # => nil
45
- #
46
- # Document['#foo']
47
- # # => #<Element div, id="foo", class="a">
48
- # Document['#bar']
49
- # # => nil
50
- # Document['.a']
51
- # # => [#<Element div, id="foo", class="a">, #<Element div, class="a">]
52
- # Document['.b']
53
- # # => [#<Element div, class="b">]
54
- # Document['.c']
55
- # # => nil
56
- #
57
- # @param [String, Symbol] selector the selector to search
58
- # @return [Array, Element] the result
59
- def self.[](selector)
60
- # puts "checking #{selector}"
61
- case selector
62
- when Symbol
63
- # puts "need to find symbol #{selector}"
64
- find_by_id selector
65
- # puts "and here"
66
- when /^#/
67
- # puts "need to find id"
68
- find_by_id selector.slice(1, selector.length)
69
- else
70
- # puts "need to find array of things"
71
- Element.find_in_context selector, self
72
- end
73
- end
74
-
75
- def self.find_by_id(id)
76
- # puts "finding by id #{id}"
77
- Element.from_native `document.getElementById(#{id.to_s})`
78
- end
79
-
80
- @on_ready_actions = []
81
- @__ready__ = false
82
-
83
- def self.ready?(&proc)
84
- if block_given?
85
- if @__ready__
86
- yield
87
- else
88
- @on_ready_actions << proc
89
- end
90
- end
91
-
92
- @__ready__
93
- end
94
-
95
- # private method for when we are now ready to go! (Document is ready)
96
- #
97
- # @private
98
- #
99
- def self.__make_ready
100
- @__ready__ = true
101
-
102
- @on_ready_actions.each do |action|
103
- action.call
104
- end
105
- end
106
-
107
- # The body element of the page
108
- #
109
- # @return [Element] body element of document
110
- def self.body
111
- Element.from_native `document.body`
112
- end
113
-
114
- # traverse the document looking for elements matching the given conditions.
115
- # This is mostly a private method? - uses js node names instead of opal/ruby
116
- #
117
- # @param [Element] element the element to begin with
118
- # @param [String] path the path to lookup
119
- # @param [String] stop_state
120
- # @param [true, false] all boolean whether we want all results, or just first
121
- # @return [Element, Array<Element>] single element, or all results (all?)
122
- def self.traverse(element, path, stop_state, all)
123
- `var result = [];
124
- var working = #{element}.__element__[#{path}];
125
- while (working && (working.nodeType == 1)) {
126
- //console.log("working is:");
127
- //console.log(working);
128
- if (!#{all}.r) {
129
- return #{Element}.$from_native(working);
130
- } else {
131
- result.push(#{Element}.$from_native(working));
132
- }
133
- working = working[path];
134
- }
135
- return result`
136
- end
137
-
138
- # Quick hack/snippet to make document ready when opal receives triggers
139
- `opal.setDocumentReadyListener(function() {
140
- #{Document.__make_ready};
141
- });`
142
-
143
- # Document should represen the native 'document'
144
- `#{self}.__element__ = document;`
145
-
146
- end
@@ -1,487 +0,0 @@
1
- #
2
- # element.rb
3
- # vienna
4
- #
5
- # Created by Adam Beynon.
6
- # Copyright 2010 Adam Beynon.
7
- #
8
- # Permission is hereby granted, free of charge, to any person obtaining a copy
9
- # of this software and associated documentation files (the "Software"), to deal
10
- # in the Software without restriction, including without limitation the rights
11
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- # copies of the Software, and to permit persons to whom the Software is
13
- # furnished to do so, subject to the following conditions:
14
- #
15
- # The above copyright notice and this permission notice shall be included in
16
- # all copies or substantial portions of the Software.
17
- #
18
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
- # THE SOFTWARE.
25
- #
26
-
27
- # Represents a DOM element in the browser.
28
- #
29
- # ## Implementation Details
30
- #
31
- # Native Elements are not extended due to cross browser issues. Instead,
32
- # instances of this class will have an instance property '__element__' which
33
- # is the native javascript element. Extensions to this class should access
34
- # the element in this way for modification etc. In future, this class will
35
- # cache some information on the element, such as class name etc in an aim to
36
- # speed up performance by reducing hits to the DOM.
37
- class Element
38
-
39
- # @group Managing Elements in the Document
40
-
41
- # Creates a new element of the specified type.
42
- #
43
- # @param [Symbol, String] type the tag name for the +Element+ to have
44
- # @param [Hash] options a set of options given to {#set}
45
- # @return [Element] returns the new element
46
- def initialize(type, options = {})
47
- `if (!#{options}) { #{options} = vnH()}`
48
- # puts "creating new element #{type}"
49
- `#{self}.__element__ = document.createElement(#{type.to_s});`
50
- set options
51
- end
52
-
53
- # Return an instance with the passed native element as the instance's own
54
- # element. This is used to return the body element, for instance
55
- #
56
- # Element.from_native(..some native element pointer..)
57
- # # => element
58
- #
59
- # @note The given element MUST be a Javascript element, not an Opal one.
60
- #
61
- # @param [Native Element] element
62
- # @return [Element]
63
- #
64
- def self.from_native(native_element)
65
- #`console.log("loogking up for " + #{native_element});`
66
- `if(!#{native_element}) return #{nil};`
67
- element = allocate
68
- `#{element}.__element__ = #{native_element};`
69
- element
70
- end
71
-
72
- # Return the body element for the document. The body element is an instance
73
- # of this class, with some singleton methods defined, such as inspect so
74
- # that it gets some nicer inspect properties.
75
- #
76
- # @return [Element] body element
77
- #
78
- def self.body
79
- return @body_element if @body_element
80
-
81
- @body_element = from_native(`document.body`)
82
- # def @body_element.inspect
83
- # "#<Element body>"
84
- # end
85
-
86
- @body_element
87
- end
88
-
89
- # Find the DOM selector in the given context. Context should always be
90
- # given.
91
- #
92
- # Element.find_in_context('.first', Element.body)
93
- #
94
- # @param [String|Synbol] selector
95
- # @param [Element] context
96
- # @return [Array]
97
- #
98
- def self.find_in_context(selector, context)
99
- selector = `'#' + #{selector.to_s}` if selector.is_a? Symbol
100
- elements = `Sizzle(#{selector}, #{context}.__element__);`
101
- # if elements.length == 1
102
- # `return #{Element}.$from_native(#{elements}[0]);`
103
- # else
104
- # `console.log(#{elements});`
105
- # raise "need to handle find_in_context array"
106
- # end
107
-
108
- elements.map do |e|
109
- from_native e
110
- end
111
- end
112
-
113
- def find(selector)
114
- self.class.find_in_context selector, self
115
- end
116
-
117
- # Returns the tag name of the Element as a symbol, in lower case.
118
- #
119
- # @example HTML
120
- # <div id="my_div"></div>
121
- #
122
- # @example Ruby
123
- # Document[:my_div].tag
124
- # # => :div
125
- #
126
- # @return [Symbol] tag name of the element
127
- def tag
128
- @tag ||= `#{self}.Y(#{self}.__element__.tagName.toLowerCase())`
129
- end
130
-
131
- # Sets the innerHTML of the receiver.
132
- #
133
- # @example HTML
134
- # <div id="foo"></foo>
135
- #
136
- # @example Ruby
137
- # Document[:foo].html = "<div></div>"
138
- #
139
- # @example Result
140
- # <div id="foo">
141
- # <div></div>
142
- # </div>
143
- #
144
- # @param [String] html the html string to set
145
- # @return [Elements] returns the receiver
146
- def html=(html)
147
- `#{self}.__element__.innerHTML = #{html};`
148
- self
149
- end
150
-
151
- # Returns the text content of the receiver.
152
- #
153
- # @example HTML
154
- # <div id="foo">bar</div>
155
- #
156
- # @example Ruby
157
- # Document[:foo].text # => "bar"
158
- #
159
- # @return [String] the receivers text content
160
- def text
161
- `var e = #{self}.__element__;
162
- return e.innerText == null ? e.textContent : e.innerText;`
163
- end
164
-
165
- # Set the inner text content of the receiver.
166
- #
167
- # @example HTML
168
- # <div id="foo"></div>
169
- #
170
- # @example Ruby
171
- # Document[:foo].text = "bar"
172
- #
173
- # @example Result
174
- # <div id="foo">bar</div>
175
- #
176
- # @param [String] text the text content to set
177
- # @return [Element] returns the receiver
178
- def text=(text)
179
- `var e = #{self}.__element__;
180
- if (e.textContent !== undefined) {
181
- e.textContent = #{text}.toString();
182
- }
183
- else {
184
- e.innerText = #{text}.toString();
185
- }`
186
- self
187
- end
188
-
189
- alias_method :content=, :text=
190
-
191
- # Set the id of the receiver
192
- #
193
- # @example HTML
194
- # <div class="foo"></div>
195
- #
196
- # @example Ruby
197
- # Document['.foo'].first.id = "bar"
198
- #
199
- # @example Result
200
- # <div class="foo" id="bar"></div>
201
- #
202
- # @param [String, Symbol] id the id to set on the element
203
- # @return [Element] returns the receiver
204
- def id=(id)
205
- `#{self}.__element__.id = #{id.to_s};`
206
- self
207
- end
208
-
209
- # Returns the id of the receiver as a +Symbol+, or +nil+ if no id is defined.
210
- #
211
- # @example HTML
212
- # <div id="foo" class="bar"><div>
213
- # <div class="baz"</div>
214
- #
215
- # @example Ruby
216
- # Document['.bar'].first.id # => :foo
217
- # Document['.baz'].first.id # => nil
218
- #
219
- # @return [Symbol, nil] returns the id of the receiver
220
- def id
221
- `return #{self}.__element__.id || #{nil};`
222
- end
223
-
224
- # Returns +true+ if the receiver is the body element, +false+ otherwise
225
- #
226
- # @example Testing Elements
227
- # Document[:foo].body? # => false
228
- # Document.body.body? # => true
229
- #
230
- # @return [true, false] whether the receiver is the body element
231
- def body?
232
- false
233
- end
234
-
235
- def inspect
236
- description = ["#<Element #{tag}"]
237
- description << " class_name='#{class_name}'" unless class_name == ""
238
- description << " id='#{id}'" unless id == ""
239
- description << ">"
240
- description.join ""
241
- end
242
-
243
- # Set some options on the element
244
- #
245
- # @example
246
- # element.set :class_name => "adam", :id => "beynon"
247
- #
248
- # ## Valid keys:
249
- #
250
- # - class / class_name
251
- # - id
252
- # - text /content
253
- # - html
254
- #
255
- # @param [Hash] options to set
256
- # @return [Element] returns the receiver
257
- def set(options)
258
- options.each do |key, value|
259
- __send__ "#{key}=", value
260
- end
261
- end
262
-
263
- # =========================================
264
- # = Inserting/appending/removing children =
265
- # =========================================
266
-
267
- # Insert the given element in location :bottom
268
- #
269
- # @param [Element] element the element to insert
270
- # @return [Element] returns the receiver
271
- def <<(element)
272
- append element
273
- end
274
-
275
- # Insert the given +element+ at the bottom of the receiver
276
- #
277
- # @param [Element] element the element to append
278
- # @return [Element] returns the receiver
279
- def append(element)
280
- `#{self}.__element__.appendChild(#{element}.__element__);`
281
- self
282
- end
283
-
284
- # Insert the given +element+ before the receiver
285
- #
286
- # @param [Element] element the element to insert
287
- # @return [Element] returns the receiver
288
- def before(element)
289
- `var parent = #{self}.__element__.parentNode;
290
- if (parent) {
291
- parent.insertBefore(#{element}.__element__, #{self}.__element__);
292
- }`
293
- self
294
- end
295
-
296
- # Insert the given +element+ after the receiver, but before the next sibling
297
- #
298
- # @param [Element] element the element to insert
299
- # @return [Element] returns the receiver
300
- def after(element)
301
- `var parent = #{self}.__element__.parentNode;
302
- if (parent) {
303
- parent.insertBefore(#{element}.__element__, #{self}.__element__.nextSibling);
304
- }`
305
- self
306
- end
307
-
308
-
309
-
310
- # Removes the receiver from the DOM, and then returns it.
311
- #
312
- # @example HTML
313
- # !!!plain
314
- # <div id="foo"></div>
315
- # <div id="bar"></div>
316
- #
317
- # @example Ruby
318
- # Document[:foo].dispose
319
- #
320
- # @example Result
321
- # !!!plain
322
- # <div id="bar"></div>
323
- #
324
- # @return [Element] returns the receiver.
325
- def remove
326
- `var e = #{self}.__element__;
327
- if (e.parentNode) {
328
- e.parentNode.removeChild(e);
329
- }`
330
- self
331
- end
332
-
333
- # Removes all children from the receiver and then removes the receiver itself
334
- # from the DOM tree
335
- #
336
- # @return [nil] returns nil
337
- def destroy
338
- # FIXME: we do not do this properly.
339
- remove
340
- end
341
-
342
-
343
- # Returns `true` if the receiver is empty (contains only whitespace), `false`
344
- # otherwise.
345
- #
346
- # @example HTML
347
- # !!!plain
348
- # <div id="foo"></div>
349
- # <div id="bar"><p></p></div>
350
- # <div id="baz"> </baz>
351
- #
352
- # @example Ruby
353
- # Document[:foo].empty?
354
- # # => true
355
- # Document[:bar].empty?
356
- # # => false
357
- # Document[:baz].empty?
358
- # # => true
359
- #
360
- # @return [Boolean]
361
- def empty?
362
- `return /^\s*$/.test(#{self}.__element__.innerHTML) ? #{true} : #{false};`
363
- end
364
-
365
- # Removes all child elements from the receiver, and then returns self.
366
- #
367
- # @example HTML
368
- # !!!plain
369
- # <div id="foo">
370
- # <span class="bar"></span>
371
- # <div class="baz"></div>
372
- # </div>
373
- #
374
- # @example Ruby
375
- # Document[:foo].empty
376
- # # => #<Element div, id='foo'>
377
- #
378
- # @example Result
379
- # !!!plain
380
- # <div id="foo"></div>
381
- #
382
- # @return [Element] returns receiver
383
- def clear
384
- `var e = #{self}.__element__;
385
- for (var children = e.childNodes, i = children.length; i > 0;) {
386
- var child = children[--i];
387
- if (child.parentNode) {
388
- child.parentNode.removeChild(child);
389
- }
390
- }`
391
- self
392
- end
393
-
394
- # Return the graphics context of the receiver, which will be an instance of
395
- # [CanvasContext] or a subclass (for VML browsers). Everytime this method is
396
- # called, the native 'getContext' method is applied for complaince with its
397
- # side effects (clearing context etc)
398
- #
399
- # @return [CanvasContext] the canvas context for the receiver
400
- def context
401
- CanvasContext.new self
402
- end
403
-
404
-
405
- # ========================
406
- # = Parent, children etc =
407
- # ========================
408
-
409
-
410
- # Get the parent of the receiver
411
- #
412
- # @return [Element] the parent
413
- def parent(selector=nil)
414
- Document.traverse self, 'parentNode', nil, false
415
- end
416
-
417
- def parents(selector=nil)
418
- Document.traverse self, 'parentNode', nil, true
419
- end
420
-
421
- def next(selector=nil)
422
- Document.traverse self, 'nextSibling', nil, false
423
- end
424
-
425
- def prev(selector=nil)
426
- Document.traverse self, 'previousSibling', nil, false
427
- end
428
-
429
- def first(selector=nil)
430
- Document.traverse self, 'firstChild', nil, false
431
- end
432
-
433
- def last(selector=nil)
434
- Document.traverse self, 'lastChild', nil, false
435
- end
436
-
437
-
438
- # Append the element. If string passed, then add as html content
439
- #
440
- def <<(elem)
441
- append elem
442
- self
443
- end
444
-
445
- # Returns the offset of the element, taking into account the parents, scroll
446
- # values, etc etc. needs improving, not 100% for all browsers
447
- #
448
- # @return [Hash] :left/:top => Number
449
- #
450
- def element_offset
451
- left = 0
452
- top = 0
453
-
454
- `var element = #{self}.__element__;
455
- var parent = element;
456
- while (parent) {
457
- #{left} += parent.offsetLeft;
458
- #{top} += parent.offsetTop;
459
- parent = parent.offsetParent;
460
- }
461
- `
462
- Point.new left, top
463
- end
464
-
465
- # All valid html tags. These are looped over so each element instance has
466
- # an instance method of the same name to construct an element of that type
467
- # with some given options
468
- VALID_HTML_TAGS = [
469
- :html, :head, :title, :base, :meta, :link, :style, :script, :body, :div,
470
- :dl, :dt, :dd, :span, :pre
471
- ]
472
-
473
- VALID_HTML_TAGS.each do |tag_name|
474
- define_method(tag_name) do |options|
475
- # options are the options to se
476
- e = Element.new tag_name, options
477
- # now add to self
478
- self << e
479
- # return new element (for chaining)
480
- e
481
- end
482
- end
483
- end
484
-
485
- require 'browser/element/attributes'
486
- require 'browser/element/css'
487
- require 'browser/element/form'