ruby-processing 1.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.
- data/CHANGELOG +137 -0
- data/LICENSE +37 -0
- data/README +61 -0
- data/bin/rp5 +4 -0
- data/lib/core/core.jar +0 -0
- data/lib/core/jruby-complete.jar +0 -0
- data/lib/ruby-processing.rb +27 -0
- data/lib/ruby-processing/app.rb +358 -0
- data/lib/ruby-processing/exporters/applet_exporter.rb +75 -0
- data/lib/ruby-processing/exporters/application_exporter.rb +87 -0
- data/lib/ruby-processing/exporters/base_exporter.rb +133 -0
- data/lib/ruby-processing/exporters/creator.rb +46 -0
- data/lib/ruby-processing/helpers/string.rb +27 -0
- data/lib/ruby-processing/runner.rb +143 -0
- data/lib/ruby-processing/runners/base.rb +5 -0
- data/lib/ruby-processing/runners/live.rb +11 -0
- data/lib/ruby-processing/runners/run.rb +5 -0
- data/lib/ruby-processing/runners/watch.rb +42 -0
- data/lib/templates/applet/images/built_with.jpg +0 -0
- data/lib/templates/applet/images/ruby.jpg +0 -0
- data/lib/templates/applet/images/top.png +0 -0
- data/lib/templates/applet/index.html.erb +111 -0
- data/lib/templates/applet/library/library.txt +1 -0
- data/lib/templates/application/Contents/Info.plist.erb +58 -0
- data/lib/templates/application/Contents/MacOS/JavaApplicationStub +0 -0
- data/lib/templates/application/Contents/PkgInfo +1 -0
- data/lib/templates/application/Contents/Resources/sketch.icns +0 -0
- data/lib/templates/application/lib/MANIFEST.MF +3 -0
- data/lib/templates/application/lib/args.txt.erb +3 -0
- data/lib/templates/application/lib/library/library.txt +1 -0
- data/lib/templates/application/run.erb +4 -0
- data/lib/templates/application/run.exe +0 -0
- data/lib/templates/create/blank_sketch.rb.erb +15 -0
- data/library/boids/boids.rb +222 -0
- data/library/control_panel/control_panel.rb +149 -0
- data/library/dxf/bin/processing/dxf/RawDXF.class +0 -0
- data/library/dxf/dxfviewer.jar +0 -0
- data/library/dxf/library/dxf.jar +0 -0
- data/library/javascript/library/export.txt +6 -0
- data/library/javascript/library/javascript.jar +0 -0
- data/library/minim/library/jl1.0.jar +0 -0
- data/library/minim/library/jsminim.jar +0 -0
- data/library/minim/library/minim-spi.jar +0 -0
- data/library/minim/library/minim.jar +0 -0
- data/library/minim/library/mp3spi1.9.4.jar +0 -0
- data/library/minim/library/tritonus_aos.jar +0 -0
- data/library/minim/library/tritonus_share.jar +0 -0
- data/library/minim/license.txt +339 -0
- data/library/minim/version.txt +1 -0
- data/library/net/bin/processing/net/Client.class +0 -0
- data/library/net/bin/processing/net/Server.class +0 -0
- data/library/net/library/net.jar +0 -0
- data/library/opengl/bin/processing/opengl/PGraphicsOpenGL$ImageCache.class +0 -0
- data/library/opengl/bin/processing/opengl/PGraphicsOpenGL$TessCallback.class +0 -0
- data/library/opengl/bin/processing/opengl/PGraphicsOpenGL.class +0 -0
- data/library/opengl/library/export.txt +13 -0
- data/library/opengl/library/gluegen-rt-natives-linux-amd64.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-linux-i586.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-macosx-ppc.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-macosx-universal.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-windows-amd64.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-windows-i586.jar +0 -0
- data/library/opengl/library/gluegen-rt.dll +0 -0
- data/library/opengl/library/gluegen-rt.jar +0 -0
- data/library/opengl/library/gluegen-rt.jar.pack.gz +0 -0
- data/library/opengl/library/jogl-natives-linux-amd64.jar +0 -0
- data/library/opengl/library/jogl-natives-linux-i586.jar +0 -0
- data/library/opengl/library/jogl-natives-macosx-ppc.jar +0 -0
- data/library/opengl/library/jogl-natives-macosx-universal.jar +0 -0
- data/library/opengl/library/jogl-natives-windows-amd64.jar +0 -0
- data/library/opengl/library/jogl-natives-windows-i586.jar +0 -0
- data/library/opengl/library/jogl.dll +0 -0
- data/library/opengl/library/jogl.jar +0 -0
- data/library/opengl/library/jogl.jar.pack.gz +0 -0
- data/library/opengl/library/jogl_awt.dll +0 -0
- data/library/opengl/library/jogl_cg.dll +0 -0
- data/library/opengl/library/libgluegen-rt.jnilib +0 -0
- data/library/opengl/library/libgluegen-rt.so +0 -0
- data/library/opengl/library/libjogl.jnilib +0 -0
- data/library/opengl/library/libjogl.so +0 -0
- data/library/opengl/library/libjogl_awt.jnilib +0 -0
- data/library/opengl/library/libjogl_awt.so +0 -0
- data/library/opengl/library/libjogl_cg.jnilib +0 -0
- data/library/opengl/library/libjogl_cg.so +0 -0
- data/library/opengl/library/opengl.jar +0 -0
- data/library/pdf/bin/processing/pdf/PGraphicsPDF.class +0 -0
- data/library/pdf/library/itext.jar +0 -0
- data/library/pdf/library/pdf.jar +0 -0
- data/library/pdf/notes.txt +9 -0
- data/library/serial/bin/processing/serial/Serial.class +0 -0
- data/library/serial/library/RXTXcomm.jar +0 -0
- data/library/serial/library/export.txt +3 -0
- data/library/serial/library/librxtxSerial.jnilib +0 -0
- data/library/serial/library/librxtxSerial.so +0 -0
- data/library/serial/library/rxtxSerial.dll +0 -0
- data/library/serial/library/serial.jar +0 -0
- data/library/video/bin/processing/video/Capture.class +0 -0
- data/library/video/bin/processing/video/Movie.class +0 -0
- data/library/video/bin/processing/video/MovieMaker.class +0 -0
- data/library/video/library/video.jar +0 -0
- data/samples/animator.rb +47 -0
- data/samples/circle_collision.rb +213 -0
- data/samples/fern.rb +49 -0
- data/samples/flight_patterns.rb +64 -0
- data/samples/full_screen.rb +35 -0
- data/samples/getting_started.rb +43 -0
- data/samples/jwishy.rb +85 -0
- data/samples/kinetic_type.rb +100 -0
- data/samples/learning_processing/ABOUT +11 -0
- data/samples/learning_processing/chapter_01/1_stroke_and_fill.rb +34 -0
- data/samples/learning_processing/chapter_01/2_nofill.rb +25 -0
- data/samples/learning_processing/chapter_01/3_rgb_color.rb +31 -0
- data/samples/learning_processing/chapter_01/4_alpha_transparency.rb +36 -0
- data/samples/learning_processing/chapter_01/5_zoog.rb +37 -0
- data/samples/learning_processing/chapter_02/1_zoog_again.rb +39 -0
- data/samples/learning_processing/chapter_03/1_zoog_as_dynamic_sketch.rb +44 -0
- data/samples/learning_processing/chapter_03/2_mouse_x_and_mouse_y.rb +26 -0
- data/samples/learning_processing/chapter_03/3_zoog_as_dynamic_sketch_with_variation.rb +41 -0
- data/samples/learning_processing/chapter_03/4_drawing_a_continuous_line.rb +18 -0
- data/samples/learning_processing/chapter_03/5_mouse_pressed_and_key_pressed.rb +29 -0
- data/samples/learning_processing/chapter_03/6_interactive_zoog.rb +50 -0
- data/samples/learning_processing/chapter_04/1_variable_declaration.rb +24 -0
- data/samples/learning_processing/chapter_04/2_using_variables.rb +27 -0
- data/samples/learning_processing/chapter_04/3_varying_variables.rb +27 -0
- data/samples/learning_processing/chapter_04/4_many_variables.rb +38 -0
- data/samples/learning_processing/chapter_04/5_using_system_variables.rb +28 -0
- data/samples/learning_processing/chapter_04/6_ellipse_with_variables.rb +24 -0
- data/samples/learning_processing/chapter_04/7_filling_variables_with_random_values.rb +27 -0
- data/samples/learning_processing/chapter_04/8_variable_zoog.rb +50 -0
- data/samples/learning_processing/chapter_05/01_conditionals.rb +31 -0
- data/samples/learning_processing/chapter_05/02_more_conditionals.rb +38 -0
- data/samples/learning_processing/chapter_05/03_rollovers.rb +34 -0
- data/samples/learning_processing/chapter_05/04_hold_down_the_button.rb +33 -0
- data/samples/learning_processing/chapter_05/05_button_as_switch.rb +39 -0
- data/samples/learning_processing/chapter_05/06_bouncing_ball.rb +33 -0
- data/samples/learning_processing/chapter_05/07_bouncing_color.rb +37 -0
- data/samples/learning_processing/chapter_05/08_square_following_edge.rb +59 -0
- data/samples/learning_processing/chapter_05/09_simple_gravity.rb +43 -0
- data/samples/learning_processing/chapter_05/10_zoog_and_conditionals.rb +53 -0
- data/samples/learning_processing/chapter_06/01_many_lines.rb +29 -0
- data/samples/learning_processing/chapter_06/02_many_lines_with_variables.rb +53 -0
- data/samples/learning_processing/chapter_06/03_while_loop.rb +30 -0
- data/samples/learning_processing/chapter_06/04_infinite_loop.rb +25 -0
- data/samples/learning_processing/chapter_06/05_another_infinite_loop.rb +33 -0
- data/samples/learning_processing/chapter_06/06_legs_with_a_for_loop.rb +41 -0
- data/samples/learning_processing/chapter_06/07_local_variables.rb +39 -0
- data/samples/learning_processing/chapter_06/08_lines_one_at_a_time.rb +30 -0
- data/samples/learning_processing/chapter_06/09_simple_while_loop_with_interactivity.rb +41 -0
- data/samples/learning_processing/chapter_06/10_zoog_with_arms.rb +56 -0
- data/samples/learning_processing/chapter_06/11_multiple_zoogs.rb +46 -0
- data/samples/learning_processing/chapter_07/01_defining_a_function.rb +22 -0
- data/samples/learning_processing/chapter_07/02_calling_a_function.rb +22 -0
- data/samples/learning_processing/chapter_07/03_bouncing_ball_with_functions.rb +49 -0
- data/samples/learning_processing/chapter_07/04_function_returns_distance.rb +48 -0
- data/samples/learning_processing/chapter_07/05_zoog_with_functions.rb +71 -0
- data/samples/learning_processing/chapter_08/01_car_class_and_car_variable.rb +45 -0
- data/samples/learning_processing/chapter_08/02_two_car_objects.rb +60 -0
- data/samples/learning_processing/chapter_08/03_object_oriented_zoog.rb +81 -0
- data/samples/learning_processing/chapter_10/01_catcher.rb +35 -0
- data/samples/learning_processing/chapter_10/02_bouncing_ball.rb +44 -0
- data/samples/learning_processing/chapter_10/03_bouncing_balls_with_intersection.rb +69 -0
- data/samples/learning_processing/chapter_10/04_a_timer.rb +24 -0
- data/samples/learning_processing/chapter_10/05_object_oriented_timer.rb +42 -0
- data/samples/learning_processing/chapter_10/06_simple_raindrop.rb +23 -0
- data/samples/learning_processing/chapter_10/07_drops_one_at_a_time.rb +63 -0
- data/samples/learning_processing/chapter_13/02_random_number_distribution.rb +24 -0
- data/samples/learning_processing/chapter_13/03_probabilities.rb +33 -0
- data/samples/learning_processing/chapter_13/04_perlin_noise.rb +22 -0
- data/samples/learning_processing/chapter_13/06_oscillation.rb +29 -0
- data/samples/learning_processing/chapter_13/07_wave.rb +31 -0
- data/samples/learning_processing/chapter_13/08_recursion.rb +30 -0
- data/samples/learning_processing/chapter_13/09_two_dimensional_array.rb +21 -0
- data/samples/learning_processing/chapter_13/10_two_dimensional_array_with_objects.rb +54 -0
- data/samples/learning_processing/chapter_14/01_growing_rectangle.rb +26 -0
- data/samples/learning_processing/chapter_14/02_multiple_translations.rb +37 -0
- data/samples/learning_processing/chapter_14/03_depth_rectangle.rb +29 -0
- data/samples/learning_processing/chapter_14/04_pyramid_using_beingshape.rb +55 -0
- data/samples/learning_processing/chapter_14/05_rotate_rectangle_around_center.rb +28 -0
- data/samples/learning_processing/chapter_14/06_rotate_z.rb +24 -0
- data/samples/learning_processing/chapter_14/07_rotate_x.rb +24 -0
- data/samples/learning_processing/chapter_14/08_rotate_y.rb +24 -0
- data/samples/learning_processing/chapter_14/09_rotate_all.rb +24 -0
- data/samples/learning_processing/chapter_14/10_draw_pyramid.rb +59 -0
- data/samples/learning_processing/chapter_14/12_rotating_one_square.rb +25 -0
- data/samples/learning_processing/chapter_14/13_rotating_another_square.rb +25 -0
- data/samples/learning_processing/chapter_14/14_rotating_both_squares.rb +43 -0
- data/samples/learning_processing/chapter_14/15_rotating_many_things.rb +56 -0
- data/samples/learning_processing/chapter_14/16_simple_solar_system.rb +53 -0
- data/samples/learning_processing/chapter_14/17_nested_push_and_pop.rb +50 -0
- data/samples/learning_processing/chapter_14/18_object_oriented_solar_system.rb +69 -0
- data/samples/learning_processing/chapter_15/01_hello_world_image.rb +20 -0
- data/samples/learning_processing/chapter_15/02_image_sprite.rb +29 -0
- data/samples/learning_processing/chapter_15/03_swapping_images.rb +25 -0
- data/samples/learning_processing/chapter_15/04_image_sequence.rb +22 -0
- data/samples/learning_processing/chapter_15/05_setting_pixels.rb +19 -0
- data/samples/learning_processing/chapter_15/06_pixels_2d.rb +29 -0
- data/samples/learning_processing/chapter_15/07_image_pixels.rb +40 -0
- data/samples/learning_processing/chapter_15/08_image_brightness.rb +29 -0
- data/samples/learning_processing/chapter_15/09_flashlight_effect.rb +42 -0
- data/samples/learning_processing/chapter_15/10_brightness_threshold.rb +33 -0
- data/samples/learning_processing/chapter_15/11_brightness_threshold_with_filter.rb +20 -0
- data/samples/learning_processing/chapter_15/12_pixel_neighbour_differences.rb +43 -0
- data/samples/learning_processing/chapter_15/14_pointillism.rb +34 -0
- data/samples/learning_processing/chapter_15/15_2d_image_mapped_to_3d.rb +43 -0
- data/samples/learning_processing/chapter_15/data/animal0.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/animal1.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/animal2.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/animal3.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/animal4.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/animal5.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/animal6.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/face.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/mysummervacation.jpg +0 -0
- data/samples/learning_processing/chapter_15/data/sunflower.jpg +0 -0
- data/samples/learning_processing/chapter_16/01_display_video.rb +25 -0
- data/samples/learning_processing/chapter_16/02_manipulate_video_image.rb +24 -0
- data/samples/reflection.rb +26 -0
- data/samples/simple_buffer.rb +49 -0
- data/samples/tree.rb +83 -0
- metadata +348 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
module Processing
|
|
2
|
+
|
|
3
|
+
# A utility class to export Ruby-Processing sketches as applets
|
|
4
|
+
# that can be viewed online.
|
|
5
|
+
class AppletExporter < BaseExporter
|
|
6
|
+
|
|
7
|
+
USAGE = <<-EOS
|
|
8
|
+
|
|
9
|
+
The applet generator will generate a web-ready applet for you.
|
|
10
|
+
Usage: script/applet <path_to_sketch>
|
|
11
|
+
Example: script/applet samples/jwishy.rb
|
|
12
|
+
|
|
13
|
+
EOS
|
|
14
|
+
|
|
15
|
+
def export!(sketch)
|
|
16
|
+
# Check to make sure that the main file exists
|
|
17
|
+
@main_file_path, @main_file, @main_folder = *get_main_file(sketch)
|
|
18
|
+
usage(@main_file_path && File.exists?(@main_file_path))
|
|
19
|
+
|
|
20
|
+
extract_information
|
|
21
|
+
|
|
22
|
+
compute_destination_name
|
|
23
|
+
|
|
24
|
+
wipe_and_recreate_destination
|
|
25
|
+
|
|
26
|
+
copy_over_necessary_files
|
|
27
|
+
|
|
28
|
+
process_opengl_replacements
|
|
29
|
+
|
|
30
|
+
calculate_substitutions
|
|
31
|
+
|
|
32
|
+
render_erb_in_path_with_binding(@dest, binding, :delete => true)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def compute_destination_name
|
|
36
|
+
@dest = "#{@main_file.sub(".rb", "")}"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def copy_over_necessary_files
|
|
40
|
+
@necessary_files = [@main_file_path]
|
|
41
|
+
@necessary_files += Dir["#{RP5_ROOT}/lib/{*,**}"]
|
|
42
|
+
@necessary_files += @real_requires
|
|
43
|
+
@necessary_files << "#{@main_folder}/data" if File.exists?("#{@main_folder}/data")
|
|
44
|
+
@necessary_files += Dir["#{RP5_ROOT}/lib/templates/applet/{*,**}"]
|
|
45
|
+
@necessary_files += Dir.glob("library/{#{@libraries.join(",")}}") unless @libraries.empty?
|
|
46
|
+
@necessary_files.uniq!
|
|
47
|
+
cp_r(@necessary_files, @dest)
|
|
48
|
+
cp_r(@libraries, File.join(@dest, "library")) unless @libraries.empty?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def process_opengl_replacements
|
|
52
|
+
@starting_class = @opengl ? "com.sun.opengl.util.JOGLAppletLauncher" : "org.jruby.JRubyApplet"
|
|
53
|
+
return unless @opengl
|
|
54
|
+
opengl_files = Dir["#{@dest}/library/opengl/*.jar"]
|
|
55
|
+
opengl_files += Dir["#{@dest}/library/opengl/library/*.jar"]
|
|
56
|
+
move(opengl_files, @dest)
|
|
57
|
+
opengl_dir = "#{@dest}/library/opengl"
|
|
58
|
+
remove_entry_secure(opengl_dir) if File.exists?(opengl_dir)
|
|
59
|
+
@necessary_files.map! {|file| file.match(/^opengl/) ? File.basename(file) : file }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def calculate_substitutions
|
|
63
|
+
file_list = Dir.glob(@dest + "{/**/*.{rb,jar},/data/*.*}").map {|f| f.sub(@dest+"/","")}
|
|
64
|
+
@width_plus_14 = (@width.to_i + 14).to_s
|
|
65
|
+
@file_list = file_list.join(",")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def usage(predicate)
|
|
69
|
+
return if predicate
|
|
70
|
+
puts USAGE
|
|
71
|
+
exit
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
module Processing
|
|
2
|
+
|
|
3
|
+
# A utility class to export Ruby-Processing sketches as
|
|
4
|
+
# Mac/Win/Nix Applications.
|
|
5
|
+
class ApplicationExporter < BaseExporter
|
|
6
|
+
|
|
7
|
+
USAGE = <<-EOS
|
|
8
|
+
|
|
9
|
+
The application exporter will generate a Mac application for you.
|
|
10
|
+
Usage: script/application <path_to_sketch>
|
|
11
|
+
Example: script/applet samples/jwishy.rb
|
|
12
|
+
|
|
13
|
+
EOS
|
|
14
|
+
|
|
15
|
+
def export!(sketch)
|
|
16
|
+
# Check to make sure that the main file exists
|
|
17
|
+
@main_file_path, @main_file, @main_folder = *get_main_file(sketch)
|
|
18
|
+
usage( @main_file_path && File.exists?(@main_file_path) )
|
|
19
|
+
|
|
20
|
+
extract_information
|
|
21
|
+
|
|
22
|
+
compute_destination_name
|
|
23
|
+
|
|
24
|
+
wipe_and_recreate_destination
|
|
25
|
+
|
|
26
|
+
copy_over_necessary_files
|
|
27
|
+
|
|
28
|
+
calculate_substitutions
|
|
29
|
+
|
|
30
|
+
create_executables
|
|
31
|
+
|
|
32
|
+
symlink_library_into_place
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def compute_destination_name
|
|
36
|
+
@dest = "#{@title}.app"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def copy_over_necessary_files
|
|
40
|
+
@prefix = "lib"
|
|
41
|
+
cp_r(Dir["#{RP5_ROOT}/lib/templates/application/{*,**}"], @dest)
|
|
42
|
+
@necessary_files = [@main_file_path]
|
|
43
|
+
@necessary_files += Dir["#{RP5_ROOT}/lib/{*,**}"]
|
|
44
|
+
@necessary_files += @real_requires
|
|
45
|
+
@necessary_files << "#{@main_folder}/data" if File.exists?("#{@main_folder}/data")
|
|
46
|
+
@necessary_files.uniq!
|
|
47
|
+
cp_r(@necessary_files, File.join(@dest, @prefix))
|
|
48
|
+
cp_r(@libraries, File.join(@dest, @prefix, "library")) unless @libraries.empty?
|
|
49
|
+
# Then move the icon
|
|
50
|
+
potential_icon = Dir.glob(File.join(@dest, @prefix, "data/*.icns"))[0]
|
|
51
|
+
move(potential_icon, File.join(@dest, "Contents/Resources/sketch.icns"), :force => true ) if potential_icon
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def calculate_substitutions
|
|
55
|
+
file_list = Dir.glob(@dest + "{/**/*.{rb,jar},/data/*.*}").map {|f| f.sub(@dest + "/", "")}
|
|
56
|
+
@class_path = file_list.map {|f| "$JAVAROOT/" + f.sub(@prefix+"/", "") }.join(":")
|
|
57
|
+
@linux_class_path = file_list.map{|f| f.sub(@prefix+"/", "")}.join(":")
|
|
58
|
+
@windows_class_path = file_list.map{|f| f.sub(@prefix+"/", "")}.join(",")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def create_executables
|
|
62
|
+
render_erb_in_path_with_binding(@dest, binding, :delete => true)
|
|
63
|
+
rm Dir.glob(@dest + "/**/*.java")
|
|
64
|
+
runnable = @dest + "/" + File.basename(@main_file, ".rb")
|
|
65
|
+
move @dest + "/run", runnable
|
|
66
|
+
move @dest + "/run.exe", "#{runnable}.exe"
|
|
67
|
+
chmod 0755, runnable
|
|
68
|
+
chmod 0755, "#{runnable}.exe"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def symlink_library_into_place
|
|
72
|
+
cd @dest + "/Contents/Resources"
|
|
73
|
+
# Poor ol' windows can't symlink.
|
|
74
|
+
# TODO...
|
|
75
|
+
win = RUBY_PLATFORM.match(/mswin/)
|
|
76
|
+
puts "\n[warning] Applications exported from Windows won't run on Macs...\n" if win
|
|
77
|
+
ln_s('../../lib', 'Java') unless win
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def usage(predicate)
|
|
81
|
+
return if predicate
|
|
82
|
+
puts USAGE
|
|
83
|
+
exit
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'erb'
|
|
3
|
+
|
|
4
|
+
module Processing
|
|
5
|
+
|
|
6
|
+
# This base exporter implements some of the common
|
|
7
|
+
# code-munging needed to generate apps and applets.
|
|
8
|
+
class BaseExporter
|
|
9
|
+
include FileUtils
|
|
10
|
+
|
|
11
|
+
DEFAULT_TITLE = "Ruby-Processing Sketch"
|
|
12
|
+
DEFAULT_DIMENSIONS = {'width' => '500', 'height' => '500'}
|
|
13
|
+
DEFAULT_DESCRIPTION = ''
|
|
14
|
+
|
|
15
|
+
# Returns the filepath, basename, and directory name of the sketch.
|
|
16
|
+
def get_main_file(file)
|
|
17
|
+
return file, File.basename(file), File.dirname(file)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Centralized method to read the source of the sketch and extract
|
|
21
|
+
# all the juicy details.
|
|
22
|
+
def extract_information
|
|
23
|
+
# Extract information from main file
|
|
24
|
+
@info = {}
|
|
25
|
+
@info[:source_code] = source = read_source_code
|
|
26
|
+
@info[:class_name] = extract_class_name(source)
|
|
27
|
+
@info[:title] = extract_title(source)
|
|
28
|
+
@info[:width] = extract_dimension(source, 'width')
|
|
29
|
+
@info[:height] = extract_dimension(source, 'height')
|
|
30
|
+
@info[:description] = extract_description(source)
|
|
31
|
+
@info[:libraries] = extract_libraries(source)
|
|
32
|
+
@info[:real_requires] = extract_real_requires(source)
|
|
33
|
+
hash_to_ivars @info
|
|
34
|
+
@info
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Searches the source for a class name.
|
|
38
|
+
def extract_class_name(source)
|
|
39
|
+
match = source.match(/(\w+)\s*<\s*Processing::App/)
|
|
40
|
+
match ? match[1] : nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Searches the source for a title.
|
|
44
|
+
def extract_title(source)
|
|
45
|
+
match = source.match(/#{@info[:class_name]}\.new.*?:title\s=>\s["'](.+)["']/m)
|
|
46
|
+
match ? match[1] : DEFAULT_TITLE
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Searches the source for the width and height of the sketch.
|
|
50
|
+
def extract_dimension(source, dimension)
|
|
51
|
+
match = source.match(/#{@info[:class_name]}\.new.*?:#{dimension}\s=>\s(\d+)/m)
|
|
52
|
+
match ? match[1] : DEFAULT_DIMENSIONS[dimension]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Searches the source for a description of the sketch.
|
|
56
|
+
def extract_description(source)
|
|
57
|
+
match = source.match(/# Description:(.*?)\n[^#]/m)
|
|
58
|
+
match ? match[1].gsub!(/\n(\s*)?#/, "") : DEFAULT_DESCRIPTION
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Searches the source any libraries that have been loaded.
|
|
62
|
+
def extract_libraries(source)
|
|
63
|
+
libs = []
|
|
64
|
+
code = source.dup
|
|
65
|
+
loop do
|
|
66
|
+
matchdata = code.match(/load_\w+_library.+?["':](\S+?)["'\s]/)
|
|
67
|
+
break unless matchdata
|
|
68
|
+
match = matchdata[1]
|
|
69
|
+
@opengl = true if match.match(/opengl/i)
|
|
70
|
+
local_path = "#{local_dir}/library/#{match}"
|
|
71
|
+
rp5_path = "#{RP5_ROOT}/library/#{match}"
|
|
72
|
+
File.exists?(local_path) ? libs << local_path :
|
|
73
|
+
(libs << rp5_path if File.exists?(rp5_path))
|
|
74
|
+
code = matchdata.post_match
|
|
75
|
+
end
|
|
76
|
+
libs
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Looks for all of the codes require or load commands, checks
|
|
80
|
+
# to see if the file exists (that it's not a gem, or a standard lib)
|
|
81
|
+
# and hands you back all the real ones.
|
|
82
|
+
def extract_real_requires(source)
|
|
83
|
+
code = source.dup
|
|
84
|
+
requirements = []
|
|
85
|
+
partial_paths = []
|
|
86
|
+
loop do
|
|
87
|
+
matchdata = code.match(/^.*\b(require|load)\b.*$/)
|
|
88
|
+
break unless matchdata
|
|
89
|
+
line = matchdata[0].gsub('__FILE__', "'#{@main_file_path}'")
|
|
90
|
+
line = line.gsub(/\b(require|load)\b/, 'partial_paths << ')
|
|
91
|
+
eval(line)
|
|
92
|
+
requirements += Dir["{#{local_dir}/,}{#{partial_paths.join(',')}}.{rb,jar}"]
|
|
93
|
+
code = matchdata.post_match
|
|
94
|
+
end
|
|
95
|
+
return requirements
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
protected
|
|
100
|
+
|
|
101
|
+
def read_source_code
|
|
102
|
+
File.read(@main_file_path)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def local_dir
|
|
106
|
+
File.dirname(@main_file_path)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def hash_to_ivars(hash)
|
|
110
|
+
hash.each{|k,v| instance_variable_set("@" + k.to_s, v) }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def wipe_and_recreate_destination
|
|
114
|
+
remove_entry_secure @dest if File.exists?(@dest)
|
|
115
|
+
mkdir_p @dest
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def render_erb_in_path_with_binding(path, some_binding, opts={})
|
|
119
|
+
erbs = Dir.glob(path + "/**/*.erb")
|
|
120
|
+
erbs.each do |erb|
|
|
121
|
+
string = File.open(erb) {|f| f.read }
|
|
122
|
+
rendered = render_erb_from_string_with_binding(string, some_binding)
|
|
123
|
+
File.open(erb.sub(".erb", ""), "w") {|f| f.print rendered }
|
|
124
|
+
rm erb if opts[:delete]
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def render_erb_from_string_with_binding(erb, some_binding)
|
|
129
|
+
rendered = ERB.new(erb, nil, "<>", "rendered").result(some_binding)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Processing
|
|
2
|
+
|
|
3
|
+
# This class creates blank sketches, with the boilerplate filled in.
|
|
4
|
+
class Creator < BaseExporter
|
|
5
|
+
|
|
6
|
+
# Create a blank sketch, given a path.
|
|
7
|
+
def create!(path, args)
|
|
8
|
+
usage path
|
|
9
|
+
main_file = File.basename(path, ".rb")
|
|
10
|
+
# Check to make sure that the main file exists
|
|
11
|
+
already_exists = File.exists?(path) || File.exists?("#{File.dirname(path)}/#{main_file.underscore}.rb")
|
|
12
|
+
puts "That sketch already exists." and exit if already_exists
|
|
13
|
+
|
|
14
|
+
# Get the substitutions
|
|
15
|
+
@name = main_file.camelize
|
|
16
|
+
@file_name = main_file.underscore
|
|
17
|
+
@title = main_file.titleize
|
|
18
|
+
@width = args[0] || "500"
|
|
19
|
+
@height = args[1] || "500"
|
|
20
|
+
|
|
21
|
+
# Make the file
|
|
22
|
+
dir = File.dirname path
|
|
23
|
+
mkdir_p dir
|
|
24
|
+
template = File.new("#{RP5_ROOT}/lib/templates/create/blank_sketch.rb.erb")
|
|
25
|
+
rendered = render_erb_from_string_with_binding(template.read, binding)
|
|
26
|
+
File.open(File.join(dir, "#{@file_name}.rb"), "w") do |file|
|
|
27
|
+
file.print rendered
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Show the help/usage message for create.
|
|
32
|
+
def usage(predicate)
|
|
33
|
+
unless predicate
|
|
34
|
+
puts <<-USAGE
|
|
35
|
+
|
|
36
|
+
Usage: script/generate <sketch_to_generate> <width> <height>
|
|
37
|
+
Width and Height are optional.
|
|
38
|
+
|
|
39
|
+
Example: script/generate fancy_drawing/app 800 600
|
|
40
|
+
|
|
41
|
+
USAGE
|
|
42
|
+
exit
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class String #:nodoc:
|
|
2
|
+
|
|
3
|
+
def titleize
|
|
4
|
+
self.underscore.humanize.gsub(/\b([a-z])/) { $1.capitalize }
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def humanize()
|
|
8
|
+
self.gsub(/_id$/, "").gsub(/_/, " ").capitalize
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def camelize(first_letter_in_uppercase = true)
|
|
12
|
+
if first_letter_in_uppercase
|
|
13
|
+
self.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
|
|
14
|
+
else
|
|
15
|
+
self.first + self.camelize[1..-1]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def underscore
|
|
20
|
+
self.gsub(/::/, '/').
|
|
21
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
|
22
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
|
23
|
+
tr("-", "_").
|
|
24
|
+
downcase
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
require 'ostruct'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
|
|
4
|
+
module Processing
|
|
5
|
+
|
|
6
|
+
# Utility class to handle the different commands that the 'rp5' command
|
|
7
|
+
# offers. Able to run, watch, live, create, app, applet, and unpack
|
|
8
|
+
class Runner
|
|
9
|
+
|
|
10
|
+
HELP_MESSAGE = <<-EOS
|
|
11
|
+
|
|
12
|
+
Ruby-Processing is a little shim between Processing and JRuby that helps
|
|
13
|
+
you create sketches of code art.
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
rp5 [run | watch | live | create | app | applet | unpack] path/to/sketch
|
|
17
|
+
|
|
18
|
+
Examples:
|
|
19
|
+
rp5 unpack samples
|
|
20
|
+
rp5 run samples/jwishy.rb
|
|
21
|
+
rp5 create some_new_sketch 640 480
|
|
22
|
+
rp5 watch some_new_sketch.rb
|
|
23
|
+
rp5 applet some_new_sketch.rb
|
|
24
|
+
|
|
25
|
+
Further information:
|
|
26
|
+
http://wiki.github.com/jashkenas/ruby-processing
|
|
27
|
+
|
|
28
|
+
EOS
|
|
29
|
+
|
|
30
|
+
# Start running a ruby-processing sketch from the passed-in arguments
|
|
31
|
+
def self.execute
|
|
32
|
+
runner = new
|
|
33
|
+
runner.parse_options(ARGV)
|
|
34
|
+
runner.execute!
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Dispatch central.
|
|
38
|
+
def execute!
|
|
39
|
+
case @options.action
|
|
40
|
+
when 'run' : run(@options.path)
|
|
41
|
+
when 'watch' : watch(@options.path)
|
|
42
|
+
when 'create' : create(@options.path, @options.args)
|
|
43
|
+
when 'live' : live(@options.path)
|
|
44
|
+
when 'app' : app(@options.path)
|
|
45
|
+
when 'applet' : applet(@options.path)
|
|
46
|
+
when 'unpack' : unpack(@options.path)
|
|
47
|
+
when /-v/ : show_version
|
|
48
|
+
when /-h/ : show_help
|
|
49
|
+
else show_help
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Parse the command-line options. Keep it simple.
|
|
54
|
+
def parse_options(args)
|
|
55
|
+
@options = OpenStruct.new
|
|
56
|
+
@options.action = args[0] || nil
|
|
57
|
+
@options.path = args[1] || File.basename(Dir.pwd + '.rb')
|
|
58
|
+
@options.args = args[2..-1] || []
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Create a fresh Ruby-Processing sketch, with the necessary
|
|
62
|
+
# boilerplate filled out.
|
|
63
|
+
def create(sketch, args)
|
|
64
|
+
Processing::Creator.new.create!(sketch, args)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Just simply run a ruby-processing sketch.
|
|
68
|
+
def run(sketch)
|
|
69
|
+
ensure_exists(sketch)
|
|
70
|
+
spin_up('run.rb', sketch)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Run a sketch, keeping an eye on it's file, and reloading
|
|
74
|
+
# whenever it changes.
|
|
75
|
+
def watch(sketch)
|
|
76
|
+
ensure_exists(sketch)
|
|
77
|
+
spin_up('watch.rb', sketch)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Run a sketch, opening its guts to IRB, letting you play with it.
|
|
81
|
+
def live(sketch)
|
|
82
|
+
ensure_exists(sketch)
|
|
83
|
+
spin_up('live.rb', sketch)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Generate a cross-platform application of a given Ruby-Processing sketch.
|
|
87
|
+
def app(sketch)
|
|
88
|
+
Processing::ApplicationExporter.new.export!(sketch)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Generate an applet and HTML page for a given sketch.
|
|
92
|
+
def applet(sketch)
|
|
93
|
+
Processing::AppletExporter.new.export!(sketch)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Install the included samples to a given path, where you can run and
|
|
97
|
+
# alter them to your heart's content.
|
|
98
|
+
def unpack(dir)
|
|
99
|
+
require 'fileutils'
|
|
100
|
+
usage = "Usage: rp5 unpack [samples | library]"
|
|
101
|
+
puts usage and return unless dir.match(/\A(samples|library)\Z/)
|
|
102
|
+
FileUtils.cp_r("#{RP5_ROOT}/#{dir}", "#{Dir.pwd}/#{dir}")
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Display the current version of Ruby-Processing.
|
|
106
|
+
def show_version
|
|
107
|
+
puts "Ruby-Processing version #{Processing.version}"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Show the standard help/usage message.
|
|
111
|
+
def show_help
|
|
112
|
+
puts HELP_MESSAGE
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
private
|
|
117
|
+
|
|
118
|
+
# Trade in this Ruby instance for a JRuby instance, loading in a
|
|
119
|
+
# starter script and passing it some arguments.
|
|
120
|
+
def spin_up(starter_script, args)
|
|
121
|
+
runner = "#{RP5_ROOT}/lib/ruby-processing/runners/#{starter_script}"
|
|
122
|
+
command = "java -cp #{jruby_complete} #{dock_icon} org.jruby.Main #{runner} #{args}"
|
|
123
|
+
exec(command)
|
|
124
|
+
# exec replaces the Ruby process with the JRuby one.
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def ensure_exists(sketch)
|
|
128
|
+
puts "Couldn't find: #{sketch}" and exit unless File.exists?(sketch)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def jruby_complete
|
|
132
|
+
File.join(RP5_ROOT, 'lib/core/jruby-complete.jar')
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# On the Mac, we can display a fat, shiny ruby in the Dock.
|
|
136
|
+
def dock_icon
|
|
137
|
+
mac = RUBY_PLATFORM.match(/darwin/i)
|
|
138
|
+
mac ? "-Xdock:name=Ruby-Processing -Xdock:icon=#{RP5_ROOT}/lib/templates/application/Contents/Resources/sketch.icns" : ""
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end # class Runner
|
|
142
|
+
|
|
143
|
+
end # module Processing
|