sproutit-sproutcore 1.0.0.20090407205609
Sign up to get free protection for your applications and to get access to all the features.
- data/Buildfile +115 -0
- data/History.txt +7 -0
- data/README.txt +102 -0
- data/Rakefile +54 -0
- data/Todo.txt +1 -0
- data/bin/sc-build +13 -0
- data/bin/sc-build-number +13 -0
- data/bin/sc-gen +13 -0
- data/bin/sc-init +13 -0
- data/bin/sc-manifest +13 -0
- data/bin/sc-server +13 -0
- data/bin/sproutcore +14 -0
- data/buildtasks/build.rake +73 -0
- data/buildtasks/entry.rake +59 -0
- data/buildtasks/manifest.rake +469 -0
- data/buildtasks/render.rake +21 -0
- data/buildtasks/target.rake +42 -0
- data/gen/Buildfile +16 -0
- data/gen/app/Buildfile +36 -0
- data/gen/app/README +1 -0
- data/gen/app/USAGE +13 -0
- data/gen/app/templates/apps/{target_name}/core.js +27 -0
- data/gen/app/templates/apps/{target_name}/english.lproj/loading.rhtml +9 -0
- data/gen/app/templates/apps/{target_name}/english.lproj/main_page.js +22 -0
- data/gen/app/templates/apps/{target_name}/english.lproj/strings.js +15 -0
- data/gen/app/templates/apps/{target_name}/main.js +30 -0
- data/gen/controller/Buildfile +18 -0
- data/gen/controller/README +1 -0
- data/gen/controller/USAGE +13 -0
- data/gen/controller/templates/controllers/{filename}.js +18 -0
- data/gen/controller/templates/tests/controllers/{filename}.js +15 -0
- data/gen/framework/Buildfile +36 -0
- data/gen/framework/README +1 -0
- data/gen/framework/USAGE +13 -0
- data/gen/framework/templates/frameworks/{target_name}/core.js +21 -0
- data/gen/framework/templates/frameworks/{target_name}/english.lproj/strings.js +15 -0
- data/gen/language/Buildfile +26 -0
- data/gen/language/README +1 -0
- data/gen/language/USAGE +13 -0
- data/gen/language/templates/{filename}/strings.js +14 -0
- data/gen/model/Buildfile +16 -0
- data/gen/model/README +1 -0
- data/gen/model/USAGE +15 -0
- data/gen/model/templates/fixtures/{filename}.js +35 -0
- data/gen/model/templates/models/{filename}.js +19 -0
- data/gen/model/templates/tests/models/{filename}.js +15 -0
- data/gen/project/Buildfile +45 -0
- data/gen/project/INIT +3 -0
- data/gen/project/README +1 -0
- data/gen/project/USAGE +2 -0
- data/gen/project/templates/{filename}/Buildfile +7 -0
- data/gen/project/templates/{filename}/README +7 -0
- data/gen/test/Buildfile +25 -0
- data/gen/test/README +1 -0
- data/gen/test/USAGE +12 -0
- data/gen/test/templates/tests/{filename}.js +15 -0
- data/gen/theme/Buildfile +36 -0
- data/gen/theme/README +1 -0
- data/gen/theme/USAGE +13 -0
- data/gen/theme/templates/themes/{target_name}/english.lproj/strings.js +15 -0
- data/gen/view/Buildfile +18 -0
- data/gen/view/README +1 -0
- data/gen/view/USAGE +13 -0
- data/gen/view/templates/tests/views/{filename}.js +15 -0
- data/gen/view/templates/views/{filename}.js +18 -0
- data/lib/sproutcore.rb +130 -0
- data/lib/sproutcore/builders/base.rb +79 -0
- data/lib/sproutcore/builders/combine.rb +37 -0
- data/lib/sproutcore/builders/html.rb +177 -0
- data/lib/sproutcore/builders/javascript.rb +55 -0
- data/lib/sproutcore/builders/minify.rb +67 -0
- data/lib/sproutcore/builders/sass.rb +55 -0
- data/lib/sproutcore/builders/strings.rb +44 -0
- data/lib/sproutcore/builders/stylesheet.rb +40 -0
- data/lib/sproutcore/builders/test.rb +58 -0
- data/lib/sproutcore/builders/test_index.rb +26 -0
- data/lib/sproutcore/buildfile.rb +483 -0
- data/lib/sproutcore/buildfile/build_task.rb +33 -0
- data/lib/sproutcore/buildfile/buildfile_dsl.rb +162 -0
- data/lib/sproutcore/buildfile/cloneable.rb +34 -0
- data/lib/sproutcore/buildfile/early_time.rb +29 -0
- data/lib/sproutcore/buildfile/invocation_chain.rb +64 -0
- data/lib/sproutcore/buildfile/namespace.rb +33 -0
- data/lib/sproutcore/buildfile/string_ext.rb +198 -0
- data/lib/sproutcore/buildfile/task.rb +304 -0
- data/lib/sproutcore/buildfile/task_arguments.rb +86 -0
- data/lib/sproutcore/buildfile/task_manager.rb +193 -0
- data/lib/sproutcore/deprecated/view_helper.rb +662 -0
- data/lib/sproutcore/helpers/capture_helper.rb +30 -0
- data/lib/sproutcore/helpers/cssmin.rb +202 -0
- data/lib/sproutcore/helpers/dom_id_helper.rb +21 -0
- data/lib/sproutcore/helpers/entry_sorter.rb +105 -0
- data/lib/sproutcore/helpers/packed_optimizer.rb +102 -0
- data/lib/sproutcore/helpers/static_helper.rb +268 -0
- data/lib/sproutcore/helpers/tag_helper.rb +117 -0
- data/lib/sproutcore/helpers/text_helper.rb +303 -0
- data/lib/sproutcore/models/generator.rb +493 -0
- data/lib/sproutcore/models/hash_struct.rb +109 -0
- data/lib/sproutcore/models/manifest.rb +342 -0
- data/lib/sproutcore/models/manifest_entry.rb +232 -0
- data/lib/sproutcore/models/project.rb +270 -0
- data/lib/sproutcore/models/target.rb +403 -0
- data/lib/sproutcore/rack/builder.rb +269 -0
- data/lib/sproutcore/rack/dev.rb +51 -0
- data/lib/sproutcore/rack/docs.rb +24 -0
- data/lib/sproutcore/rack/proxy.rb +92 -0
- data/lib/sproutcore/rack/service.rb +141 -0
- data/lib/sproutcore/rack/test_runner.rb +24 -0
- data/lib/sproutcore/render_engines/erubis.rb +55 -0
- data/lib/sproutcore/render_engines/haml.rb +39 -0
- data/lib/sproutcore/tools.rb +311 -0
- data/lib/sproutcore/tools/build.rb +80 -0
- data/lib/sproutcore/tools/build_number.rb +23 -0
- data/lib/sproutcore/tools/gen.rb +99 -0
- data/lib/sproutcore/tools/init.rb +40 -0
- data/lib/sproutcore/tools/manifest.rb +84 -0
- data/lib/sproutcore/tools/server.rb +45 -0
- data/spec/buildtasks/build/copy_spec.rb +60 -0
- data/spec/buildtasks/build/spec_helper.rb +36 -0
- data/spec/buildtasks/manifest/catalog_spec.rb +48 -0
- data/spec/buildtasks/manifest/hide_buildfiles_spec.rb +125 -0
- data/spec/buildtasks/manifest/localize_spec.rb +97 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +246 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/css_spec.rb +87 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/html_spec.rb +175 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/javascript_spec.rb +65 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/minify_spec.rb +70 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +152 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/sass_spec.rb +98 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/strings_spec.rb +64 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/tests_spec.rb +163 -0
- data/spec/buildtasks/manifest/prepare_spec.rb +43 -0
- data/spec/buildtasks/manifest/spec_helper.rb +35 -0
- data/spec/buildtasks/target_spec.rb +214 -0
- data/spec/fixtures/builder_tests/Buildfile +15 -0
- data/spec/fixtures/builder_tests/apps/combine_test/a.js +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/b.js +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/c.js +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +1 -0
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +1 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +2 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +1 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +1 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +4 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +4 -0
- data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +1 -0
- data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +15 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +4 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +7 -0
- data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +3 -0
- data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +8 -0
- data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +9 -0
- data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +12 -0
- data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +1 -0
- data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +3 -0
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +1 -0
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +1 -0
- data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +4 -0
- data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +4 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +1 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +1 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +1 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
- data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +1 -0
- data/spec/fixtures/buildfiles/basic/Buildfile +16 -0
- data/spec/fixtures/buildfiles/basic/task_module.rake +6 -0
- data/spec/fixtures/buildfiles/installed/Buildfile +7 -0
- data/spec/fixtures/buildfiles/installed/Buildfile2 +5 -0
- data/spec/fixtures/buildfiles/project_test/Buildfile +4 -0
- data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +2 -0
- data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/Buildfile +1 -0
- data/spec/fixtures/entry_for_project/apps/test_app/entry.txt +0 -0
- data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/Buildfile +8 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +5 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/nested/Buildfile +8 -0
- data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +1 -0
- data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/1.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/B.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/a.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/c.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/core.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +1 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +1 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/a.js +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/b.js +3 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/c.js +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +2 -0
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +1 -0
- data/spec/fixtures/real_world/Buildfile +12 -0
- data/spec/fixtures/real_world/apps/account/README +1 -0
- data/spec/fixtures/real_world/apps/calendar/README +1 -0
- data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +1 -0
- data/spec/fixtures/real_world/apps/files/README +1 -0
- data/spec/fixtures/real_world/apps/mail/README +1 -0
- data/spec/fixtures/real_world/apps/mobile_photos/README +1 -0
- data/spec/fixtures/real_world/apps/photos/README +1 -0
- data/spec/fixtures/real_world/apps/uploader/README +1 -0
- data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +26 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/README +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +4 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +4 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +6 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +3 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +4 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +6 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +1 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +1 -0
- data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
- data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +1 -0
- data/spec/fixtures/recursive_project/Buildfile +8 -0
- data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
- data/spec/lib/builders/combine_spec.rb +67 -0
- data/spec/lib/builders/html_spec.rb +577 -0
- data/spec/lib/builders/javascript_spec.rb +81 -0
- data/spec/lib/builders/sass_spec.rb +43 -0
- data/spec/lib/builders/spec_helper.rb +30 -0
- data/spec/lib/builders/strings_spec.rb +52 -0
- data/spec/lib/builders/stylesheet_spec.rb +63 -0
- data/spec/lib/builders/test_index_spec.rb +44 -0
- data/spec/lib/builders/test_spec.rb +135 -0
- data/spec/lib/buildfile/config_for_spec.rb +81 -0
- data/spec/lib/buildfile/define_spec.rb +59 -0
- data/spec/lib/buildfile/dup_spec.rb +65 -0
- data/spec/lib/buildfile/invoke_spec.rb +130 -0
- data/spec/lib/buildfile/load_spec.rb +49 -0
- data/spec/lib/buildfile/task/dup_spec.rb +55 -0
- data/spec/lib/buildfile/task_defined_spec.rb +17 -0
- data/spec/lib/buildfile_commands/build_task_spec.rb +19 -0
- data/spec/lib/buildfile_commands/config_spec.rb +97 -0
- data/spec/lib/buildfile_commands/import_spec.rb +17 -0
- data/spec/lib/buildfile_commands/namespace_spec.rb +18 -0
- data/spec/lib/buildfile_commands/proxies_spec.rb +38 -0
- data/spec/lib/buildfile_commands/replace_task_spec.rb +29 -0
- data/spec/lib/buildfile_commands/task_spec.rb +36 -0
- data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +26 -0
- data/spec/lib/models/hash_struct/deep_clone_spec.rb +27 -0
- data/spec/lib/models/hash_struct/has_options_spec.rb +32 -0
- data/spec/lib/models/hash_struct/hash_spec.rb +64 -0
- data/spec/lib/models/hash_struct/merge_spec.rb +26 -0
- data/spec/lib/models/hash_struct/method_missing.rb +41 -0
- data/spec/lib/models/manifest/add_entry_spec.rb +36 -0
- data/spec/lib/models/manifest/add_transform_spec.rb +90 -0
- data/spec/lib/models/manifest/build_spec.rb +78 -0
- data/spec/lib/models/manifest/entry_for_spec.rb +94 -0
- data/spec/lib/models/manifest/find_entry.rb +84 -0
- data/spec/lib/models/manifest/prepare_spec.rb +62 -0
- data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +31 -0
- data/spec/lib/models/manifest_entry/prepare_spec.rb +54 -0
- data/spec/lib/models/project/add_target_spec.rb +44 -0
- data/spec/lib/models/project/buildfile_spec.rb +35 -0
- data/spec/lib/models/project/find_targets_for_spec.rb +77 -0
- data/spec/lib/models/project/load_nearest_project_spec.rb +23 -0
- data/spec/lib/models/project/target_for_spec.rb +33 -0
- data/spec/lib/models/project/targets_spec.rb +62 -0
- data/spec/lib/models/target/compute_build_number_spec.rb +125 -0
- data/spec/lib/models/target/config_spec.rb +30 -0
- data/spec/lib/models/target/expand_required_targets_spec.rb +48 -0
- data/spec/lib/models/target/installed_languages_spec.rb +47 -0
- data/spec/lib/models/target/lproj_for_spec.rb +38 -0
- data/spec/lib/models/target/manifest_for_spec.rb +42 -0
- data/spec/lib/models/target/parent_target_spec.rb +21 -0
- data/spec/lib/models/target/prepare_spec.rb +53 -0
- data/spec/lib/models/target/required_targets_spec.rb +119 -0
- data/spec/lib/models/target/target_for_spec.rb +56 -0
- data/spec/lib/tools/build_number_spec.rb +28 -0
- data/spec/lib/tools/gen_spec.rb +207 -0
- data/spec/lib/tools/tools_spec.rb +78 -0
- data/spec/spec_helper.rb +138 -0
- data/sproutcore.gemspec +47 -0
- data/vendor/github_gem_lint.rb +22 -0
- data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
- metadata +1084 -0
@@ -0,0 +1,268 @@
|
|
1
|
+
# ===========================================================================
|
2
|
+
# Project: Abbot - SproutCore Build Tools
|
3
|
+
# Copyright: ©2009 Apple, Inc.
|
4
|
+
# portions copyright @2006-2009 Sprout Systems, Inc.
|
5
|
+
# and contributors
|
6
|
+
# ===========================================================================
|
7
|
+
|
8
|
+
# The helper methods here are used to build the main index template file for
|
9
|
+
# a SproutCore application. See the commented index.rhtml in the plugin for
|
10
|
+
# example usage.
|
11
|
+
#
|
12
|
+
module SC
|
13
|
+
module Helpers
|
14
|
+
|
15
|
+
module StaticHelper
|
16
|
+
|
17
|
+
# This method will return the HTML to link to all the stylesheets
|
18
|
+
# required by the named bundle. If you pass no options, the current
|
19
|
+
# client will be used.
|
20
|
+
#
|
21
|
+
# bundle_name = the name of the bundle to render or nil to use the
|
22
|
+
# current :language => the language to render. defaults to current
|
23
|
+
# language
|
24
|
+
#
|
25
|
+
def stylesheets_for_client(target_name = nil, opts = nil)
|
26
|
+
|
27
|
+
# normalize params
|
28
|
+
if target_name.kind_of?(Hash) && opts.nil?
|
29
|
+
opts = target_name
|
30
|
+
target_name = nil
|
31
|
+
end
|
32
|
+
opts = {} if opts.nil?
|
33
|
+
|
34
|
+
# process options
|
35
|
+
include_method = opts[:include_method] ||= :link
|
36
|
+
t = target_name ? target.target_for(target_name) : target
|
37
|
+
|
38
|
+
# collect urls from entries
|
39
|
+
urls = []
|
40
|
+
combine_stylesheets = t.config.combine_stylesheets
|
41
|
+
combined_entries(t, opts, 'stylesheet.css', 'stylesheet-packed.css') do |cur_target, cur_entry|
|
42
|
+
# include either the entry URL or URL of ordered entries
|
43
|
+
# depending on setup
|
44
|
+
if combine_stylesheets
|
45
|
+
urls << cur_entry.cacheable_url
|
46
|
+
else
|
47
|
+
urls += cur_entry.ordered_entries.map { |e| e.cacheable_url }
|
48
|
+
end
|
49
|
+
|
50
|
+
# add any stylesheet libs from the target
|
51
|
+
urls += (cur_target.config.stylesheet_libs || [])
|
52
|
+
end
|
53
|
+
|
54
|
+
# Convert to HTML and return
|
55
|
+
urls = urls.map do |url|
|
56
|
+
if include_method == :import
|
57
|
+
%( @import url('#{url}');)
|
58
|
+
else
|
59
|
+
%( <link href="#{url}" rel="stylesheet" type="text/css" />)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# if include style is @import, surround with style tags
|
64
|
+
if include_method == :import
|
65
|
+
%(<style type="text/css">\n#{urls * "\n"}</style>)
|
66
|
+
else
|
67
|
+
urls.join("\n")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# This method will return the HTML to link to all the javascripts
|
72
|
+
# required by the client. If you pass no options, the current client
|
73
|
+
# will be used.
|
74
|
+
#
|
75
|
+
# client_name = the name of the client to render or nil to use the
|
76
|
+
# current :language => the language to render. defaults to @language.
|
77
|
+
#
|
78
|
+
def javascripts_for_client(target_name = nil, opts = {})
|
79
|
+
|
80
|
+
# normalize params
|
81
|
+
if target_name.kind_of?(Hash) && opts.nil?
|
82
|
+
opts = target_name
|
83
|
+
target_name = nil
|
84
|
+
end
|
85
|
+
opts = {} if opts.nil?
|
86
|
+
|
87
|
+
# process options
|
88
|
+
t = target_name ? target.target_for(target_name) : target
|
89
|
+
|
90
|
+
# collect urls from entries
|
91
|
+
urls = []
|
92
|
+
combine_javascript = t.config.combine_javascript
|
93
|
+
combined_entries(t, opts, 'javascript.js', 'javascript-packed.js') do |cur_target, cur_entry|
|
94
|
+
|
95
|
+
# include either the entry URL or URL of ordered entries
|
96
|
+
# depending on setup
|
97
|
+
if combine_javascript
|
98
|
+
urls << cur_entry.cacheable_url
|
99
|
+
else
|
100
|
+
urls += cur_entry.ordered_entries.map { |e| e.cacheable_url }
|
101
|
+
end
|
102
|
+
|
103
|
+
# add any stylesheet libs from the target
|
104
|
+
urls += (cur_target.config.javascript_libs || [])
|
105
|
+
end
|
106
|
+
|
107
|
+
# Convert to HTML and return
|
108
|
+
urls = urls.map do |url|
|
109
|
+
%( <script type="text/javascript" src="#{url}"></script>)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Add preferred language definition...
|
113
|
+
urls << %(<script type="text/javascript">String.preferredLanguage = "#{language}";</script>)
|
114
|
+
|
115
|
+
urls.join("\n")
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns the URL for the named resource
|
119
|
+
def sc_static(resource_name, opts = {})
|
120
|
+
|
121
|
+
# determine which manifest to search. if a language is explicitly
|
122
|
+
# specified, lookup manifest for that language. otherwise use
|
123
|
+
# current manifest.
|
124
|
+
m = self.manifest
|
125
|
+
if opts[:language]
|
126
|
+
m = target.manifest_for(:language => opts[:language]).build!
|
127
|
+
end
|
128
|
+
|
129
|
+
entry = m.find_entry(resource_name)
|
130
|
+
entry.nil? ? '' : entry.cacheable_url
|
131
|
+
end
|
132
|
+
alias_method :static_url, :sc_static
|
133
|
+
|
134
|
+
# Allows you to specify HTML resource this html template should be
|
135
|
+
# merged into. Optionally also specify the layout file to use when
|
136
|
+
# building this resource.
|
137
|
+
#
|
138
|
+
# == Example
|
139
|
+
# <% sc_resource :foo, :layout => 'sproutcore:lib/index.html' %>
|
140
|
+
#
|
141
|
+
def sc_resource(resource_name, opts = nil)
|
142
|
+
opts = opts.nil? ? (resource_name.kind_of?(Hash) ? resource_name : {}) : opts
|
143
|
+
@layout = opts[:layout] if opts[:layout]
|
144
|
+
return ''
|
145
|
+
end
|
146
|
+
|
147
|
+
# Localizes the passed string, using the optional passed options.
|
148
|
+
def loc(string, opts = {})
|
149
|
+
string = string.nil? ? '' : string.to_s
|
150
|
+
language = opts[:language] || self.language
|
151
|
+
return strings_hash(language)[string] || string
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns the CSS class name dictated by the current theme. You can
|
155
|
+
# also pass an optional default value to use if no theme is specified
|
156
|
+
# in the config. The value returned here will use either the
|
157
|
+
# theme_name set in the target's config or the theme_name set by the
|
158
|
+
# theme framework, if set.
|
159
|
+
def theme_name(opts ={})
|
160
|
+
ret = opts[:default] || 'sc-theme'
|
161
|
+
if target.config.theme_name
|
162
|
+
ret = target.config.theme_name
|
163
|
+
elsif target.config.theme
|
164
|
+
if theme_target = target.target_for(target.config.theme)
|
165
|
+
ret = theme_target.config.theme_name || ret
|
166
|
+
end
|
167
|
+
end
|
168
|
+
return ret
|
169
|
+
end
|
170
|
+
|
171
|
+
def title
|
172
|
+
target.config.title || target.target_name.to_s.sub(/^\//,'').gsub(/[-_\/]/,' ').split(' ').map { |x| x.capitalize }.join(' ')
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
|
177
|
+
# Returns a merged strings hash from all of the required bundles. Used
|
178
|
+
# by loc()
|
179
|
+
#
|
180
|
+
# === Params
|
181
|
+
# for_language:: the language you want the hash for
|
182
|
+
#
|
183
|
+
# === Returns
|
184
|
+
# params hash
|
185
|
+
#
|
186
|
+
def strings_hash(for_language)
|
187
|
+
ret = (@strings_hashes ||= {})[for_language]
|
188
|
+
return ret unless ret.nil?
|
189
|
+
|
190
|
+
# Need to generate hash.
|
191
|
+
|
192
|
+
# get the default manifest for the current target. will be used to
|
193
|
+
# select other manifests.
|
194
|
+
m = (for_language == self.language) ? self.manifest : target.manifest_for(:language => for_language)
|
195
|
+
|
196
|
+
# get all of the targets to merge...
|
197
|
+
ret = {}
|
198
|
+
targets = (target.expand_required_targets + [target])
|
199
|
+
targets.each do |t|
|
200
|
+
# get the manifest for the target
|
201
|
+
cur_manifest = (t == target) ? m : t.manifest_for(m.variation)
|
202
|
+
cur_manifest.build!
|
203
|
+
|
204
|
+
# ...and find a strings entry, if there is one.
|
205
|
+
strings_entry = cur_manifest.entries(:hidden => true).find { |e| e.entry_type == :strings }
|
206
|
+
next if strings_entry.nil?
|
207
|
+
|
208
|
+
# then load the strings
|
209
|
+
strings_entry.stage!
|
210
|
+
next if !File.exist?(strings_entry.staging_path)
|
211
|
+
strings_hash = YAML.load(File.read(strings_entry.staging_path))
|
212
|
+
next if strings_hash.nil? # could not load...
|
213
|
+
|
214
|
+
# if strings loaded, merge into ret...
|
215
|
+
ret = ret.merge(strings_hash)
|
216
|
+
end
|
217
|
+
|
218
|
+
# save in cache.
|
219
|
+
@strings_hashes[for_language] = ret
|
220
|
+
return ret # done!
|
221
|
+
end
|
222
|
+
|
223
|
+
# Find all of the combined entries.
|
224
|
+
def combined_entries(t, opts, entry_name, packed_entry_name=nil, &block)
|
225
|
+
|
226
|
+
# choose manifest variant. default to current manifest variant
|
227
|
+
# if no explicit language was passed.
|
228
|
+
v = opts[:language] ? { :language => opts[:language] } : manifest.variation
|
229
|
+
|
230
|
+
# choose which targets to include packed and unpacked
|
231
|
+
targets = expand_required_targets(t)
|
232
|
+
if t.config.use_packed && packed_entry_name # must pass to activate
|
233
|
+
packed, unpacked = SC::Helpers::PackedOptimizer.optimize(targets)
|
234
|
+
unpacked << t # always use unpacked for main target
|
235
|
+
else
|
236
|
+
packed = []
|
237
|
+
unpacked = targets + [t] # always use unpacked
|
238
|
+
end
|
239
|
+
|
240
|
+
# deal with packed targets...
|
241
|
+
packed.each do |t|
|
242
|
+
# get the manifest for the target
|
243
|
+
cur_manifest = t.manifest_for(v).build!
|
244
|
+
|
245
|
+
# get the stylesheet or js entry for it...
|
246
|
+
entry = cur_manifest.entry_for packed_entry_name
|
247
|
+
next if entry.nil? || !entry.composite? # no stylesheet or js
|
248
|
+
|
249
|
+
yield(t, entry)
|
250
|
+
end
|
251
|
+
|
252
|
+
unpacked.each do |t|
|
253
|
+
# get the manifest for the target
|
254
|
+
cur_manifest = t.manifest_for(v).build!
|
255
|
+
|
256
|
+
# get the stylesheet or js entry for it...
|
257
|
+
entry = cur_manifest.entry_for entry_name
|
258
|
+
next if entry.nil? || !entry.composite? # no stylesheet or js
|
259
|
+
|
260
|
+
yield(t, entry)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
|
265
|
+
end
|
266
|
+
|
267
|
+
end
|
268
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# ===========================================================================
|
2
|
+
# Project: Abbot - SproutCore Build Tools
|
3
|
+
# Copyright: ©2009 Apple, Inc.
|
4
|
+
# portions copyright @2006-2009 Sprout Systems, Inc.
|
5
|
+
# and contributors
|
6
|
+
# ===========================================================================
|
7
|
+
|
8
|
+
require 'cgi'
|
9
|
+
require 'erb'
|
10
|
+
|
11
|
+
# Borrowed from Rails 2.0.2
|
12
|
+
|
13
|
+
module SC
|
14
|
+
module Helpers #:nodoc:
|
15
|
+
# Use these methods to generate HTML tags programmatically when you can't use
|
16
|
+
# a Builder. By default, they output XHTML compliant tags.
|
17
|
+
module TagHelper
|
18
|
+
include ERB::Util
|
19
|
+
|
20
|
+
# Returns an empty HTML tag of type +name+ which by default is XHTML
|
21
|
+
# compliant. Setting +open+ to true will create an open tag compatible
|
22
|
+
# with HTML 4.0 and below. Add HTML attributes by passing an attributes
|
23
|
+
# hash to +options+. For attributes with no value like (disabled and
|
24
|
+
# readonly), give it a value of true in the +options+ hash. You can use
|
25
|
+
# symbols or strings for the attribute names.
|
26
|
+
#
|
27
|
+
# tag("br")
|
28
|
+
# # => <br />
|
29
|
+
# tag("br", nil, true)
|
30
|
+
# # => <br>
|
31
|
+
# tag("input", { :type => 'text', :disabled => true })
|
32
|
+
# # => <input type="text" disabled="disabled" />
|
33
|
+
def tag(name, options = nil, open = false)
|
34
|
+
"<#{name}#{tag_options(options) if options}" + (open ? ">" : " />")
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns an HTML block tag of type +name+ surrounding the +content+. Add
|
38
|
+
# HTML attributes by passing an attributes hash to +options+. For attributes
|
39
|
+
# with no value like (disabled and readonly), give it a value of true in
|
40
|
+
# the +options+ hash. You can use symbols or strings for the attribute names.
|
41
|
+
#
|
42
|
+
# content_tag(:p, "Hello world!")
|
43
|
+
# # => <p>Hello world!</p>
|
44
|
+
# content_tag(:div, content_tag(:p, "Hello world!"), :class => "strong")
|
45
|
+
# # => <div class="strong"><p>Hello world!</p></div>
|
46
|
+
# content_tag("select", options, :multiple => true)
|
47
|
+
# # => <select multiple="multiple">...options...</select>
|
48
|
+
#
|
49
|
+
# Instead of passing the content as an argument, you can also use a block
|
50
|
+
# in which case, you pass your +options+ as the second parameter.
|
51
|
+
#
|
52
|
+
# <% content_tag :div, :class => "strong" do -%>
|
53
|
+
# Hello world!
|
54
|
+
# <% end -%>
|
55
|
+
# # => <div class="strong"><p>Hello world!</p></div>
|
56
|
+
def content_tag(name, content_or_options_with_block = nil, options = nil, &block)
|
57
|
+
if block_given?
|
58
|
+
options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
|
59
|
+
content = capture(&block)
|
60
|
+
content_tag = content_tag_string(name, content, options)
|
61
|
+
block_is_within_action_view?(block) ? concat(content_tag, block.binding) : content_tag
|
62
|
+
else
|
63
|
+
content = content_or_options_with_block
|
64
|
+
content_tag_string(name, content, options)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns a CDATA section with the given +content+. CDATA sections
|
69
|
+
# are used to escape blocks of text containing characters which would
|
70
|
+
# otherwise be recognized as markup. CDATA sections begin with the string
|
71
|
+
# <tt><![CDATA[</tt> and end with (and may not contain) the string <tt>]]></tt>.
|
72
|
+
#
|
73
|
+
# cdata_section("<hello world>")
|
74
|
+
# # => <![CDATA[<hello world>]]>
|
75
|
+
def cdata_section(content)
|
76
|
+
"<![CDATA[#{content}]]>"
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns the escaped +html+ without affecting existing escaped entities.
|
80
|
+
#
|
81
|
+
# escape_once("1 > 2 & 3")
|
82
|
+
# # => "1 < 2 & 3"
|
83
|
+
def escape_once(html)
|
84
|
+
fix_double_escape(html_escape(html.to_s))
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
def content_tag_string(name, content, options)
|
89
|
+
tag_options = options ? tag_options(options) : ""
|
90
|
+
"<#{name}#{tag_options}>#{content}</#{name}>"
|
91
|
+
end
|
92
|
+
|
93
|
+
def tag_options(options)
|
94
|
+
cleaned_options = convert_booleans(options.stringify_keys.reject {|key, value| value.nil?})
|
95
|
+
' ' + cleaned_options.map {|key, value| %(#{key}="#{escape_once(value)}")}.sort * ' ' unless cleaned_options.empty?
|
96
|
+
end
|
97
|
+
|
98
|
+
def convert_booleans(options)
|
99
|
+
%w( disabled readonly multiple ).each { |a| boolean_attribute(options, a) }
|
100
|
+
options
|
101
|
+
end
|
102
|
+
|
103
|
+
def boolean_attribute(options, attribute)
|
104
|
+
options[attribute] ? options[attribute] = attribute : options.delete(attribute)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Fix double-escaped entities, such as &amp;, &#123;, etc.
|
108
|
+
def fix_double_escape(escaped)
|
109
|
+
escaped.gsub(/&([a-z]+|(#\d+));/i) { "&#{$1};" }
|
110
|
+
end
|
111
|
+
|
112
|
+
def block_is_within_action_view?(block)
|
113
|
+
eval("defined? _erbout", block.binding)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,303 @@
|
|
1
|
+
# ===========================================================================
|
2
|
+
# Project: Abbot - SproutCore Build Tools
|
3
|
+
# Copyright: ©2009 Apple, Inc.
|
4
|
+
# portions copyright @2006-2009 Sprout Systems, Inc.
|
5
|
+
# and contributors
|
6
|
+
# ===========================================================================
|
7
|
+
|
8
|
+
require File.join(SC::LIBPATH, 'sproutcore', 'helpers', 'tag_helper')
|
9
|
+
#require 'html/document'
|
10
|
+
|
11
|
+
# Borrowed from Rails 2.0.2
|
12
|
+
|
13
|
+
module SC
|
14
|
+
module Helpers #:nodoc:
|
15
|
+
# The TextHelper Module provides a set of methods for filtering, formatting
|
16
|
+
# and transforming strings that can reduce the amount of inline Ruby code in
|
17
|
+
# your views. These helper methods extend ActionView making them callable
|
18
|
+
# within your template files as shown in the following example which truncates
|
19
|
+
# the title of each post to 10 characters.
|
20
|
+
#
|
21
|
+
# <% @posts.each do |post| %>
|
22
|
+
# # post == 'This is my title'
|
23
|
+
# Title: <%= truncate(post.title, 10) %>
|
24
|
+
# <% end %>
|
25
|
+
# => Title: This is my...
|
26
|
+
module TextHelper
|
27
|
+
# The preferred method of outputting text in your views is to use the
|
28
|
+
# <%= "text" %> eRuby syntax. The regular _puts_ and _print_ methods
|
29
|
+
# do not operate as expected in an eRuby code block. If you absolutely must
|
30
|
+
# output text within a code block, you can use the concat method.
|
31
|
+
#
|
32
|
+
# <% concat "hello", binding %>
|
33
|
+
# is equivalent to using:
|
34
|
+
# <%= "hello" %>
|
35
|
+
def concat(string, binding)
|
36
|
+
renderer.concat(string, binding)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Highlights one or more +phrases+ everywhere in +text+ by inserting it into
|
40
|
+
# a +highlighter+ string. The highlighter can be specialized by passing +highlighter+
|
41
|
+
# as a single-quoted string with \1 where the phrase is to be inserted.
|
42
|
+
#
|
43
|
+
# highlight('You searched for: rails', 'rails')
|
44
|
+
# # => You searched for: <strong class="highlight">rails</strong>
|
45
|
+
#
|
46
|
+
# highlight('You searched for: rails', ['for', 'rails'], '<em>\1</em>')
|
47
|
+
# # => You searched <em>for</em>: <em>rails</em>
|
48
|
+
def highlight(text, phrases, highlighter = '<strong class="highlight">\1</strong>')
|
49
|
+
if text.blank? || phrases.blank?
|
50
|
+
text
|
51
|
+
else
|
52
|
+
match = Array(phrases).map { |p| Regexp.escape(p) }.join('|')
|
53
|
+
text.gsub(/(#{match})/i, highlighter)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Attempts to pluralize the +singular+ word unless +count+ is 1. If +plural+
|
58
|
+
# is supplied, it will use that when count is > 1, if the ActiveSupport Inflector
|
59
|
+
# is loaded, it will use the Inflector to determine the plural form, otherwise
|
60
|
+
# it will just add an 's' to the +singular+ word.
|
61
|
+
#
|
62
|
+
# pluralize(1, 'person') => 1 person
|
63
|
+
# pluralize(2, 'person') => 2 people
|
64
|
+
# pluralize(3, 'person', 'users') => 3 users
|
65
|
+
def pluralize(count, singular, plural = nil)
|
66
|
+
"#{count || 0} " + if count == 1 || count == '1'
|
67
|
+
singular
|
68
|
+
elsif plural
|
69
|
+
plural
|
70
|
+
else
|
71
|
+
singular.plural
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
begin
|
76
|
+
unless Object.const_defined?(:RedCloth)
|
77
|
+
gem "RedCloth"
|
78
|
+
require 'redcloth'
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns the text with all the Textile codes turned into HTML tags.
|
82
|
+
# <i>This method is only available if RedCloth[http://whytheluckystiff.net/ruby/redcloth/]
|
83
|
+
# is available</i>.
|
84
|
+
def textilize(text)
|
85
|
+
if text.blank?
|
86
|
+
""
|
87
|
+
else
|
88
|
+
textilized = RedCloth.new(text, [ :hard_breaks ])
|
89
|
+
textilized.hard_breaks = true if textilized.respond_to?("hard_breaks=")
|
90
|
+
textilized.to_html
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns the text with all the Textile codes turned into HTML tags,
|
95
|
+
# but without the bounding <p> tag that RedCloth adds.
|
96
|
+
# <i>This method is only available if RedCloth[http://whytheluckystiff.net/ruby/redcloth/]
|
97
|
+
# is available</i>.
|
98
|
+
def textilize_without_paragraph(text)
|
99
|
+
textiled = textilize(text)
|
100
|
+
if textiled[0..2] == "<p>" then textiled = textiled[3..-1] end
|
101
|
+
if textiled[-4..-1] == "</p>" then textiled = textiled[0..-5] end
|
102
|
+
return textiled
|
103
|
+
end
|
104
|
+
rescue LoadError
|
105
|
+
# We can't really help what's not there
|
106
|
+
end
|
107
|
+
|
108
|
+
begin
|
109
|
+
unless Object.const_defined?(:BlueCloth)
|
110
|
+
begin
|
111
|
+
require 'bluecloth'
|
112
|
+
rescue
|
113
|
+
gem 'bluecloth'
|
114
|
+
require 'bluecloth'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns the text with all the Markdown codes turned into HTML tags.
|
119
|
+
# <i>This method is only available if BlueCloth[http://www.deveiate.org/projects/BlueCloth]
|
120
|
+
# is available</i>.
|
121
|
+
def markdown(text)
|
122
|
+
text.blank? ? "" : BlueCloth.new(text).to_html
|
123
|
+
end
|
124
|
+
rescue LoadError
|
125
|
+
# We can't really help what's not there
|
126
|
+
end
|
127
|
+
|
128
|
+
# Returns +text+ transformed into HTML using simple formatting rules.
|
129
|
+
# Two or more consecutive newlines(<tt>\n\n</tt>) are considered as a
|
130
|
+
# paragraph and wrapped in <tt><p></tt> tags. One newline (<tt>\n</tt>) is
|
131
|
+
# considered as a linebreak and a <tt><br /></tt> tag is appended. This
|
132
|
+
# method does not remove the newlines from the +text+.
|
133
|
+
def simple_format(text)
|
134
|
+
content_tag 'p', text.to_s.
|
135
|
+
gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
|
136
|
+
gsub(/\n\n+/, "</p>\n\n<p>"). # 2+ newline -> paragraph
|
137
|
+
gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
|
138
|
+
end
|
139
|
+
|
140
|
+
# Turns all urls and email addresses into clickable links. The +link+ parameter
|
141
|
+
# will limit what should be linked. You can add html attributes to the links using
|
142
|
+
# +href_options+. Options for +link+ are <tt>:all</tt> (default),
|
143
|
+
# <tt>:email_addresses</tt>, and <tt>:urls</tt>.
|
144
|
+
#
|
145
|
+
# auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com") =>
|
146
|
+
# Go to <a href="http://www.rubyonrails.org">http://www.rubyonrails.org</a> and
|
147
|
+
# say hello to <a href="mailto:david@loudthinking.com">david@loudthinking.com</a>
|
148
|
+
#
|
149
|
+
# If a block is given, each url and email address is yielded and the
|
150
|
+
# result is used as the link text.
|
151
|
+
#
|
152
|
+
# auto_link(post.body, :all, :target => '_blank') do |text|
|
153
|
+
# truncate(text, 15)
|
154
|
+
# end
|
155
|
+
def auto_link(text, link = :all, href_options = {}, &block)
|
156
|
+
return '' if text.blank?
|
157
|
+
case link
|
158
|
+
when :all then auto_link_urls(auto_link_email_addresses(text, &block), href_options, &block)
|
159
|
+
when :email_addresses then auto_link_email_addresses(text, &block)
|
160
|
+
when :urls then auto_link_urls(text, href_options, &block)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# Strips link tags from +text+ leaving just the link label.
|
165
|
+
#
|
166
|
+
# strip_links('<a href="http://www.rubyonrails.org">Ruby on Rails</a>')
|
167
|
+
# => Ruby on Rails
|
168
|
+
def strip_links(text)
|
169
|
+
text.gsub(/<a\b.*?>(.*?)<\/a>/mi, '\1')
|
170
|
+
end
|
171
|
+
|
172
|
+
# Creates a Cycle object whose _to_s_ method cycles through elements of an
|
173
|
+
# array every time it is called. This can be used for example, to alternate
|
174
|
+
# classes for table rows:
|
175
|
+
#
|
176
|
+
# <% @items.each do |item| %>
|
177
|
+
# <tr class="<%= cycle("even", "odd") -%>">
|
178
|
+
# <td>item</td>
|
179
|
+
# </tr>
|
180
|
+
# <% end %>
|
181
|
+
#
|
182
|
+
# You can use named cycles to allow nesting in loops. Passing a Hash as
|
183
|
+
# the last parameter with a <tt>:name</tt> key will create a named cycle.
|
184
|
+
# You can manually reset a cycle by calling reset_cycle and passing the
|
185
|
+
# name of the cycle.
|
186
|
+
#
|
187
|
+
# <% @items.each do |item| %>
|
188
|
+
# <tr class="<%= cycle("even", "odd", :name => "row_class")
|
189
|
+
# <td>
|
190
|
+
# <% item.values.each do |value| %>
|
191
|
+
# <span style="color:<%= cycle("red", "green", "blue", :name => "colors") -%>">
|
192
|
+
# value
|
193
|
+
# </span>
|
194
|
+
# <% end %>
|
195
|
+
# <% reset_cycle("colors") %>
|
196
|
+
# </td>
|
197
|
+
# </tr>
|
198
|
+
# <% end %>
|
199
|
+
def cycle(first_value, *values)
|
200
|
+
if (values.last.instance_of? Hash)
|
201
|
+
params = values.pop
|
202
|
+
name = params[:name]
|
203
|
+
else
|
204
|
+
name = "default"
|
205
|
+
end
|
206
|
+
values.unshift(first_value)
|
207
|
+
|
208
|
+
cycle = get_cycle(name)
|
209
|
+
if (cycle.nil? || cycle.values != values)
|
210
|
+
cycle = set_cycle(name, Cycle.new(*values))
|
211
|
+
end
|
212
|
+
return cycle.to_s
|
213
|
+
end
|
214
|
+
|
215
|
+
# Resets a cycle so that it starts from the first element the next time
|
216
|
+
# it is called. Pass in +name+ to reset a named cycle.
|
217
|
+
def reset_cycle(name = "default")
|
218
|
+
cycle = get_cycle(name)
|
219
|
+
cycle.reset unless cycle.nil?
|
220
|
+
end
|
221
|
+
|
222
|
+
class Cycle #:nodoc:
|
223
|
+
attr_reader :values
|
224
|
+
|
225
|
+
def initialize(first_value, *values)
|
226
|
+
@values = values.unshift(first_value)
|
227
|
+
reset
|
228
|
+
end
|
229
|
+
|
230
|
+
def reset
|
231
|
+
@index = 0
|
232
|
+
end
|
233
|
+
|
234
|
+
def to_s
|
235
|
+
value = @values[@index].to_s
|
236
|
+
@index = (@index + 1) % @values.size
|
237
|
+
return value
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
private
|
242
|
+
# The cycle helpers need to store the cycles in a place that is
|
243
|
+
# guaranteed to be reset every time a page is rendered, so it
|
244
|
+
# uses an instance variable of ActionView::Base.
|
245
|
+
def get_cycle(name)
|
246
|
+
@_cycles = Hash.new unless defined?(@_cycles)
|
247
|
+
return @_cycles[name]
|
248
|
+
end
|
249
|
+
|
250
|
+
def set_cycle(name, cycle_object)
|
251
|
+
@_cycles = Hash.new unless defined?(@_cycles)
|
252
|
+
@_cycles[name] = cycle_object
|
253
|
+
end
|
254
|
+
|
255
|
+
AUTO_LINK_RE = %r{
|
256
|
+
( # leading text
|
257
|
+
<\w+.*?>| # leading HTML tag, or
|
258
|
+
[^=!:'"/]| # leading punctuation, or
|
259
|
+
^ # beginning of line
|
260
|
+
)
|
261
|
+
(
|
262
|
+
(?:https?://)| # protocol spec, or
|
263
|
+
(?:www\.) # www.*
|
264
|
+
)
|
265
|
+
(
|
266
|
+
[-\w]+ # subdomain or domain
|
267
|
+
(?:\.[-\w]+)* # remaining subdomains or domain
|
268
|
+
(?::\d+)? # port
|
269
|
+
(?:/(?:(?:[~\w\+%-]|(?:[,.;:][^\s$]))+)?)* # path
|
270
|
+
(?:\?[\w\+%&=.;-]+)? # query string
|
271
|
+
(?:\#[\w\-]*)? # trailing anchor
|
272
|
+
)
|
273
|
+
([[:punct:]]|\s|<|$) # trailing text
|
274
|
+
}x unless const_defined?(:AUTO_LINK_RE)
|
275
|
+
|
276
|
+
# Turns all urls into clickable links. If a block is given, each url
|
277
|
+
# is yielded and the result is used as the link text.
|
278
|
+
def auto_link_urls(text, href_options = {})
|
279
|
+
extra_options = tag_options(href_options.stringify_keys) || ""
|
280
|
+
text.gsub(AUTO_LINK_RE) do
|
281
|
+
all, a, b, c, d = $&, $1, $2, $3, $4
|
282
|
+
if a =~ /<a\s/i # don't replace URL's that are already linked
|
283
|
+
all
|
284
|
+
else
|
285
|
+
text = b + c
|
286
|
+
text = yield(text) if block_given?
|
287
|
+
%(#{a}<a href="#{b=="www."?"http://www.":b}#{c}"#{extra_options}>#{text}</a>#{d})
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
# Turns all email addresses into clickable links. If a block is given,
|
293
|
+
# each email is yielded and the result is used as the link text.
|
294
|
+
def auto_link_email_addresses(text)
|
295
|
+
text.gsub(/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do
|
296
|
+
text = $1
|
297
|
+
text = yield(text) if block_given?
|
298
|
+
%{<a href="mailto:#{$1}">#{text}</a>}
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|