opal 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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'