jax 0.0.0.1

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 (446) hide show
  1. data/.gitignore +12 -0
  2. data/.gitmodules +3 -0
  3. data/.rvmrc +7 -0
  4. data/Gemfile +4 -0
  5. data/README.rdoc +32 -0
  6. data/Rakefile +144 -0
  7. data/bin/jax +11 -0
  8. data/builtin/shaders/basic/common.ejs +11 -0
  9. data/builtin/shaders/basic/fragment.ejs +5 -0
  10. data/builtin/shaders/basic/vertex.ejs +13 -0
  11. data/builtin/shaders/depthmap/common.ejs +1 -0
  12. data/builtin/shaders/depthmap/fragment.ejs +5 -0
  13. data/builtin/shaders/depthmap/vertex.ejs +7 -0
  14. data/builtin/shaders/fog/common.ejs +7 -0
  15. data/builtin/shaders/fog/fragment.ejs +23 -0
  16. data/builtin/shaders/fog/manifest.yml +12 -0
  17. data/builtin/shaders/fog/material.js +34 -0
  18. data/builtin/shaders/fog/vertex.ejs +10 -0
  19. data/builtin/shaders/functions/depth_map.ejs +24 -0
  20. data/builtin/shaders/functions/lights.ejs +155 -0
  21. data/builtin/shaders/lighting/common.ejs +5 -0
  22. data/builtin/shaders/lighting/fragment.ejs +34 -0
  23. data/builtin/shaders/lighting/manifest.yml +4 -0
  24. data/builtin/shaders/lighting/material.js +26 -0
  25. data/builtin/shaders/lighting/vertex.ejs +7 -0
  26. data/builtin/shaders/normal_map/common.ejs +12 -0
  27. data/builtin/shaders/normal_map/fragment.ejs +26 -0
  28. data/builtin/shaders/normal_map/manifest.yml +17 -0
  29. data/builtin/shaders/normal_map/material.js +16 -0
  30. data/builtin/shaders/normal_map/vertex.ejs +57 -0
  31. data/builtin/shaders/paraboloid-depthmap/common.ejs +6 -0
  32. data/builtin/shaders/paraboloid-depthmap/fragment.ejs +8 -0
  33. data/builtin/shaders/paraboloid-depthmap/material.js +15 -0
  34. data/builtin/shaders/paraboloid-depthmap/vertex.ejs +26 -0
  35. data/builtin/shaders/shadow_map/common.ejs +14 -0
  36. data/builtin/shaders/shadow_map/fragment.ejs +66 -0
  37. data/builtin/shaders/shadow_map/manifest.yml +1 -0
  38. data/builtin/shaders/shadow_map/material.js +26 -0
  39. data/builtin/shaders/shadow_map/vertex.ejs +46 -0
  40. data/builtin/shaders/texture/common.ejs +4 -0
  41. data/builtin/shaders/texture/fragment.ejs +11 -0
  42. data/builtin/shaders/texture/manifest.yml +17 -0
  43. data/builtin/shaders/texture/material.js +18 -0
  44. data/builtin/shaders/texture/vertex.ejs +9 -0
  45. data/guides/assets/images/book_icon.gif +0 -0
  46. data/guides/assets/images/bullet.gif +0 -0
  47. data/guides/assets/images/chapters_icon.gif +0 -0
  48. data/guides/assets/images/check_bullet.gif +0 -0
  49. data/guides/assets/images/credits_pic_blank.gif +0 -0
  50. data/guides/assets/images/edge_badge.png +0 -0
  51. data/guides/assets/images/feature_tile.gif +0 -0
  52. data/guides/assets/images/footer_tile.gif +0 -0
  53. data/guides/assets/images/getting_started/clean_passing_jasmine_suite.png +0 -0
  54. data/guides/assets/images/getting_started/rock.png +0 -0
  55. data/guides/assets/images/getting_started/rock_normal.png +0 -0
  56. data/guides/assets/images/grey_bullet.gif +0 -0
  57. data/guides/assets/images/header_backdrop.png +0 -0
  58. data/guides/assets/images/header_tile.gif +0 -0
  59. data/guides/assets/images/icons/README +5 -0
  60. data/guides/assets/images/icons/callouts/1.png +0 -0
  61. data/guides/assets/images/icons/callouts/10.png +0 -0
  62. data/guides/assets/images/icons/callouts/11.png +0 -0
  63. data/guides/assets/images/icons/callouts/12.png +0 -0
  64. data/guides/assets/images/icons/callouts/13.png +0 -0
  65. data/guides/assets/images/icons/callouts/14.png +0 -0
  66. data/guides/assets/images/icons/callouts/15.png +0 -0
  67. data/guides/assets/images/icons/callouts/2.png +0 -0
  68. data/guides/assets/images/icons/callouts/3.png +0 -0
  69. data/guides/assets/images/icons/callouts/4.png +0 -0
  70. data/guides/assets/images/icons/callouts/5.png +0 -0
  71. data/guides/assets/images/icons/callouts/6.png +0 -0
  72. data/guides/assets/images/icons/callouts/7.png +0 -0
  73. data/guides/assets/images/icons/callouts/8.png +0 -0
  74. data/guides/assets/images/icons/callouts/9.png +0 -0
  75. data/guides/assets/images/icons/caution.png +0 -0
  76. data/guides/assets/images/icons/example.png +0 -0
  77. data/guides/assets/images/icons/home.png +0 -0
  78. data/guides/assets/images/icons/important.png +0 -0
  79. data/guides/assets/images/icons/next.png +0 -0
  80. data/guides/assets/images/icons/note.png +0 -0
  81. data/guides/assets/images/icons/prev.png +0 -0
  82. data/guides/assets/images/icons/tip.png +0 -0
  83. data/guides/assets/images/icons/up.png +0 -0
  84. data/guides/assets/images/icons/warning.png +0 -0
  85. data/guides/assets/images/nav_arrow.gif +0 -0
  86. data/guides/assets/images/tab_grey.gif +0 -0
  87. data/guides/assets/images/tab_info.gif +0 -0
  88. data/guides/assets/images/tab_note.gif +0 -0
  89. data/guides/assets/images/tab_red.gif +0 -0
  90. data/guides/assets/images/tab_yellow.gif +0 -0
  91. data/guides/assets/images/tab_yellow.png +0 -0
  92. data/guides/assets/javascripts/guides.js +7 -0
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +59 -0
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +75 -0
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +59 -0
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +65 -0
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +100 -0
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +97 -0
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +91 -0
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +55 -0
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +41 -0
  102. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +52 -0
  103. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +67 -0
  104. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +52 -0
  105. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +57 -0
  106. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +58 -0
  107. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +72 -0
  108. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +88 -0
  109. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +33 -0
  110. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +74 -0
  111. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +64 -0
  112. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +55 -0
  113. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +94 -0
  114. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +51 -0
  115. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +66 -0
  116. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +56 -0
  117. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +69 -0
  118. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +17 -0
  119. data/guides/assets/stylesheets/fixes.css +16 -0
  120. data/guides/assets/stylesheets/main.css +445 -0
  121. data/guides/assets/stylesheets/print.css +52 -0
  122. data/guides/assets/stylesheets/reset.css +43 -0
  123. data/guides/assets/stylesheets/style.css +13 -0
  124. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +226 -0
  125. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +328 -0
  126. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +331 -0
  127. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +339 -0
  128. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +324 -0
  129. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +328 -0
  130. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +324 -0
  131. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +324 -0
  132. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +324 -0
  133. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +117 -0
  134. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +120 -0
  135. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +128 -0
  136. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +113 -0
  137. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +117 -0
  138. data/guides/assets/stylesheets/syntaxhighlighter/shThemeJaxGuides.css +116 -0
  139. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +113 -0
  140. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +113 -0
  141. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +113 -0
  142. data/guides/jax_guides.rb +41 -0
  143. data/guides/jax_guides/common.rb +7 -0
  144. data/guides/jax_guides/generator.rb +287 -0
  145. data/guides/jax_guides/helpers.rb +29 -0
  146. data/guides/jax_guides/indexer.rb +69 -0
  147. data/guides/jax_guides/levenshtein.rb +31 -0
  148. data/guides/jax_guides/textile_extensions.rb +61 -0
  149. data/guides/source/getting_started.textile +1171 -0
  150. data/guides/source/index.html.erb +50 -0
  151. data/guides/source/layout.html.erb +158 -0
  152. data/guides/source/lighting.textile +5 -0
  153. data/guides/source/materials.textile +5 -0
  154. data/guides/source/shaders.textile +5 -0
  155. data/guides/source/testing.textile +5 -0
  156. data/guides/w3c_validator.rb +91 -0
  157. data/jax.gems +1 -0
  158. data/jax.gemspec +40 -0
  159. data/lib/jax.rb +28 -0
  160. data/lib/jax/application.rb +92 -0
  161. data/lib/jax/application/configuration.rb +27 -0
  162. data/lib/jax/generators/app.rb +17 -0
  163. data/lib/jax/generators/app/app_generator.rb +78 -0
  164. data/lib/jax/generators/app/templates/Gemfile.tt +3 -0
  165. data/lib/jax/generators/app/templates/Rakefile +6 -0
  166. data/lib/jax/generators/app/templates/app/controllers/application_controller.js.tt +5 -0
  167. data/lib/jax/generators/app/templates/app/helpers/application_helper.js.tt +3 -0
  168. data/lib/jax/generators/app/templates/app/models/.empty_directory +0 -0
  169. data/lib/jax/generators/app/templates/app/resources/.empty_directory +0 -0
  170. data/lib/jax/generators/app/templates/app/views/.empty_directory +0 -0
  171. data/lib/jax/generators/app/templates/config/application.rb.tt +6 -0
  172. data/lib/jax/generators/app/templates/config/boot.rb +13 -0
  173. data/lib/jax/generators/app/templates/config/routes.rb.tt +5 -0
  174. data/lib/jax/generators/app/templates/public/javascripts/jax.js +7561 -0
  175. data/lib/jax/generators/app/templates/public/webgl_not_supported.html +26 -0
  176. data/lib/jax/generators/app/templates/script/jax +7 -0
  177. data/lib/jax/generators/app/templates/spec/javascripts/controllers/application_controller_spec.js +11 -0
  178. data/lib/jax/generators/app/templates/spec/javascripts/helpers/application_helper_spec.js +12 -0
  179. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine.yml +90 -0
  180. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_config.rb +23 -0
  181. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_runner.rb +32 -0
  182. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_helpers/jax_spec_helper.js +216 -0
  183. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_layout.html.erb +63 -0
  184. data/lib/jax/generators/commands.rb +81 -0
  185. data/lib/jax/generators/controller/USAGE +9 -0
  186. data/lib/jax/generators/controller/controller_generator.rb +59 -0
  187. data/lib/jax/generators/controller/templates/controller_source.js.tt +16 -0
  188. data/lib/jax/generators/controller/templates/controller_test.js.tt +11 -0
  189. data/lib/jax/generators/controller/templates/helper.js.tt +3 -0
  190. data/lib/jax/generators/controller/templates/helper_test.js.tt +12 -0
  191. data/lib/jax/generators/controller/templates/view.js.tt +4 -0
  192. data/lib/jax/generators/light_source/USAGE +14 -0
  193. data/lib/jax/generators/light_source/light_source_generator.rb +47 -0
  194. data/lib/jax/generators/light_source/templates/light.yml.tt +39 -0
  195. data/lib/jax/generators/material/USAGE +29 -0
  196. data/lib/jax/generators/material/material_generator.rb +81 -0
  197. data/lib/jax/generators/material/templates/append.yml.tt +7 -0
  198. data/lib/jax/generators/material/templates/material.yml.tt +33 -0
  199. data/lib/jax/generators/model/USAGE +5 -0
  200. data/lib/jax/generators/model/model_generator.rb +42 -0
  201. data/lib/jax/generators/model/templates/model.js.tt +11 -0
  202. data/lib/jax/generators/model/templates/test.js.tt +11 -0
  203. data/lib/jax/generators/script_jax_loader.rb +32 -0
  204. data/lib/jax/monkeypatch/jasmine.rb +3 -0
  205. data/lib/jax/monkeypatch/jasmine/config.rb +21 -0
  206. data/lib/jax/monkeypatch/jasmine/server.rb +50 -0
  207. data/lib/jax/packager.rb +58 -0
  208. data/lib/jax/packager/sprockets_template.rb +49 -0
  209. data/lib/jax/resource_compiler.rb +50 -0
  210. data/lib/jax/routes.rb +61 -0
  211. data/lib/jax/shader.rb +158 -0
  212. data/lib/jax/tasks/rake.rb +34 -0
  213. data/lib/jax/version.rb +12 -0
  214. data/public/images/brickwall.jpg +0 -0
  215. data/public/images/jacks.jpg +0 -0
  216. data/public/images/normal_map.jpg +0 -0
  217. data/public/images/rock.png +0 -0
  218. data/public/images/rockNormal.png +0 -0
  219. data/public/images/rss.png +0 -0
  220. data/public/webgl_not_supported.html +26 -0
  221. data/spec/example_app/Gemfile +1 -0
  222. data/spec/example_app/Rakefile +15 -0
  223. data/spec/example_app/app/controllers/application_controller.js +5 -0
  224. data/spec/example_app/app/controllers/courthouse_controller.js +24 -0
  225. data/spec/example_app/app/controllers/lighting_controller.js +69 -0
  226. data/spec/example_app/app/controllers/shadows_controller.js +130 -0
  227. data/spec/example_app/app/controllers/textures_controller.js +52 -0
  228. data/spec/example_app/app/helpers/application_helper.js +3 -0
  229. data/spec/example_app/app/helpers/textures_helper.js +3 -0
  230. data/spec/example_app/app/models/character.js +23 -0
  231. data/spec/example_app/app/models/door.js +10 -0
  232. data/spec/example_app/app/models/scene.js +19 -0
  233. data/spec/example_app/app/resources/characters/judge.yml +3 -0
  234. data/spec/example_app/app/resources/doors/courthouse_door.yml +5 -0
  235. data/spec/example_app/app/resources/light_sources/directional_light.yml +13 -0
  236. data/spec/example_app/app/resources/light_sources/point_light.yml +31 -0
  237. data/spec/example_app/app/resources/light_sources/spot_light.yml +15 -0
  238. data/spec/example_app/app/resources/light_sources/sun.yml +7 -0
  239. data/spec/example_app/app/resources/light_sources/textures_point.yml +34 -0
  240. data/spec/example_app/app/resources/materials/bricks.yml +36 -0
  241. data/spec/example_app/app/resources/materials/lighting_with_shadows.yml +27 -0
  242. data/spec/example_app/app/resources/scenes/courthouse.yml +4 -0
  243. data/spec/example_app/app/views/courthouse/index.js +4 -0
  244. data/spec/example_app/app/views/lighting/index.js +4 -0
  245. data/spec/example_app/app/views/shadows/index.js +6 -0
  246. data/spec/example_app/app/views/textures/index.js +4 -0
  247. data/spec/example_app/config/application.rb +6 -0
  248. data/spec/example_app/config/boot.rb +13 -0
  249. data/spec/example_app/config/routes.rb +6 -0
  250. data/spec/example_app/public/images/185__normalmap.png +0 -0
  251. data/spec/example_app/public/images/face_norm.jpg +0 -0
  252. data/spec/example_app/public/images/rock.png +0 -0
  253. data/spec/example_app/public/images/rockNormal.png +0 -0
  254. data/spec/example_app/public/images/rss.png +0 -0
  255. data/spec/example_app/public/webgl_not_supported.html +26 -0
  256. data/spec/example_app/script/jax +7 -0
  257. data/spec/example_app/spec/javascripts/controllers/textures_controller_spec.js +11 -0
  258. data/spec/example_app/spec/javascripts/helpers/application_helper_spec.js +12 -0
  259. data/spec/example_app/spec/javascripts/resources/directional_light_spec.js +16 -0
  260. data/spec/example_app/spec/javascripts/resources/point_light_spec.js +17 -0
  261. data/spec/example_app/spec/javascripts/resources/spot_light_spec.js +18 -0
  262. data/spec/example_app/spec/javascripts/support/jasmine.yml +89 -0
  263. data/spec/example_app/spec/javascripts/support/jasmine_runner.rb +32 -0
  264. data/spec/example_app/spec/javascripts/support/spec_helpers/jax_spec_helper.js +93 -0
  265. data/spec/example_app/spec/javascripts/support/spec_layout.html.erb +84 -0
  266. data/spec/generators/app_generator_spec.rb +46 -0
  267. data/spec/generators/controller_generator_spec.rb +68 -0
  268. data/spec/generators/light_generator_spec.rb +51 -0
  269. data/spec/generators/material_generator_spec.rb +35 -0
  270. data/spec/generators/model_generator_spec.rb +43 -0
  271. data/spec/javascripts/Player.js +58 -0
  272. data/spec/javascripts/helpers/SpecHelper.js +216 -0
  273. data/spec/javascripts/jax/builtin/materials/core_materials_spec.js +41 -0
  274. data/spec/javascripts/jax/builtin/materials/dual_paraboloid_spec.js +37 -0
  275. data/spec/javascripts/jax/builtin/materials/fog_spec.js +19 -0
  276. data/spec/javascripts/jax/builtin/materials/lighting_spec.js +19 -0
  277. data/spec/javascripts/jax/builtin/materials/normal_map_spec.js +19 -0
  278. data/spec/javascripts/jax/builtin/materials/shadow_map_spec.js +19 -0
  279. data/spec/javascripts/jax/builtin/materials/texture_spec.js +19 -0
  280. data/spec/javascripts/jax/builtin/meshes/cube_spec.js +10 -0
  281. data/spec/javascripts/jax/builtin/meshes/plane_spec.js +8 -0
  282. data/spec/javascripts/jax/builtin/meshes/quad_spec.js +8 -0
  283. data/spec/javascripts/jax/builtin/meshes/sphere_spec.js +8 -0
  284. data/spec/javascripts/jax/builtin/meshes/teapot_spec.js +8 -0
  285. data/spec/javascripts/jax/builtin/meshes/torus_spec.js +8 -0
  286. data/spec/javascripts/jax/compatibility_spec.js +50 -0
  287. data/spec/javascripts/jax/context_spec.js +82 -0
  288. data/spec/javascripts/jax/controller_spec.js +145 -0
  289. data/spec/javascripts/jax/core/delegation_spec.js +48 -0
  290. data/spec/javascripts/jax/core/events_spec.js +17 -0
  291. data/spec/javascripts/jax/core/matrix_stack_spec.js +28 -0
  292. data/spec/javascripts/jax/core/utils_spec.js +256 -0
  293. data/spec/javascripts/jax/helper_spec.js +33 -0
  294. data/spec/javascripts/jax/model_spec.js +87 -0
  295. data/spec/javascripts/jax/optimizations/material_limitations_spec.js +87 -0
  296. data/spec/javascripts/jax/optimizations/shaders/basic_spec.js +68 -0
  297. data/spec/javascripts/jax/prototype/extensions_spec.js +34 -0
  298. data/spec/javascripts/jax/route_set_spec.js +67 -0
  299. data/spec/javascripts/jax/view_manager_spec.js +17 -0
  300. data/spec/javascripts/jax/webgl/camera_spec.js +159 -0
  301. data/spec/javascripts/jax/webgl/framebuffer_spec.js +46 -0
  302. data/spec/javascripts/jax/webgl/lighting_spec.js +61 -0
  303. data/spec/javascripts/jax/webgl/material_spec.js +118 -0
  304. data/spec/javascripts/jax/webgl/mesh_spec.js +86 -0
  305. data/spec/javascripts/jax/webgl/shader/manifest_spec.js +60 -0
  306. data/spec/javascripts/jax/webgl/shader_chain_spec.js +192 -0
  307. data/spec/javascripts/jax/webgl/shader_spec.js +276 -0
  308. data/spec/javascripts/jax/webgl/tangent_space_spec.js +142 -0
  309. data/spec/javascripts/jax/webgl/texture_spec.js +162 -0
  310. data/spec/javascripts/jax/webgl_spec.js +5 -0
  311. data/spec/javascripts/jax/world_spec.js +88 -0
  312. data/spec/javascripts/jax_spec.js +27 -0
  313. data/spec/javascripts/support/jasmine.yml +85 -0
  314. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  315. data/spec/lib/jax/routes_spec.rb +24 -0
  316. data/spec/lib/jax/shader_spec.rb +57 -0
  317. data/spec/lib/jax/tasks/jax_rake_spec.rb +79 -0
  318. data/spec/spec_helper.rb +11 -0
  319. data/spec/support/file_exist_matcher.rb +23 -0
  320. data/spec/support/spec_shell.rb +97 -0
  321. data/src/jax.js +84 -0
  322. data/src/jax/anim_frame.js +47 -0
  323. data/src/jax/builtin/all.js +7 -0
  324. data/src/jax/builtin/meshes/cube.js +62 -0
  325. data/src/jax/builtin/meshes/plane.js +36 -0
  326. data/src/jax/builtin/meshes/quad.js +80 -0
  327. data/src/jax/builtin/meshes/sphere.js +46 -0
  328. data/src/jax/builtin/meshes/teapot.js +38 -0
  329. data/src/jax/builtin/meshes/torus.js +46 -0
  330. data/src/jax/compatibility.js +140 -0
  331. data/src/jax/context.js +253 -0
  332. data/src/jax/controller.js +157 -0
  333. data/src/jax/core.js +39 -0
  334. data/src/jax/core/math.js +40 -0
  335. data/src/jax/core/matrix_stack.js +306 -0
  336. data/src/jax/core/util.js +226 -0
  337. data/src/jax/events.js +179 -0
  338. data/src/jax/geometry.js +3 -0
  339. data/src/jax/geometry/plane.js +59 -0
  340. data/src/jax/helper.js +8 -0
  341. data/src/jax/model.js +163 -0
  342. data/src/jax/prototype/class.js +78 -0
  343. data/src/jax/prototype/core.js +112 -0
  344. data/src/jax/prototype/extensions.js +124 -0
  345. data/src/jax/route_set.js +125 -0
  346. data/src/jax/vendor/ejs.js +4 -0
  347. data/src/jax/vendor/glMatrix.js +3 -0
  348. data/src/jax/view.js +37 -0
  349. data/src/jax/view_manager.js +46 -0
  350. data/src/jax/webgl.js +98 -0
  351. data/src/jax/webgl/camera.js +526 -0
  352. data/src/jax/webgl/core.js +6 -0
  353. data/src/jax/webgl/core/buffer.js +161 -0
  354. data/src/jax/webgl/core/edge.js +6 -0
  355. data/src/jax/webgl/core/events.js +25 -0
  356. data/src/jax/webgl/core/face.js +8 -0
  357. data/src/jax/webgl/core/framebuffer.js +206 -0
  358. data/src/jax/webgl/material.js +375 -0
  359. data/src/jax/webgl/mesh.js +412 -0
  360. data/src/jax/webgl/scene.js +11 -0
  361. data/src/jax/webgl/scene/frustum.js +260 -0
  362. data/src/jax/webgl/scene/light_manager.js +112 -0
  363. data/src/jax/webgl/scene/light_source.js +248 -0
  364. data/src/jax/webgl/shader.js +282 -0
  365. data/src/jax/webgl/shader/delegator.js +13 -0
  366. data/src/jax/webgl/shader/delegator/attribute.js +53 -0
  367. data/src/jax/webgl/shader/delegator/uniform.js +71 -0
  368. data/src/jax/webgl/shader/manifest.js +64 -0
  369. data/src/jax/webgl/shader/program.js +140 -0
  370. data/src/jax/webgl/shader_chain.js +256 -0
  371. data/src/jax/webgl/texture.js +312 -0
  372. data/src/jax/webgl/world.js +119 -0
  373. data/vendor/ejs/.svn/all-wcprops +17 -0
  374. data/vendor/ejs/.svn/entries +114 -0
  375. data/vendor/ejs/.svn/text-base/Eratta.txt.svn-base +3 -0
  376. data/vendor/ejs/.svn/text-base/license.txt.svn-base +21 -0
  377. data/vendor/ejs/Eratta.txt +3 -0
  378. data/vendor/ejs/example/.svn/all-wcprops +29 -0
  379. data/vendor/ejs/example/.svn/entries +164 -0
  380. data/vendor/ejs/example/.svn/prop-base/ejs.gif.svn-base +5 -0
  381. data/vendor/ejs/example/.svn/text-base/demo.html.svn-base +54 -0
  382. data/vendor/ejs/example/.svn/text-base/ejs.gif.svn-base +0 -0
  383. data/vendor/ejs/example/.svn/text-base/example.css.svn-base +31 -0
  384. data/vendor/ejs/example/.svn/text-base/example.js.svn-base +88 -0
  385. data/vendor/ejs/example/demo.html +54 -0
  386. data/vendor/ejs/example/ejs.gif +0 -0
  387. data/vendor/ejs/example/example.css +31 -0
  388. data/vendor/ejs/example/example.js +88 -0
  389. data/vendor/ejs/lib/.svn/all-wcprops +11 -0
  390. data/vendor/ejs/lib/.svn/entries +62 -0
  391. data/vendor/ejs/lib/.svn/text-base/ejs_fulljslint.js.svn-base +3774 -0
  392. data/vendor/ejs/lib/ejs_fulljslint.js +3774 -0
  393. data/vendor/ejs/license.txt +21 -0
  394. data/vendor/ejs/script/.svn/all-wcprops +17 -0
  395. data/vendor/ejs/script/.svn/entries +96 -0
  396. data/vendor/ejs/script/.svn/prop-base/yuicompressor-2.2.4.jar.svn-base +5 -0
  397. data/vendor/ejs/script/.svn/text-base/production.bat.svn-base +4 -0
  398. data/vendor/ejs/script/.svn/text-base/yuicompressor-2.2.4.jar.svn-base +0 -0
  399. data/vendor/ejs/script/production.bat +4 -0
  400. data/vendor/ejs/script/yuicompressor-2.2.4.jar +0 -0
  401. data/vendor/ejs/src/.svn/all-wcprops +17 -0
  402. data/vendor/ejs/src/.svn/entries +96 -0
  403. data/vendor/ejs/src/.svn/text-base/ejs.js.svn-base +505 -0
  404. data/vendor/ejs/src/.svn/text-base/view.js.svn-base +200 -0
  405. data/vendor/ejs/src/ejs.js +505 -0
  406. data/vendor/ejs/src/view.js +200 -0
  407. data/vendor/ejs/test/.svn/all-wcprops +23 -0
  408. data/vendor/ejs/test/.svn/entries +139 -0
  409. data/vendor/ejs/test/.svn/text-base/index.html.svn-base +18 -0
  410. data/vendor/ejs/test/.svn/text-base/setup_test.html.svn-base +44 -0
  411. data/vendor/ejs/test/.svn/text-base/sidebar.html.svn-base +28 -0
  412. data/vendor/ejs/test/included/.svn/all-wcprops +23 -0
  413. data/vendor/ejs/test/included/.svn/entries +130 -0
  414. data/vendor/ejs/test/included/.svn/text-base/prototype.js.svn-base +4184 -0
  415. data/vendor/ejs/test/included/.svn/text-base/test.css.svn-base +44 -0
  416. data/vendor/ejs/test/included/.svn/text-base/unittest.js.svn-base +564 -0
  417. data/vendor/ejs/test/included/prototype.js +4184 -0
  418. data/vendor/ejs/test/included/test.css +44 -0
  419. data/vendor/ejs/test/included/unittest.js +564 -0
  420. data/vendor/ejs/test/index.html +18 -0
  421. data/vendor/ejs/test/setup_test.html +44 -0
  422. data/vendor/ejs/test/sidebar.html +28 -0
  423. data/vendor/ejs/test/templates/.svn/all-wcprops +11 -0
  424. data/vendor/ejs/test/templates/.svn/entries +62 -0
  425. data/vendor/ejs/test/templates/.svn/text-base/test.ejs.svn-base +3 -0
  426. data/vendor/ejs/test/templates/test.ejs +3 -0
  427. data/vendor/ejs/test/tests/.svn/all-wcprops +23 -0
  428. data/vendor/ejs/test/tests/.svn/entries +130 -0
  429. data/vendor/ejs/test/tests/.svn/text-base/rendering.js.svn-base +94 -0
  430. data/vendor/ejs/test/tests/.svn/text-base/templating.js.svn-base +43 -0
  431. data/vendor/ejs/test/tests/.svn/text-base/views.js.svn-base +100 -0
  432. data/vendor/ejs/test/tests/rendering.js +94 -0
  433. data/vendor/ejs/test/tests/templating.js +43 -0
  434. data/vendor/ejs/test/tests/views.js +100 -0
  435. data/vendor/glmatrix/benchmark/js/CanvasMatrix.js +722 -0
  436. data/vendor/glmatrix/benchmark/js/EWGL_math.js +742 -0
  437. data/vendor/glmatrix/benchmark/js/mjs.js +1230 -0
  438. data/vendor/glmatrix/benchmark/matrix_benchmark.html +419 -0
  439. data/vendor/glmatrix/glMatrix-min.js +32 -0
  440. data/vendor/glmatrix/glMatrix.js +1815 -0
  441. data/vendor/glmatrix/unit tests/glMatrix-test.js +74 -0
  442. data/vendor/glmatrix/unit tests/qunit.css +119 -0
  443. data/vendor/glmatrix/unit tests/qunit.js +1069 -0
  444. data/vendor/glmatrix/unit tests/test_glMatrix.html +21 -0
  445. data/vendor/yuicompressor-2.4.2.jar +0 -0
  446. metadata +748 -0
@@ -0,0 +1,113 @@
1
+ /**
2
+ * SyntaxHighlighter
3
+ * http://alexgorbatchev.com/SyntaxHighlighter
4
+ *
5
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
6
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
7
+ *
8
+ * @version
9
+ * 3.0.83 (July 02 2010)
10
+ *
11
+ * @copyright
12
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
13
+ *
14
+ * @license
15
+ * Dual licensed under the MIT and GPL licenses.
16
+ */
17
+ .syntaxhighlighter {
18
+ background-color: #222222 !important;
19
+ }
20
+ .syntaxhighlighter .line.alt1 {
21
+ background-color: #222222 !important;
22
+ }
23
+ .syntaxhighlighter .line.alt2 {
24
+ background-color: #222222 !important;
25
+ }
26
+ .syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
27
+ background-color: #253e5a !important;
28
+ }
29
+ .syntaxhighlighter .line.highlighted.number {
30
+ color: white !important;
31
+ }
32
+ .syntaxhighlighter table caption {
33
+ color: lime !important;
34
+ }
35
+ .syntaxhighlighter .gutter {
36
+ color: #38566f !important;
37
+ }
38
+ .syntaxhighlighter .gutter .line {
39
+ border-right: 3px solid #435a5f !important;
40
+ }
41
+ .syntaxhighlighter .gutter .line.highlighted {
42
+ background-color: #435a5f !important;
43
+ color: #222222 !important;
44
+ }
45
+ .syntaxhighlighter.printing .line .content {
46
+ border: none !important;
47
+ }
48
+ .syntaxhighlighter.collapsed {
49
+ overflow: visible !important;
50
+ }
51
+ .syntaxhighlighter.collapsed .toolbar {
52
+ color: #428bdd !important;
53
+ background: black !important;
54
+ border: 1px solid #435a5f !important;
55
+ }
56
+ .syntaxhighlighter.collapsed .toolbar a {
57
+ color: #428bdd !important;
58
+ }
59
+ .syntaxhighlighter.collapsed .toolbar a:hover {
60
+ color: lime !important;
61
+ }
62
+ .syntaxhighlighter .toolbar {
63
+ color: #aaaaff !important;
64
+ background: #435a5f !important;
65
+ border: none !important;
66
+ }
67
+ .syntaxhighlighter .toolbar a {
68
+ color: #aaaaff !important;
69
+ }
70
+ .syntaxhighlighter .toolbar a:hover {
71
+ color: #9ccff4 !important;
72
+ }
73
+ .syntaxhighlighter .plain, .syntaxhighlighter .plain a {
74
+ color: lime !important;
75
+ }
76
+ .syntaxhighlighter .comments, .syntaxhighlighter .comments a {
77
+ color: #428bdd !important;
78
+ }
79
+ .syntaxhighlighter .string, .syntaxhighlighter .string a {
80
+ color: lime !important;
81
+ }
82
+ .syntaxhighlighter .keyword {
83
+ color: #aaaaff !important;
84
+ }
85
+ .syntaxhighlighter .preprocessor {
86
+ color: #8aa6c1 !important;
87
+ }
88
+ .syntaxhighlighter .variable {
89
+ color: aqua !important;
90
+ }
91
+ .syntaxhighlighter .value {
92
+ color: #f7e741 !important;
93
+ }
94
+ .syntaxhighlighter .functions {
95
+ color: #ff8000 !important;
96
+ }
97
+ .syntaxhighlighter .constants {
98
+ color: yellow !important;
99
+ }
100
+ .syntaxhighlighter .script {
101
+ font-weight: bold !important;
102
+ color: #aaaaff !important;
103
+ background-color: none !important;
104
+ }
105
+ .syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
106
+ color: red !important;
107
+ }
108
+ .syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
109
+ color: yellow !important;
110
+ }
111
+ .syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
112
+ color: #ffaa3e !important;
113
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * SyntaxHighlighter
3
+ * http://alexgorbatchev.com/SyntaxHighlighter
4
+ *
5
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
6
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
7
+ *
8
+ * @version
9
+ * 3.0.83 (July 02 2010)
10
+ *
11
+ * @copyright
12
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
13
+ *
14
+ * @license
15
+ * Dual licensed under the MIT and GPL licenses.
16
+ */
17
+ .syntaxhighlighter {
18
+ background-color: #0f192a !important;
19
+ }
20
+ .syntaxhighlighter .line.alt1 {
21
+ background-color: #0f192a !important;
22
+ }
23
+ .syntaxhighlighter .line.alt2 {
24
+ background-color: #0f192a !important;
25
+ }
26
+ .syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
27
+ background-color: #253e5a !important;
28
+ }
29
+ .syntaxhighlighter .line.highlighted.number {
30
+ color: #38566f !important;
31
+ }
32
+ .syntaxhighlighter table caption {
33
+ color: #d1edff !important;
34
+ }
35
+ .syntaxhighlighter .gutter {
36
+ color: #afafaf !important;
37
+ }
38
+ .syntaxhighlighter .gutter .line {
39
+ border-right: 3px solid #435a5f !important;
40
+ }
41
+ .syntaxhighlighter .gutter .line.highlighted {
42
+ background-color: #435a5f !important;
43
+ color: #0f192a !important;
44
+ }
45
+ .syntaxhighlighter.printing .line .content {
46
+ border: none !important;
47
+ }
48
+ .syntaxhighlighter.collapsed {
49
+ overflow: visible !important;
50
+ }
51
+ .syntaxhighlighter.collapsed .toolbar {
52
+ color: #428bdd !important;
53
+ background: black !important;
54
+ border: 1px solid #435a5f !important;
55
+ }
56
+ .syntaxhighlighter.collapsed .toolbar a {
57
+ color: #428bdd !important;
58
+ }
59
+ .syntaxhighlighter.collapsed .toolbar a:hover {
60
+ color: #1dc116 !important;
61
+ }
62
+ .syntaxhighlighter .toolbar {
63
+ color: #d1edff !important;
64
+ background: #435a5f !important;
65
+ border: none !important;
66
+ }
67
+ .syntaxhighlighter .toolbar a {
68
+ color: #d1edff !important;
69
+ }
70
+ .syntaxhighlighter .toolbar a:hover {
71
+ color: #8aa6c1 !important;
72
+ }
73
+ .syntaxhighlighter .plain, .syntaxhighlighter .plain a {
74
+ color: #d1edff !important;
75
+ }
76
+ .syntaxhighlighter .comments, .syntaxhighlighter .comments a {
77
+ color: #428bdd !important;
78
+ }
79
+ .syntaxhighlighter .string, .syntaxhighlighter .string a {
80
+ color: #1dc116 !important;
81
+ }
82
+ .syntaxhighlighter .keyword {
83
+ color: #b43d3d !important;
84
+ }
85
+ .syntaxhighlighter .preprocessor {
86
+ color: #8aa6c1 !important;
87
+ }
88
+ .syntaxhighlighter .variable {
89
+ color: #ffaa3e !important;
90
+ }
91
+ .syntaxhighlighter .value {
92
+ color: #f7e741 !important;
93
+ }
94
+ .syntaxhighlighter .functions {
95
+ color: #ffaa3e !important;
96
+ }
97
+ .syntaxhighlighter .constants {
98
+ color: #e0e8ff !important;
99
+ }
100
+ .syntaxhighlighter .script {
101
+ font-weight: bold !important;
102
+ color: #b43d3d !important;
103
+ background-color: none !important;
104
+ }
105
+ .syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
106
+ color: #f8bb00 !important;
107
+ }
108
+ .syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
109
+ color: white !important;
110
+ }
111
+ .syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
112
+ color: #ffaa3e !important;
113
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * SyntaxHighlighter
3
+ * http://alexgorbatchev.com/SyntaxHighlighter
4
+ *
5
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
6
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
7
+ *
8
+ * @version
9
+ * 3.0.83 (July 02 2010)
10
+ *
11
+ * @copyright
12
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
13
+ *
14
+ * @license
15
+ * Dual licensed under the MIT and GPL licenses.
16
+ */
17
+ .syntaxhighlighter {
18
+ background-color: #1b2426 !important;
19
+ }
20
+ .syntaxhighlighter .line.alt1 {
21
+ background-color: #1b2426 !important;
22
+ }
23
+ .syntaxhighlighter .line.alt2 {
24
+ background-color: #1b2426 !important;
25
+ }
26
+ .syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
27
+ background-color: #323e41 !important;
28
+ }
29
+ .syntaxhighlighter .line.highlighted.number {
30
+ color: #b9bdb6 !important;
31
+ }
32
+ .syntaxhighlighter table caption {
33
+ color: #b9bdb6 !important;
34
+ }
35
+ .syntaxhighlighter .gutter {
36
+ color: #afafaf !important;
37
+ }
38
+ .syntaxhighlighter .gutter .line {
39
+ border-right: 3px solid #435a5f !important;
40
+ }
41
+ .syntaxhighlighter .gutter .line.highlighted {
42
+ background-color: #435a5f !important;
43
+ color: #1b2426 !important;
44
+ }
45
+ .syntaxhighlighter.printing .line .content {
46
+ border: none !important;
47
+ }
48
+ .syntaxhighlighter.collapsed {
49
+ overflow: visible !important;
50
+ }
51
+ .syntaxhighlighter.collapsed .toolbar {
52
+ color: #5ba1cf !important;
53
+ background: black !important;
54
+ border: 1px solid #435a5f !important;
55
+ }
56
+ .syntaxhighlighter.collapsed .toolbar a {
57
+ color: #5ba1cf !important;
58
+ }
59
+ .syntaxhighlighter.collapsed .toolbar a:hover {
60
+ color: #5ce638 !important;
61
+ }
62
+ .syntaxhighlighter .toolbar {
63
+ color: white !important;
64
+ background: #435a5f !important;
65
+ border: none !important;
66
+ }
67
+ .syntaxhighlighter .toolbar a {
68
+ color: white !important;
69
+ }
70
+ .syntaxhighlighter .toolbar a:hover {
71
+ color: #e0e8ff !important;
72
+ }
73
+ .syntaxhighlighter .plain, .syntaxhighlighter .plain a {
74
+ color: #b9bdb6 !important;
75
+ }
76
+ .syntaxhighlighter .comments, .syntaxhighlighter .comments a {
77
+ color: #878a85 !important;
78
+ }
79
+ .syntaxhighlighter .string, .syntaxhighlighter .string a {
80
+ color: #5ce638 !important;
81
+ }
82
+ .syntaxhighlighter .keyword {
83
+ color: #5ba1cf !important;
84
+ }
85
+ .syntaxhighlighter .preprocessor {
86
+ color: #435a5f !important;
87
+ }
88
+ .syntaxhighlighter .variable {
89
+ color: #ffaa3e !important;
90
+ }
91
+ .syntaxhighlighter .value {
92
+ color: #009900 !important;
93
+ }
94
+ .syntaxhighlighter .functions {
95
+ color: #ffaa3e !important;
96
+ }
97
+ .syntaxhighlighter .constants {
98
+ color: #e0e8ff !important;
99
+ }
100
+ .syntaxhighlighter .script {
101
+ font-weight: bold !important;
102
+ color: #5ba1cf !important;
103
+ background-color: none !important;
104
+ }
105
+ .syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
106
+ color: #e0e8ff !important;
107
+ }
108
+ .syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
109
+ color: white !important;
110
+ }
111
+ .syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
112
+ color: #ffaa3e !important;
113
+ }
@@ -0,0 +1,41 @@
1
+ pwd = File.dirname(__FILE__)
2
+ $:.unshift pwd
3
+
4
+ # This is a predicate useful for the doc:guides task of applications.
5
+ def bundler?
6
+ # Note that rake sets the cwd to the one that contains the Rakefile
7
+ # being executed.
8
+ File.exists?('Gemfile')
9
+ end
10
+
11
+ # Loading Action Pack requires rack and erubis.
12
+ require 'rubygems'
13
+
14
+ # Guides generation from gems.
15
+ gem "actionpack", '>= 3.0'
16
+
17
+ begin
18
+ require 'redcloth'
19
+ rescue LoadError
20
+ # This can happen if doc:guides is executed in an application.
21
+ $stderr.puts('Generating guides requires RedCloth 4.1.1+.')
22
+ $stderr.puts(<<ERROR) if bundler?
23
+ Please add
24
+
25
+ gem 'RedCloth', '~> 4.2'
26
+
27
+ to the Gemfile, run
28
+
29
+ bundle install
30
+
31
+ and try again.
32
+ ERROR
33
+
34
+ exit 1
35
+ end
36
+
37
+ require "jax_guides/textile_extensions"
38
+ RedCloth.send(:include, JaxGuides::TextileExtensions)
39
+
40
+ require "jax_guides/generator"
41
+ JaxGuides::Generator.new.generate
@@ -0,0 +1,7 @@
1
+ module JaxGuides
2
+ CODE_ALIASES = %w(yaml shell ruby erb html sql plain js)
3
+
4
+ def self.code_aliases
5
+ CODE_ALIASES.join("|")
6
+ end
7
+ end
@@ -0,0 +1,287 @@
1
+ # ---------------------------------------------------------------------------
2
+ #
3
+ # This script generates the guides. It can be invoked either directly or via the
4
+ # generate_guides rake task within the jax directory.
5
+ #
6
+ # Guides are taken from the source directory, and the resulting HTML goes into the
7
+ # output directory. Assets are stored under files, and copied to output/files as
8
+ # part of the generation process.
9
+ #
10
+ # Some arguments may be passed via environment variables:
11
+ #
12
+ # WARNINGS
13
+ # If you are writing a guide, please work always with WARNINGS=1. Users can
14
+ # generate the guides, and thus this flag is off by default.
15
+ #
16
+ # Internal links (anchors) are checked. If a reference is broken levenshtein
17
+ # distance is used to suggest an existing one. This is useful since IDs are
18
+ # generated by Textile from headers and thus edits alter them.
19
+ #
20
+ # Also detects duplicated IDs. They happen if there are headers with the same
21
+ # text. Please do resolve them, if any, so guides are valid XHTML.
22
+ #
23
+ # ALL
24
+ # Set to "1" to force the generation of all guides.
25
+ #
26
+ # ONLY
27
+ # Use ONLY if you want to generate only one or a set of guides. Prefixes are
28
+ # enough:
29
+ #
30
+ # # generates only association_basics.html
31
+ # ONLY=assoc ruby rails_guides.rb
32
+ #
33
+ # Separate many using commas:
34
+ #
35
+ # # generates only association_basics.html and migrations.html
36
+ # ONLY=assoc,migrations ruby rails_guides.rb
37
+ #
38
+ # Note that if you are working on a guide generation will by default process
39
+ # only that one, so ONLY is rarely used nowadays.
40
+ #
41
+ # GUIDES_LANGUAGE
42
+ # Use GUIDES_LANGUAGE when you want to generate translated guides in
43
+ # <tt>source/<GUIDES_LANGUAGE></tt> folder (such as <tt>source/es</tt>).
44
+ # Ignore it when generating English guides.
45
+ #
46
+ # EDGE
47
+ # Set to "1" to indicate generated guides should be marked as edge. This
48
+ # inserts a badge and changes the preamble of the home page.
49
+ #
50
+ # ---------------------------------------------------------------------------
51
+
52
+ require 'set'
53
+ require 'fileutils'
54
+
55
+ require 'active_support/core_ext/string/output_safety'
56
+ require 'active_support/core_ext/object/blank'
57
+ require 'action_controller'
58
+ require 'action_view'
59
+
60
+ require 'jax_guides/indexer'
61
+ require 'jax_guides/helpers'
62
+ require 'jax_guides/levenshtein'
63
+ require File.join(File.dirname(__FILE__), 'common')
64
+
65
+
66
+ module JaxGuides
67
+ class Generator
68
+ attr_reader :guides_dir, :source_dir, :output_dir, :edge, :warnings, :all
69
+
70
+ GUIDES_RE = /\.(?:textile|html\.erb)$/
71
+
72
+ def initialize(output=nil)
73
+ @lang = ENV['GUIDES_LANGUAGE']
74
+ initialize_dirs(output)
75
+ create_output_dir_if_needed
76
+ set_flags_from_environment
77
+ end
78
+
79
+ def generate
80
+ generate_guides
81
+ copy_assets
82
+ end
83
+
84
+ private
85
+ def initialize_dirs(output)
86
+ @guides_dir = File.join(File.dirname(__FILE__), '..')
87
+ @source_dir = File.join(@guides_dir, "source", @lang.to_s)
88
+ @output_dir = output || File.join(@guides_dir, "output", @lang.to_s)
89
+ end
90
+
91
+ def create_output_dir_if_needed
92
+ FileUtils.mkdir_p(output_dir)
93
+ end
94
+
95
+ def set_flags_from_environment
96
+ @edge = ENV['EDGE'] == '1'
97
+ @warnings = ENV['WARNINGS'] == '1'
98
+ @all = ENV['ALL'] == '1'
99
+ end
100
+
101
+ def generate_guides
102
+ guides_to_generate.each do |guide|
103
+ output_file = output_file_for(guide)
104
+ generate_guide(guide, output_file) if generate?(guide, output_file)
105
+ end
106
+ end
107
+
108
+ def guides_to_generate
109
+ guides = Dir.entries(source_dir).grep(GUIDES_RE)
110
+ ENV.key?('ONLY') ? select_only(guides) : guides
111
+ end
112
+
113
+ def select_only(guides)
114
+ prefixes = ENV['ONLY'].split(",").map(&:strip)
115
+ guides.select do |guide|
116
+ prefixes.any? {|p| guide.start_with?(p)}
117
+ end
118
+ end
119
+
120
+ def copy_assets
121
+ FileUtils.cp_r(Dir.glob("#{guides_dir}/assets/*"), output_dir)
122
+ end
123
+
124
+ def output_file_for(guide)
125
+ guide.sub(GUIDES_RE, '.html')
126
+ end
127
+
128
+ def generate?(source_file, output_file)
129
+ fin = File.join(source_dir, source_file)
130
+ fout = File.join(output_dir, output_file)
131
+ all || !File.exists?(fout) || File.mtime(fout) < File.mtime(fin)
132
+ end
133
+
134
+ def generate_guide(guide, output_file)
135
+ puts "Generating #{output_file}"
136
+ File.open(File.join(output_dir, output_file), 'w') do |f|
137
+ view = ActionView::Base.new(source_dir, :edge => edge)
138
+ view.extend(Helpers)
139
+
140
+ if guide =~ /\.html\.erb$/
141
+ # Generate the special pages like the home.
142
+ result = view.render(:layout => 'layout', :file => guide)
143
+ else
144
+ body = File.read(File.join(source_dir, guide))
145
+ body = set_header_section(body, view)
146
+ body = set_index(body, view)
147
+
148
+ result = view.render(:layout => 'layout', :text => textile(body))
149
+
150
+ warn_about_broken_links(result) if @warnings
151
+ end
152
+
153
+ f.write result
154
+ end
155
+ end
156
+
157
+ def set_header_section(body, view)
158
+ new_body = body.gsub(/(.*?)endprologue\./m, '').strip
159
+ header = $1
160
+
161
+ header =~ /h2\.(.*)/
162
+ page_title = "Jax WebGL Framework Guides: #{$1.strip}"
163
+
164
+ header = textile(header)
165
+
166
+ view.content_for(:page_title) { page_title.html_safe }
167
+ view.content_for(:header_section) { header.html_safe }
168
+ new_body
169
+ end
170
+
171
+ def set_index(body, view)
172
+ index = <<-INDEX
173
+ <div id="subCol">
174
+ <h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
175
+ <ol class="chapters">
176
+ INDEX
177
+
178
+ i = Indexer.new(body, warnings)
179
+ i.index
180
+
181
+ # Set index for 2 levels
182
+ i.level_hash.each do |key, value|
183
+ link = view.content_tag(:a, :href => key[:id]) { textile(key[:title], true).html_safe }
184
+
185
+ children = value.keys.map do |k|
186
+ view.content_tag(:li,
187
+ view.content_tag(:a, :href => k[:id]) { textile(k[:title], true).html_safe })
188
+ end
189
+
190
+ children_ul = children.empty? ? "" : view.content_tag(:ul, children.join(" ").html_safe)
191
+
192
+ index << view.content_tag(:li, link.html_safe + children_ul.html_safe)
193
+ end
194
+
195
+ index << '</ol>'
196
+ index << '</div>'
197
+
198
+ view.content_for(:index_section) { index.html_safe }
199
+
200
+ i.result
201
+ end
202
+
203
+ def textile(body, lite_mode=false)
204
+ # If the issue with notextile is fixed just remove the wrapper.
205
+ with_workaround_for_notextile(body) do |body|
206
+ t = RedCloth.new(body)
207
+ t.hard_breaks = false
208
+ t.lite_mode = lite_mode
209
+ t.to_html(:notestuff, :plusplus, :code, :tip)
210
+ end
211
+ end
212
+
213
+ # For some reason the notextile tag does not always turn off textile. See
214
+ # LH ticket of the security guide (#7). As a temporary workaround we deal
215
+ # with code blocks by hand.
216
+ def with_workaround_for_notextile(body)
217
+ code_blocks = []
218
+
219
+ body.gsub!(%r{<(#{JaxGuides.code_aliases})>(.*?)</\1>}m) do |m|
220
+ brush = case $1
221
+ # when 'ruby', 'sql', 'plain'
222
+ # $1
223
+ when 'erb'
224
+ 'ruby; html-script: true'
225
+ when 'html'
226
+ 'xml' # html is understood, but there are .xml rules in the CSS
227
+ when 'yaml', 'shell'
228
+ 'plain'
229
+ else
230
+ $1
231
+ #'plain'
232
+ end
233
+
234
+ code_blocks.push(<<HTML)
235
+ <notextile>
236
+ <div class="code_container">
237
+ <pre class="brush: #{brush}; gutter: false; toolbar: false">
238
+ #{ERB::Util.h($2).strip}
239
+ </pre>
240
+ </div>
241
+ </notextile>
242
+ HTML
243
+ "\ndirty_workaround_for_notextile_#{code_blocks.size - 1}\n"
244
+ end
245
+
246
+ body = yield body
247
+
248
+ body.gsub(%r{<p>dirty_workaround_for_notextile_(\d+)</p>}) do |_|
249
+ code_blocks[$1.to_i]
250
+ end
251
+ end
252
+
253
+ def warn_about_broken_links(html)
254
+ anchors = extract_anchors(html)
255
+ check_fragment_identifiers(html, anchors)
256
+ end
257
+
258
+ def extract_anchors(html)
259
+ # Textile generates headers with IDs computed from titles.
260
+ anchors = Set.new
261
+ html.scan(/<h\d\s+id="([^"]+)/).flatten.each do |anchor|
262
+ if anchors.member?(anchor)
263
+ puts "*** DUPLICATE ID: #{anchor}, please put and explicit ID, e.g. h4(#explicit-id), or consider rewording"
264
+ else
265
+ anchors << anchor
266
+ end
267
+ end
268
+
269
+ # Footnotes.
270
+ anchors += Set.new(html.scan(/<p\s+class="footnote"\s+id="([^"]+)/).flatten)
271
+ anchors += Set.new(html.scan(/<sup\s+class="footnote"\s+id="([^"]+)/).flatten)
272
+ return anchors
273
+ end
274
+
275
+ def check_fragment_identifiers(html, anchors)
276
+ html.scan(/<a\s+href="#([^"]+)/).flatten.each do |fragment_identifier|
277
+ next if fragment_identifier == 'mainCol' # in layout, jumps to some DIV
278
+ unless anchors.member?(fragment_identifier)
279
+ guess = anchors.min { |a, b|
280
+ Levenshtein.distance(fragment_identifier, a) <=> Levenshtein.distance(fragment_identifier, b)
281
+ }
282
+ puts "*** BROKEN LINK: ##{fragment_identifier}, perhaps you meant ##{guess}."
283
+ end
284
+ end
285
+ end
286
+ end
287
+ end