yard 0.9.16 → 0.9.17
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of yard might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.yardopts +26 -26
- data/CHANGELOG.md +728 -728
- data/LEGAL +66 -66
- data/LICENSE +22 -22
- data/README.md +328 -328
- data/Rakefile +53 -47
- data/benchmarks/builtins_vs_eval.rb +24 -24
- data/benchmarks/concat_vs_join.rb +13 -13
- data/benchmarks/erb_vs_erubis.rb +54 -54
- data/benchmarks/format_args.rb +47 -47
- data/benchmarks/generation.rb +38 -38
- data/benchmarks/marshal_vs_dbm.rb +64 -64
- data/benchmarks/parsing.rb +46 -46
- data/benchmarks/pathname_vs_string.rb +50 -50
- data/benchmarks/rdoc_vs_yardoc.rb +11 -11
- data/benchmarks/registry_store_types.rb +49 -49
- data/benchmarks/ri_vs_yri.rb +19 -19
- data/benchmarks/ripper_parser.rb +13 -13
- data/benchmarks/splat_vs_flatten.rb +13 -13
- data/benchmarks/template_erb.rb +23 -23
- data/benchmarks/template_format.rb +7 -7
- data/benchmarks/template_profile.rb +18 -18
- data/benchmarks/yri_cache.rb +20 -20
- data/bin/yard +13 -13
- data/bin/yardoc +13 -13
- data/bin/yri +13 -13
- data/docs/CodeObjects.md +115 -115
- data/docs/GettingStarted.md +679 -679
- data/docs/Handlers.md +152 -152
- data/docs/Overview.md +61 -61
- data/docs/Parser.md +191 -191
- data/docs/Tags.md +283 -283
- data/docs/TagsArch.md +123 -123
- data/docs/Templates.md +496 -496
- data/docs/WhatsNew.md +1245 -1245
- data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
- data/docs/templates/default/fulldoc/html/setup.rb +6 -6
- data/docs/templates/default/layout/html/setup.rb +9 -9
- data/docs/templates/default/layout/html/tag_list.erb +11 -11
- data/docs/templates/default/yard_tags/html/list.erb +18 -18
- data/docs/templates/default/yard_tags/html/setup.rb +26 -26
- data/docs/templates/plugin.rb +70 -70
- data/lib/rubygems_plugin.rb +9 -9
- data/lib/yard.rb +69 -69
- data/lib/yard/autoload.rb +303 -303
- data/lib/yard/cli/command.rb +85 -85
- data/lib/yard/cli/command_parser.rb +93 -93
- data/lib/yard/cli/config.rb +198 -198
- data/lib/yard/cli/diff.rb +270 -270
- data/lib/yard/cli/display.rb +69 -69
- data/lib/yard/cli/gems.rb +84 -84
- data/lib/yard/cli/graph.rb +125 -125
- data/lib/yard/cli/help.rb +20 -20
- data/lib/yard/cli/i18n.rb +70 -70
- data/lib/yard/cli/list.rb +23 -23
- data/lib/yard/cli/markup_types.rb +32 -32
- data/lib/yard/cli/server.rb +257 -257
- data/lib/yard/cli/stats.rb +231 -231
- data/lib/yard/cli/yardoc.rb +788 -788
- data/lib/yard/cli/yardopts_command.rb +110 -110
- data/lib/yard/cli/yri.rb +215 -215
- data/lib/yard/code_objects/base.rb +615 -610
- data/lib/yard/code_objects/class_object.rb +146 -146
- data/lib/yard/code_objects/class_variable_object.rb +11 -11
- data/lib/yard/code_objects/constant_object.rb +16 -16
- data/lib/yard/code_objects/extended_method_object.rb +24 -24
- data/lib/yard/code_objects/extra_file_object.rb +131 -131
- data/lib/yard/code_objects/macro_object.rb +172 -172
- data/lib/yard/code_objects/method_object.rb +196 -196
- data/lib/yard/code_objects/module_object.rb +21 -21
- data/lib/yard/code_objects/namespace_mapper.rb +114 -114
- data/lib/yard/code_objects/namespace_object.rb +200 -200
- data/lib/yard/code_objects/proxy.rb +240 -240
- data/lib/yard/code_objects/root_object.rb +19 -19
- data/lib/yard/config.rb +270 -270
- data/lib/yard/core_ext/array.rb +16 -16
- data/lib/yard/core_ext/file.rb +69 -69
- data/lib/yard/core_ext/hash.rb +16 -16
- data/lib/yard/core_ext/insertion.rb +63 -63
- data/lib/yard/core_ext/module.rb +20 -20
- data/lib/yard/core_ext/string.rb +68 -68
- data/lib/yard/core_ext/symbol_hash.rb +75 -75
- data/lib/yard/docstring.rb +386 -378
- data/lib/yard/docstring_parser.rb +345 -345
- data/lib/yard/gem_index.rb +29 -29
- data/lib/yard/globals.rb +22 -22
- data/lib/yard/handlers/base.rb +595 -595
- data/lib/yard/handlers/c/alias_handler.rb +16 -16
- data/lib/yard/handlers/c/attribute_handler.rb +13 -13
- data/lib/yard/handlers/c/base.rb +129 -129
- data/lib/yard/handlers/c/class_handler.rb +27 -27
- data/lib/yard/handlers/c/constant_handler.rb +13 -13
- data/lib/yard/handlers/c/handler_methods.rb +211 -211
- data/lib/yard/handlers/c/init_handler.rb +20 -20
- data/lib/yard/handlers/c/method_handler.rb +45 -36
- data/lib/yard/handlers/c/mixin_handler.rb +21 -21
- data/lib/yard/handlers/c/module_handler.rb +17 -17
- data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
- data/lib/yard/handlers/c/path_handler.rb +11 -11
- data/lib/yard/handlers/c/struct_handler.rb +13 -13
- data/lib/yard/handlers/c/symbol_handler.rb +8 -8
- data/lib/yard/handlers/processor.rb +200 -200
- data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
- data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
- data/lib/yard/handlers/ruby/base.rb +165 -165
- data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
- data/lib/yard/handlers/ruby/class_handler.rb +119 -119
- data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
- data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
- data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
- data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
- data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
- data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -95
- data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
- data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
- data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
- data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
- data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
- data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
- data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
- data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
- data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
- data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
- data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
- data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
- data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
- data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
- data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
- data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
- data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
- data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
- data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
- data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
- data/lib/yard/handlers/ruby/method_handler.rb +118 -118
- data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
- data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
- data/lib/yard/handlers/ruby/module_handler.rb +12 -12
- data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
- data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
- data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
- data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
- data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
- data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
- data/lib/yard/i18n/locale.rb +67 -67
- data/lib/yard/i18n/message.rb +57 -57
- data/lib/yard/i18n/messages.rb +56 -56
- data/lib/yard/i18n/po_parser.rb +61 -61
- data/lib/yard/i18n/pot_generator.rb +290 -290
- data/lib/yard/i18n/text.rb +173 -173
- data/lib/yard/logging.rb +205 -205
- data/lib/yard/options.rb +217 -217
- data/lib/yard/parser/base.rb +57 -57
- data/lib/yard/parser/c/c_parser.rb +235 -235
- data/lib/yard/parser/c/comment_parser.rb +134 -134
- data/lib/yard/parser/c/statement.rb +64 -64
- data/lib/yard/parser/ruby/ast_node.rb +540 -540
- data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
- data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
- data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
- data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
- data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
- data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
- data/lib/yard/parser/ruby/token_resolver.rb +156 -156
- data/lib/yard/parser/source_parser.rb +526 -526
- data/lib/yard/rake/yardoc_task.rb +81 -81
- data/lib/yard/registry.rb +439 -439
- data/lib/yard/registry_resolver.rb +189 -189
- data/lib/yard/registry_store.rb +337 -337
- data/lib/yard/rubygems/backports.rb +10 -10
- data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
- data/lib/yard/rubygems/backports/MIT.txt +20 -20
- data/lib/yard/rubygems/backports/gem.rb +10 -10
- data/lib/yard/rubygems/backports/source_index.rb +365 -365
- data/lib/yard/rubygems/doc_manager.rb +90 -90
- data/lib/yard/rubygems/hook.rb +197 -197
- data/lib/yard/rubygems/specification.rb +50 -50
- data/lib/yard/serializers/base.rb +83 -83
- data/lib/yard/serializers/file_system_serializer.rb +123 -123
- data/lib/yard/serializers/process_serializer.rb +24 -24
- data/lib/yard/serializers/stdout_serializer.rb +34 -34
- data/lib/yard/serializers/yardoc_serializer.rb +152 -152
- data/lib/yard/server.rb +13 -13
- data/lib/yard/server/adapter.rb +100 -100
- data/lib/yard/server/commands/base.rb +209 -209
- data/lib/yard/server/commands/display_file_command.rb +29 -29
- data/lib/yard/server/commands/display_object_command.rb +65 -65
- data/lib/yard/server/commands/frames_command.rb +16 -16
- data/lib/yard/server/commands/library_command.rb +187 -187
- data/lib/yard/server/commands/library_index_command.rb +28 -28
- data/lib/yard/server/commands/list_command.rb +25 -25
- data/lib/yard/server/commands/root_request_command.rb +15 -15
- data/lib/yard/server/commands/search_command.rb +79 -79
- data/lib/yard/server/commands/static_file_command.rb +23 -23
- data/lib/yard/server/commands/static_file_helpers.rb +62 -62
- data/lib/yard/server/doc_server_helper.rb +91 -91
- data/lib/yard/server/doc_server_serializer.rb +39 -39
- data/lib/yard/server/library_version.rb +277 -277
- data/lib/yard/server/rack_adapter.rb +89 -89
- data/lib/yard/server/router.rb +187 -187
- data/lib/yard/server/static_caching.rb +46 -46
- data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
- data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
- data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
- data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
- data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
- data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
- data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
- data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
- data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
- data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
- data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
- data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
- data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
- data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
- data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
- data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
- data/lib/yard/server/webrick_adapter.rb +45 -45
- data/lib/yard/tags/default_factory.rb +191 -191
- data/lib/yard/tags/default_tag.rb +13 -13
- data/lib/yard/tags/directives.rb +616 -616
- data/lib/yard/tags/library.rb +633 -633
- data/lib/yard/tags/option_tag.rb +13 -13
- data/lib/yard/tags/overload_tag.rb +71 -71
- data/lib/yard/tags/ref_tag.rb +8 -8
- data/lib/yard/tags/ref_tag_list.rb +28 -28
- data/lib/yard/tags/tag.rb +71 -71
- data/lib/yard/tags/tag_format_error.rb +7 -7
- data/lib/yard/tags/types_explainer.rb +162 -162
- data/lib/yard/templates/engine.rb +186 -186
- data/lib/yard/templates/erb_cache.rb +23 -23
- data/lib/yard/templates/helpers/base_helper.rb +215 -215
- data/lib/yard/templates/helpers/filter_helper.rb +27 -27
- data/lib/yard/templates/helpers/html_helper.rb +646 -642
- data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
- data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
- data/lib/yard/templates/helpers/markup_helper.rb +172 -172
- data/lib/yard/templates/helpers/method_helper.rb +75 -75
- data/lib/yard/templates/helpers/module_helper.rb +21 -21
- data/lib/yard/templates/helpers/text_helper.rb +112 -112
- data/lib/yard/templates/helpers/uml_helper.rb +47 -47
- data/lib/yard/templates/section.rb +105 -105
- data/lib/yard/templates/template.rb +418 -418
- data/lib/yard/templates/template_options.rb +92 -92
- data/lib/yard/verifier.rb +151 -151
- data/lib/yard/version.rb +3 -1
- data/spec/cli/command_parser_spec.rb +43 -43
- data/spec/cli/command_spec.rb +36 -36
- data/spec/cli/config_spec.rb +148 -148
- data/spec/cli/diff_spec.rb +254 -254
- data/spec/cli/display_spec.rb +30 -30
- data/spec/cli/gems_spec.rb +81 -81
- data/spec/cli/graph_spec.rb +18 -18
- data/spec/cli/help_spec.rb +22 -22
- data/spec/cli/i18n_spec.rb +107 -107
- data/spec/cli/list_spec.rb +8 -8
- data/spec/cli/markup_types_spec.rb +22 -22
- data/spec/cli/server_spec.rb +324 -324
- data/spec/cli/stats_spec.rb +96 -96
- data/spec/cli/yard_on_yard_spec.rb +38 -38
- data/spec/cli/yardoc_spec.rb +862 -849
- data/spec/cli/yri_spec.rb +101 -101
- data/spec/code_objects/base_spec.rb +470 -460
- data/spec/code_objects/class_object_spec.rb +226 -226
- data/spec/code_objects/code_object_list_spec.rb +36 -36
- data/spec/code_objects/constants_spec.rb +116 -116
- data/spec/code_objects/extra_file_object_spec.rb +160 -160
- data/spec/code_objects/macro_object_spec.rb +150 -150
- data/spec/code_objects/method_object_spec.rb +184 -184
- data/spec/code_objects/module_object_spec.rb +142 -142
- data/spec/code_objects/namespace_object_spec.rb +171 -171
- data/spec/code_objects/proxy_spec.rb +141 -141
- data/spec/code_objects/spec_helper.rb +3 -3
- data/spec/config_spec.rb +171 -171
- data/spec/core_ext/array_spec.rb +13 -13
- data/spec/core_ext/file_spec.rb +72 -72
- data/spec/core_ext/hash_spec.rb +14 -14
- data/spec/core_ext/insertion_spec.rb +37 -37
- data/spec/core_ext/module_spec.rb +15 -15
- data/spec/core_ext/string_spec.rb +42 -42
- data/spec/core_ext/symbol_hash_spec.rb +89 -89
- data/spec/docstring_parser_spec.rb +280 -262
- data/spec/docstring_spec.rb +373 -364
- data/spec/examples.txt +1875 -1871
- data/spec/handlers/alias_handler_spec.rb +82 -82
- data/spec/handlers/attribute_handler_spec.rb +96 -96
- data/spec/handlers/base_spec.rb +216 -216
- data/spec/handlers/c/alias_handler_spec.rb +34 -34
- data/spec/handlers/c/attribute_handler_spec.rb +41 -41
- data/spec/handlers/c/class_handler_spec.rb +78 -78
- data/spec/handlers/c/constant_handler_spec.rb +71 -71
- data/spec/handlers/c/init_handler_spec.rb +48 -48
- data/spec/handlers/c/method_handler_spec.rb +325 -325
- data/spec/handlers/c/mixin_handler_spec.rb +44 -44
- data/spec/handlers/c/module_handler_spec.rb +71 -71
- data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
- data/spec/handlers/c/path_handler_spec.rb +36 -36
- data/spec/handlers/c/spec_helper.rb +23 -23
- data/spec/handlers/c/struct_handler_spec.rb +16 -16
- data/spec/handlers/class_condition_handler_spec.rb +87 -87
- data/spec/handlers/class_handler_spec.rb +247 -247
- data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
- data/spec/handlers/class_variable_handler_spec.rb +12 -12
- data/spec/handlers/constant_handler_spec.rb +112 -112
- data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
- data/spec/handlers/dsl_handler_spec.rb +219 -219
- data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
- data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
- data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
- data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
- data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
- data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
- data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
- data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
- data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
- data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
- data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
- data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
- data/spec/handlers/exception_handler_spec.rb +49 -49
- data/spec/handlers/extend_handler_spec.rb +24 -24
- data/spec/handlers/legacy_base_spec.rb +128 -128
- data/spec/handlers/method_condition_handler_spec.rb +15 -15
- data/spec/handlers/method_handler_spec.rb +190 -190
- data/spec/handlers/mixin_handler_spec.rb +56 -56
- data/spec/handlers/module_function_handler_spec.rb +106 -106
- data/spec/handlers/module_handler_spec.rb +35 -35
- data/spec/handlers/private_class_method_handler_spec.rb +11 -11
- data/spec/handlers/private_constant_handler_spec.rb +25 -25
- data/spec/handlers/processor_spec.rb +35 -35
- data/spec/handlers/public_class_method_handler_spec.rb +11 -11
- data/spec/handlers/ruby/base_spec.rb +95 -95
- data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
- data/spec/handlers/spec_helper.rb +33 -33
- data/spec/handlers/visibility_handler_spec.rb +44 -44
- data/spec/handlers/yield_handler_spec.rb +52 -52
- data/spec/i18n/locale_spec.rb +81 -81
- data/spec/i18n/message_spec.rb +52 -52
- data/spec/i18n/messages_spec.rb +67 -67
- data/spec/i18n/pot_generator_spec.rb +295 -295
- data/spec/i18n/text_spec.rb +184 -184
- data/spec/logging_spec.rb +44 -44
- data/spec/options_spec.rb +171 -171
- data/spec/parser/base_spec.rb +24 -24
- data/spec/parser/c_parser_spec.rb +236 -223
- data/spec/parser/examples/array.c.txt +6267 -6267
- data/spec/parser/examples/example1.rb.txt +7 -7
- data/spec/parser/examples/extrafile.c.txt +8 -8
- data/spec/parser/examples/file.c.txt +28 -0
- data/spec/parser/examples/multifile.c.txt +22 -22
- data/spec/parser/examples/namespace.cpp.txt +68 -68
- data/spec/parser/examples/override.c.txt +424 -424
- data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
- data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
- data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
- data/spec/parser/ruby/ast_node_spec.rb +33 -33
- data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
- data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
- data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
- data/spec/parser/ruby/token_resolver_spec.rb +165 -165
- data/spec/parser/source_parser_spec.rb +727 -727
- data/spec/parser/tag_parsing_spec.rb +17 -17
- data/spec/rake/yardoc_task_spec.rb +118 -118
- data/spec/registry_spec.rb +463 -463
- data/spec/registry_store_spec.rb +316 -316
- data/spec/rubygems/doc_manager_spec.rb +112 -112
- data/spec/serializers/data/serialized_yardoc/checksums +1 -1
- data/spec/serializers/file_system_serializer_spec.rb +145 -145
- data/spec/serializers/spec_helper.rb +2 -2
- data/spec/serializers/yardoc_serializer_spec.rb +78 -78
- data/spec/server/adapter_spec.rb +39 -39
- data/spec/server/commands/base_spec.rb +91 -91
- data/spec/server/commands/library_command_spec.rb +39 -39
- data/spec/server/doc_server_helper_spec.rb +72 -72
- data/spec/server/doc_server_serializer_spec.rb +60 -60
- data/spec/server/rack_adapter_spec.rb +21 -21
- data/spec/server/router_spec.rb +123 -123
- data/spec/server/spec_helper.rb +22 -22
- data/spec/server/static_caching_spec.rb +47 -47
- data/spec/server/webrick_servlet_spec.rb +20 -20
- data/spec/server_spec.rb +19 -19
- data/spec/spec_helper.rb +212 -212
- data/spec/tags/default_factory_spec.rb +168 -168
- data/spec/tags/default_tag_spec.rb +11 -11
- data/spec/tags/directives_spec.rb +463 -463
- data/spec/tags/library_spec.rb +48 -48
- data/spec/tags/overload_tag_spec.rb +53 -53
- data/spec/tags/ref_tag_list_spec.rb +53 -53
- data/spec/tags/types_explainer_spec.rb +203 -203
- data/spec/templates/class_spec.rb +45 -45
- data/spec/templates/constant_spec.rb +41 -41
- data/spec/templates/engine_spec.rb +131 -131
- data/spec/templates/examples/class001.html +308 -308
- data/spec/templates/examples/class001.txt +36 -36
- data/spec/templates/examples/class002.html +39 -39
- data/spec/templates/examples/constant001.txt +24 -24
- data/spec/templates/examples/constant002.txt +6 -6
- data/spec/templates/examples/constant003.txt +10 -10
- data/spec/templates/examples/method001.html +137 -137
- data/spec/templates/examples/method001.txt +35 -35
- data/spec/templates/examples/method002.html +91 -91
- data/spec/templates/examples/method002.txt +20 -20
- data/spec/templates/examples/method003.html +165 -165
- data/spec/templates/examples/method003.txt +45 -45
- data/spec/templates/examples/method004.html +48 -48
- data/spec/templates/examples/method004.txt +10 -10
- data/spec/templates/examples/method005.html +105 -105
- data/spec/templates/examples/method005.txt +33 -33
- data/spec/templates/examples/method006.html +107 -107
- data/spec/templates/examples/method006.txt +20 -20
- data/spec/templates/examples/module001.dot +33 -33
- data/spec/templates/examples/module001.html +833 -833
- data/spec/templates/examples/module001.txt +33 -33
- data/spec/templates/examples/module002.html +341 -341
- data/spec/templates/examples/module003.html +202 -202
- data/spec/templates/examples/module004.html +394 -394
- data/spec/templates/examples/module005.html +81 -81
- data/spec/templates/examples/tag001.txt +82 -82
- data/spec/templates/helpers/base_helper_spec.rb +171 -171
- data/spec/templates/helpers/html_helper_spec.rb +668 -653
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
- data/spec/templates/helpers/markup_helper_spec.rb +136 -136
- data/spec/templates/helpers/method_helper_spec.rb +107 -107
- data/spec/templates/helpers/module_helper_spec.rb +35 -35
- data/spec/templates/helpers/shared_signature_examples.rb +126 -126
- data/spec/templates/helpers/text_helper_spec.rb +65 -65
- data/spec/templates/method_spec.rb +118 -118
- data/spec/templates/module_spec.rb +203 -203
- data/spec/templates/onefile_spec.rb +66 -66
- data/spec/templates/section_spec.rb +144 -144
- data/spec/templates/spec_helper.rb +76 -76
- data/spec/templates/tag_spec.rb +52 -52
- data/spec/templates/template_spec.rb +410 -410
- data/spec/verifier_spec.rb +106 -106
- data/templates/default/class/dot/setup.rb +7 -7
- data/templates/default/class/dot/superklass.erb +2 -2
- data/templates/default/class/html/constructor_details.erb +8 -8
- data/templates/default/class/html/setup.rb +2 -2
- data/templates/default/class/html/subclasses.erb +4 -4
- data/templates/default/class/setup.rb +36 -36
- data/templates/default/class/text/setup.rb +12 -12
- data/templates/default/class/text/subclasses.erb +5 -5
- data/templates/default/constant/text/header.erb +11 -11
- data/templates/default/constant/text/setup.rb +4 -4
- data/templates/default/docstring/html/abstract.erb +4 -4
- data/templates/default/docstring/html/deprecated.erb +1 -1
- data/templates/default/docstring/html/index.erb +5 -5
- data/templates/default/docstring/html/note.erb +6 -6
- data/templates/default/docstring/html/private.erb +4 -4
- data/templates/default/docstring/html/text.erb +1 -1
- data/templates/default/docstring/html/todo.erb +6 -6
- data/templates/default/docstring/setup.rb +52 -52
- data/templates/default/docstring/text/abstract.erb +2 -2
- data/templates/default/docstring/text/deprecated.erb +2 -2
- data/templates/default/docstring/text/index.erb +2 -2
- data/templates/default/docstring/text/note.erb +3 -3
- data/templates/default/docstring/text/private.erb +2 -2
- data/templates/default/docstring/text/text.erb +1 -1
- data/templates/default/docstring/text/todo.erb +3 -3
- data/templates/default/fulldoc/html/css/full_list.css +58 -58
- data/templates/default/fulldoc/html/css/style.css +496 -496
- data/templates/default/fulldoc/html/frames.erb +17 -17
- data/templates/default/fulldoc/html/full_list.erb +37 -37
- data/templates/default/fulldoc/html/full_list_class.erb +2 -2
- data/templates/default/fulldoc/html/full_list_file.erb +7 -7
- data/templates/default/fulldoc/html/full_list_method.erb +10 -10
- data/templates/default/fulldoc/html/js/app.js +292 -292
- data/templates/default/fulldoc/html/js/full_list.js +216 -216
- data/templates/default/fulldoc/html/js/jquery.js +3 -3
- data/templates/default/fulldoc/html/setup.rb +241 -241
- data/templates/default/layout/dot/header.erb +5 -5
- data/templates/default/layout/dot/setup.rb +15 -15
- data/templates/default/layout/html/breadcrumb.erb +11 -11
- data/templates/default/layout/html/files.erb +11 -11
- data/templates/default/layout/html/footer.erb +5 -5
- data/templates/default/layout/html/headers.erb +15 -15
- data/templates/default/layout/html/index.erb +2 -2
- data/templates/default/layout/html/layout.erb +23 -23
- data/templates/default/layout/html/listing.erb +4 -4
- data/templates/default/layout/html/objects.erb +32 -32
- data/templates/default/layout/html/script_setup.erb +4 -4
- data/templates/default/layout/html/search.erb +12 -12
- data/templates/default/layout/html/setup.rb +89 -89
- data/templates/default/method/html/header.erb +16 -16
- data/templates/default/method/setup.rb +4 -4
- data/templates/default/method_details/html/header.erb +2 -2
- data/templates/default/method_details/html/method_signature.erb +24 -24
- data/templates/default/method_details/html/source.erb +9 -9
- data/templates/default/method_details/setup.rb +11 -11
- data/templates/default/method_details/text/header.erb +10 -10
- data/templates/default/method_details/text/method_signature.erb +12 -12
- data/templates/default/method_details/text/setup.rb +11 -11
- data/templates/default/module/dot/child.erb +1 -1
- data/templates/default/module/dot/dependencies.erb +2 -2
- data/templates/default/module/dot/header.erb +6 -6
- data/templates/default/module/dot/info.erb +13 -13
- data/templates/default/module/dot/setup.rb +15 -15
- data/templates/default/module/html/attribute_details.erb +10 -10
- data/templates/default/module/html/attribute_summary.erb +8 -8
- data/templates/default/module/html/box_info.erb +43 -43
- data/templates/default/module/html/children.erb +8 -8
- data/templates/default/module/html/constant_summary.erb +17 -17
- data/templates/default/module/html/defines.erb +2 -2
- data/templates/default/module/html/header.erb +5 -5
- data/templates/default/module/html/inherited_attributes.erb +14 -14
- data/templates/default/module/html/inherited_constants.erb +8 -8
- data/templates/default/module/html/inherited_methods.erb +18 -18
- data/templates/default/module/html/item_summary.erb +40 -40
- data/templates/default/module/html/method_details_list.erb +9 -9
- data/templates/default/module/html/method_summary.erb +13 -13
- data/templates/default/module/html/methodmissing.erb +12 -12
- data/templates/default/module/setup.rb +167 -167
- data/templates/default/module/text/children.erb +9 -9
- data/templates/default/module/text/class_meths_list.erb +7 -7
- data/templates/default/module/text/extends.erb +7 -7
- data/templates/default/module/text/header.erb +7 -7
- data/templates/default/module/text/includes.erb +7 -7
- data/templates/default/module/text/instance_meths_list.erb +7 -7
- data/templates/default/module/text/setup.rb +13 -13
- data/templates/default/onefile/html/files.erb +4 -4
- data/templates/default/onefile/html/headers.erb +6 -6
- data/templates/default/onefile/html/layout.erb +17 -17
- data/templates/default/onefile/html/readme.erb +2 -2
- data/templates/default/onefile/html/setup.rb +62 -62
- data/templates/default/root/dot/child.erb +2 -2
- data/templates/default/root/dot/setup.rb +6 -6
- data/templates/default/root/html/setup.rb +2 -2
- data/templates/default/tags/html/example.erb +10 -10
- data/templates/default/tags/html/index.erb +2 -2
- data/templates/default/tags/html/option.erb +24 -24
- data/templates/default/tags/html/overload.erb +13 -13
- data/templates/default/tags/html/see.erb +7 -7
- data/templates/default/tags/html/tag.erb +20 -20
- data/templates/default/tags/setup.rb +57 -57
- data/templates/default/tags/text/example.erb +12 -12
- data/templates/default/tags/text/index.erb +1 -1
- data/templates/default/tags/text/option.erb +20 -20
- data/templates/default/tags/text/overload.erb +19 -19
- data/templates/default/tags/text/see.erb +11 -11
- data/templates/default/tags/text/tag.erb +13 -13
- data/templates/guide/class/html/setup.rb +2 -2
- data/templates/guide/docstring/html/setup.rb +2 -2
- data/templates/guide/fulldoc/html/css/style.css +108 -108
- data/templates/guide/fulldoc/html/js/app.js +33 -33
- data/templates/guide/fulldoc/html/setup.rb +74 -74
- data/templates/guide/layout/html/layout.erb +81 -81
- data/templates/guide/layout/html/setup.rb +25 -25
- data/templates/guide/method/html/header.erb +17 -17
- data/templates/guide/method/html/setup.rb +22 -22
- data/templates/guide/module/html/header.erb +6 -6
- data/templates/guide/module/html/method_list.erb +4 -4
- data/templates/guide/module/html/setup.rb +27 -27
- data/templates/guide/onefile/html/files.erb +4 -4
- data/templates/guide/onefile/html/setup.rb +6 -6
- data/templates/guide/onefile/html/toc.erb +3 -3
- data/templates/guide/tags/html/setup.rb +9 -9
- data/yard.gemspec +43 -43
- metadata +4 -4
@@ -1,105 +1,105 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module YARD
|
3
|
-
module Templates
|
4
|
-
# Abstracts the structure for a section and its subsections into an ordered
|
5
|
-
# list of sections and subsections.
|
6
|
-
# @since 0.6.0
|
7
|
-
class Section < Array
|
8
|
-
attr_accessor :name
|
9
|
-
|
10
|
-
def initialize(name, *args)
|
11
|
-
self.name = name
|
12
|
-
replace(parse_sections(args))
|
13
|
-
end
|
14
|
-
|
15
|
-
def dup
|
16
|
-
obj = super
|
17
|
-
obj.name = name
|
18
|
-
obj
|
19
|
-
end
|
20
|
-
|
21
|
-
def [](*args)
|
22
|
-
if args.first.is_a?(Range) || args.size > 1
|
23
|
-
obj = super(*args)
|
24
|
-
obj.name = name
|
25
|
-
return obj
|
26
|
-
elsif args.first.is_a?(Integer)
|
27
|
-
return super(*args)
|
28
|
-
end
|
29
|
-
find {|o| o.name == args.first }
|
30
|
-
end
|
31
|
-
|
32
|
-
def eql?(other)
|
33
|
-
super(other) && name == other.name
|
34
|
-
end
|
35
|
-
|
36
|
-
def ==(other)
|
37
|
-
case other
|
38
|
-
when Section
|
39
|
-
eql?(other)
|
40
|
-
when Array
|
41
|
-
to_a == other
|
42
|
-
else
|
43
|
-
name == other
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def push(*args)
|
48
|
-
super(*parse_sections(args))
|
49
|
-
end
|
50
|
-
alias << push
|
51
|
-
|
52
|
-
def unshift(*args)
|
53
|
-
super(*parse_sections(args))
|
54
|
-
end
|
55
|
-
|
56
|
-
def inspect
|
57
|
-
n = name.respond_to?(:path) ? "T('#{name.path}')" : name.inspect
|
58
|
-
subsects = empty? ? "" : ", subsections=#{super}"
|
59
|
-
"Section(#{n}#{subsects})"
|
60
|
-
end
|
61
|
-
|
62
|
-
def place(*args)
|
63
|
-
super(*parse_sections(args))
|
64
|
-
end
|
65
|
-
|
66
|
-
def to_a
|
67
|
-
list = [name]
|
68
|
-
unless empty?
|
69
|
-
subsects = []
|
70
|
-
each {|s| subsects += s.to_a }
|
71
|
-
list << subsects
|
72
|
-
end
|
73
|
-
list
|
74
|
-
end
|
75
|
-
|
76
|
-
def any(item)
|
77
|
-
find do |section|
|
78
|
-
return section if section == item
|
79
|
-
return section.any(item) unless section.empty?
|
80
|
-
end
|
81
|
-
nil
|
82
|
-
end
|
83
|
-
|
84
|
-
private
|
85
|
-
|
86
|
-
def parse_sections(args)
|
87
|
-
if args.size == 1 && args.first.is_a?(Array) && !args.first.is_a?(Section)
|
88
|
-
args = args.first
|
89
|
-
end
|
90
|
-
sections = []
|
91
|
-
args.each_with_index do |name, index|
|
92
|
-
case name
|
93
|
-
when Section; sections << name
|
94
|
-
when Array; next
|
95
|
-
else
|
96
|
-
subsections = args[index + 1].is_a?(Array) ? args[index + 1] : []
|
97
|
-
subsections = [] if subsections.is_a?(Section)
|
98
|
-
sections << Section.new(name, subsections)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
sections
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module YARD
|
3
|
+
module Templates
|
4
|
+
# Abstracts the structure for a section and its subsections into an ordered
|
5
|
+
# list of sections and subsections.
|
6
|
+
# @since 0.6.0
|
7
|
+
class Section < Array
|
8
|
+
attr_accessor :name
|
9
|
+
|
10
|
+
def initialize(name, *args)
|
11
|
+
self.name = name
|
12
|
+
replace(parse_sections(args))
|
13
|
+
end
|
14
|
+
|
15
|
+
def dup
|
16
|
+
obj = super
|
17
|
+
obj.name = name
|
18
|
+
obj
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](*args)
|
22
|
+
if args.first.is_a?(Range) || args.size > 1
|
23
|
+
obj = super(*args)
|
24
|
+
obj.name = name
|
25
|
+
return obj
|
26
|
+
elsif args.first.is_a?(Integer)
|
27
|
+
return super(*args)
|
28
|
+
end
|
29
|
+
find {|o| o.name == args.first }
|
30
|
+
end
|
31
|
+
|
32
|
+
def eql?(other)
|
33
|
+
super(other) && name == other.name
|
34
|
+
end
|
35
|
+
|
36
|
+
def ==(other)
|
37
|
+
case other
|
38
|
+
when Section
|
39
|
+
eql?(other)
|
40
|
+
when Array
|
41
|
+
to_a == other
|
42
|
+
else
|
43
|
+
name == other
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def push(*args)
|
48
|
+
super(*parse_sections(args))
|
49
|
+
end
|
50
|
+
alias << push
|
51
|
+
|
52
|
+
def unshift(*args)
|
53
|
+
super(*parse_sections(args))
|
54
|
+
end
|
55
|
+
|
56
|
+
def inspect
|
57
|
+
n = name.respond_to?(:path) ? "T('#{name.path}')" : name.inspect
|
58
|
+
subsects = empty? ? "" : ", subsections=#{super}"
|
59
|
+
"Section(#{n}#{subsects})"
|
60
|
+
end
|
61
|
+
|
62
|
+
def place(*args)
|
63
|
+
super(*parse_sections(args))
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_a
|
67
|
+
list = [name]
|
68
|
+
unless empty?
|
69
|
+
subsects = []
|
70
|
+
each {|s| subsects += s.to_a }
|
71
|
+
list << subsects
|
72
|
+
end
|
73
|
+
list
|
74
|
+
end
|
75
|
+
|
76
|
+
def any(item)
|
77
|
+
find do |section|
|
78
|
+
return section if section == item
|
79
|
+
return section.any(item) unless section.empty?
|
80
|
+
end
|
81
|
+
nil
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def parse_sections(args)
|
87
|
+
if args.size == 1 && args.first.is_a?(Array) && !args.first.is_a?(Section)
|
88
|
+
args = args.first
|
89
|
+
end
|
90
|
+
sections = []
|
91
|
+
args.each_with_index do |name, index|
|
92
|
+
case name
|
93
|
+
when Section; sections << name
|
94
|
+
when Array; next
|
95
|
+
else
|
96
|
+
subsections = args[index + 1].is_a?(Array) ? args[index + 1] : []
|
97
|
+
subsections = [] if subsections.is_a?(Section)
|
98
|
+
sections << Section.new(name, subsections)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
sections
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -1,418 +1,418 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require 'erb'
|
3
|
-
|
4
|
-
module YARD
|
5
|
-
module Templates
|
6
|
-
module Template
|
7
|
-
attr_accessor :class, :section
|
8
|
-
attr_reader :options
|
9
|
-
|
10
|
-
class << self
|
11
|
-
# Extra includes are mixins that are included after a template is created. These
|
12
|
-
# mixins can be registered by plugins to operate on templates and override behaviour.
|
13
|
-
#
|
14
|
-
# Note that this array can be filled with modules or proc objects. If a proc object
|
15
|
-
# is given, the proc will be called with the {Template#options} hash containing
|
16
|
-
# relevant template information like the object, format, and more. The proc should
|
17
|
-
# return a module or nil if there is none.
|
18
|
-
#
|
19
|
-
# @example Adding in extra mixins to include on a template
|
20
|
-
# Template.extra_includes << MyHelper
|
21
|
-
# @example Conditionally including a mixin if the format is html
|
22
|
-
# Template.extra_includes << proc {|opts| MyHelper if opts.format == :html }
|
23
|
-
# @return [Array<Module, Proc>] a list of modules to be automatically included
|
24
|
-
# into any new template module
|
25
|
-
attr_accessor :extra_includes
|
26
|
-
|
27
|
-
# @!parse extend ClassMethods
|
28
|
-
# @private
|
29
|
-
def included(klass)
|
30
|
-
klass.extend(ClassMethods)
|
31
|
-
end
|
32
|
-
|
33
|
-
# Includes the {extra_includes} modules into the template object.
|
34
|
-
#
|
35
|
-
# @param [Template] template the template object to mixin the extra includes.
|
36
|
-
# @param [SymbolHash] options the options hash containing all template information
|
37
|
-
# @return [void]
|
38
|
-
def include_extra(template, options)
|
39
|
-
extra_includes.each do |mod|
|
40
|
-
mod = mod.call(options) if mod.is_a?(Proc)
|
41
|
-
next unless mod.is_a?(Module)
|
42
|
-
template.extend(mod)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
self.extra_includes = [
|
48
|
-
proc do |options|
|
49
|
-
{:html => Helpers::HtmlHelper,
|
50
|
-
:text => Helpers::TextHelper,
|
51
|
-
:dot => Helpers::UMLHelper}[options.format]
|
52
|
-
end
|
53
|
-
]
|
54
|
-
|
55
|
-
include ErbCache
|
56
|
-
include Helpers::BaseHelper
|
57
|
-
include Helpers::MethodHelper
|
58
|
-
|
59
|
-
module ClassMethods
|
60
|
-
attr_accessor :path, :full_path
|
61
|
-
|
62
|
-
# @return [Array<String>] a list of full paths
|
63
|
-
# @note This method caches path results. Paths should not be modified
|
64
|
-
# after this method is called; call {#reset_full_paths} to reset cache.
|
65
|
-
def full_paths
|
66
|
-
reset_full_paths unless defined? @cached_included_modules
|
67
|
-
return @full_paths if included_modules == @cached_included_modules
|
68
|
-
|
69
|
-
@cached_included_modules = included_modules
|
70
|
-
@full_paths = included_modules.inject([full_path]) do |paths, mod|
|
71
|
-
paths |= mod.full_paths if mod.respond_to?(:full_paths)
|
72
|
-
paths
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
# Resets cache for {#full_paths}
|
77
|
-
def reset_full_paths
|
78
|
-
@cached_included_modules = nil
|
79
|
-
end
|
80
|
-
|
81
|
-
def initialize(path, full_paths)
|
82
|
-
full_path = full_paths.shift
|
83
|
-
self.path = path
|
84
|
-
self.full_path = full_path
|
85
|
-
include_inherited(full_paths)
|
86
|
-
include_parent
|
87
|
-
load_setup_rb
|
88
|
-
end
|
89
|
-
|
90
|
-
# Searches for a file identified by +basename+ in the template's
|
91
|
-
# path as well as any mixed in template paths. Equivalent to calling
|
92
|
-
# {ClassMethods#find_nth_file} with index of 1.
|
93
|
-
#
|
94
|
-
# @param [String] basename the filename to search for
|
95
|
-
# @return [String] the full path of a file on disk with filename
|
96
|
-
# +basename+ in one of the template's paths.
|
97
|
-
# @see find_nth_file
|
98
|
-
def find_file(basename)
|
99
|
-
find_nth_file(basename)
|
100
|
-
end
|
101
|
-
|
102
|
-
# Searches for the nth file (where n = +index+) identified
|
103
|
-
# by basename in the template's path and any mixed in template paths.
|
104
|
-
#
|
105
|
-
# @param [String] basename the filename to search for
|
106
|
-
# @param [Fixnum] index the nth existing file to return
|
107
|
-
# @return [String] the full path of the nth file on disk with
|
108
|
-
# filename +basename+ in one of the template paths
|
109
|
-
def find_nth_file(basename, index = 1)
|
110
|
-
n = 1
|
111
|
-
full_paths.each do |path|
|
112
|
-
file = File.join(path, basename)
|
113
|
-
if File.file?(file)
|
114
|
-
return file if index == n
|
115
|
-
n += 1
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
nil
|
120
|
-
end
|
121
|
-
|
122
|
-
def is_a?(klass)
|
123
|
-
return true if klass == Template
|
124
|
-
super(klass)
|
125
|
-
end
|
126
|
-
|
127
|
-
# Creates a new template object to be rendered with {Template#run}
|
128
|
-
def new(*args)
|
129
|
-
obj = Object.new.extend(self)
|
130
|
-
obj.class = self
|
131
|
-
obj.send(:initialize, *args)
|
132
|
-
obj
|
133
|
-
end
|
134
|
-
|
135
|
-
def run(*args)
|
136
|
-
new(*args).run
|
137
|
-
end
|
138
|
-
|
139
|
-
# rubocop:disable Style/MethodName
|
140
|
-
|
141
|
-
# Alias for creating {Engine.template}.
|
142
|
-
def T(*path)
|
143
|
-
Engine.template(*path)
|
144
|
-
end
|
145
|
-
|
146
|
-
# Alias for creating a {Section} with arguments
|
147
|
-
# @see Section#initialize
|
148
|
-
# @since 0.6.0
|
149
|
-
def S(*args)
|
150
|
-
Section.new(*args)
|
151
|
-
end
|
152
|
-
|
153
|
-
# rubocop:enable Style/MethodName
|
154
|
-
|
155
|
-
private
|
156
|
-
|
157
|
-
def include_parent
|
158
|
-
pc = path.to_s.split('/')
|
159
|
-
if pc.size > 1
|
160
|
-
pc.pop
|
161
|
-
pc = pc.join('/')
|
162
|
-
begin
|
163
|
-
include Engine.template(pc)
|
164
|
-
rescue ArgumentError
|
165
|
-
include Engine.template!(pc, full_path.gsub(%r{/[^/]+$}, ''))
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def include_inherited(full_paths)
|
171
|
-
full_paths.reverse.each do |full_path|
|
172
|
-
include Engine.template!(path, full_path)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def load_setup_rb
|
177
|
-
setup_file = File.join(full_path, 'setup.rb')
|
178
|
-
if File.file? setup_file
|
179
|
-
module_eval(File.read(setup_file).taint, setup_file, 1)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
def initialize(opts = TemplateOptions.new)
|
185
|
-
opts_class = opts.class
|
186
|
-
opts_class = TemplateOptions if opts_class == Hash
|
187
|
-
@cache = {}
|
188
|
-
@cache_filename = {}
|
189
|
-
@sections = []
|
190
|
-
@options = opts_class.new
|
191
|
-
add_options(opts)
|
192
|
-
Template.include_extra(self, options)
|
193
|
-
init
|
194
|
-
end
|
195
|
-
|
196
|
-
# Loads a template specified by path. If +:template+ or +:format+ is
|
197
|
-
# specified in the {#options} hash, they are prepended and appended
|
198
|
-
# to the path respectively.
|
199
|
-
#
|
200
|
-
# @param [Array<String, Symbol>] path the path of the template
|
201
|
-
# @return [Template] the loaded template module
|
202
|
-
def T(*path) # rubocop:disable Style/MethodName
|
203
|
-
path.unshift(options.template) if options.template
|
204
|
-
path.push(options.format) if options.format
|
205
|
-
self.class.T(*path)
|
206
|
-
end
|
207
|
-
|
208
|
-
# Sets the sections (and subsections) to be rendered for the template
|
209
|
-
#
|
210
|
-
# @example Sets a set of erb sections
|
211
|
-
# sections :a, :b, :c # searches for a.erb, b.erb, c.erb
|
212
|
-
# @example Sets a set of method and erb sections
|
213
|
-
# sections :a, :b, :c # a is a method, the rest are erb files
|
214
|
-
# @example Sections with subsections
|
215
|
-
# sections :header, [:name, :children]
|
216
|
-
# # the above will call header.erb and only renders the subsections
|
217
|
-
# # if they are yielded by the template (see #yieldall)
|
218
|
-
# @param [Array<Symbol, String, Template, Array>] args the sections
|
219
|
-
# to use to render the template. For symbols and strings, the
|
220
|
-
# section will be executed as a method (if one exists), or rendered
|
221
|
-
# from the file "name.erb" where name is the section name. For
|
222
|
-
# templates, they will have {Template::ClassMethods#run} called on them.
|
223
|
-
# Any subsections can be yielded to using yield or {#yieldall}
|
224
|
-
def sections(*args)
|
225
|
-
@sections = Section.new(nil, *args) unless args.empty?
|
226
|
-
@sections
|
227
|
-
end
|
228
|
-
|
229
|
-
# Initialization called on the template. Override this in a 'setup.rb'
|
230
|
-
# file in the template's path to implement a template
|
231
|
-
#
|
232
|
-
# @example A default set of sections
|
233
|
-
# def init
|
234
|
-
# sections :section1, :section2, [:subsection1, :etc]
|
235
|
-
# end
|
236
|
-
# @see #sections
|
237
|
-
def init
|
238
|
-
end
|
239
|
-
|
240
|
-
# Runs a template on +sects+ using extra options. This method should
|
241
|
-
# not be called directly. Instead, call the class method {ClassMethods#run}
|
242
|
-
#
|
243
|
-
# @param [Hash, nil] opts any extra options to apply to sections
|
244
|
-
# @param [Section, Array] sects a section list of sections to render
|
245
|
-
# @param [Fixnum] start_at the index in the section list to start from
|
246
|
-
# @param [Boolean] break_first if true, renders only the first section
|
247
|
-
# @yield [opts] calls for the subsections to be rendered
|
248
|
-
# @yieldparam [Hash] opts any extra options to yield
|
249
|
-
# @return [String] the rendered sections joined together
|
250
|
-
def run(opts = nil, sects = sections, start_at = 0, break_first = false, &block)
|
251
|
-
out = String.new("")
|
252
|
-
return out if sects.nil?
|
253
|
-
sects = sects[start_at..-1] if start_at > 0
|
254
|
-
sects = Section.new(nil, sects) unless sects.is_a?(Section)
|
255
|
-
add_options(opts) do
|
256
|
-
sects.each do |s|
|
257
|
-
self.section = s
|
258
|
-
subsection_index = 0
|
259
|
-
value = render_section(section) do |*args|
|
260
|
-
value = with_section do
|
261
|
-
run(args.first, section, subsection_index, true, &block)
|
262
|
-
end
|
263
|
-
subsection_index += 1
|
264
|
-
value
|
265
|
-
end
|
266
|
-
out << (value || "")
|
267
|
-
break if break_first
|
268
|
-
end
|
269
|
-
end
|
270
|
-
out
|
271
|
-
end
|
272
|
-
|
273
|
-
# Yields all subsections with any extra options
|
274
|
-
#
|
275
|
-
# @param [Hash] opts extra options to be applied to subsections
|
276
|
-
def yieldall(opts = nil, &block)
|
277
|
-
with_section { run(opts, section, &block) }
|
278
|
-
end
|
279
|
-
|
280
|
-
# @param [String, Symbol] section the section name
|
281
|
-
# @yield calls subsections to be rendered
|
282
|
-
# @return [String] the contents of the ERB rendered section
|
283
|
-
def erb(section, &block)
|
284
|
-
method_name = ErbCache.method_for(cache_filename(section)) do
|
285
|
-
erb_with(cache(section), cache_filename(section))
|
286
|
-
end
|
287
|
-
send(method_name, &block)
|
288
|
-
end
|
289
|
-
|
290
|
-
# Returns the contents of a file. If +allow_inherited+ is set to +true+,
|
291
|
-
# use +{{{__super__}}}+ inside the file contents to insert the contents
|
292
|
-
# of the file from an inherited template. For instance, if +templates/b+
|
293
|
-
# inherits from +templates/a+ and file "test.css" exists in both directories,
|
294
|
-
# both file contents can be retrieved by having +templates/b/test.css+ look
|
295
|
-
# like:
|
296
|
-
#
|
297
|
-
# {{{__super__}}}
|
298
|
-
# ...
|
299
|
-
# body { css styles here }
|
300
|
-
# p.class { other styles }
|
301
|
-
#
|
302
|
-
# @param [String] basename the name of the file
|
303
|
-
# @param [Boolean] allow_inherited whether inherited templates can
|
304
|
-
# be inserted with +{{{__super__}}}+
|
305
|
-
# @return [String] the contents of a file identified by +basename+. All
|
306
|
-
# template paths (including any mixed in templates) are searched for
|
307
|
-
# the file
|
308
|
-
# @see ClassMethods#find_file
|
309
|
-
# @see ClassMethods#find_nth_file
|
310
|
-
def file(basename, allow_inherited = false)
|
311
|
-
file = self.class.find_file(basename)
|
312
|
-
raise ArgumentError, "no file for '#{basename}' in #{self.class.path}" unless file
|
313
|
-
|
314
|
-
data = IO.read(file)
|
315
|
-
if allow_inherited
|
316
|
-
superfile = self.class.find_nth_file(basename, 2)
|
317
|
-
data.gsub!('{{{__super__}}}', superfile ? IO.read(superfile) : "")
|
318
|
-
end
|
319
|
-
|
320
|
-
data
|
321
|
-
end
|
322
|
-
|
323
|
-
# Calls the ERB file from the last inherited template with {#section}.erb
|
324
|
-
#
|
325
|
-
# @param [Symbol, String] sect if provided, uses a specific section name
|
326
|
-
# @return [String] the rendered ERB file in any of the inherited template
|
327
|
-
# paths.
|
328
|
-
def superb(sect = section, &block)
|
329
|
-
filename = self.class.find_nth_file(erb_file_for(sect), 2)
|
330
|
-
return "" unless filename
|
331
|
-
method_name = ErbCache.method_for(filename) { erb_with(IO.read(filename), filename) }
|
332
|
-
send(method_name, &block)
|
333
|
-
end
|
334
|
-
|
335
|
-
def options=(value)
|
336
|
-
@options = value
|
337
|
-
set_ivars
|
338
|
-
end
|
339
|
-
|
340
|
-
def inspect
|
341
|
-
"Template(#{self.class.path}) [section=#{section.name}]"
|
342
|
-
end
|
343
|
-
|
344
|
-
protected
|
345
|
-
|
346
|
-
def erb_file_for(section)
|
347
|
-
"#{section}.erb"
|
348
|
-
end
|
349
|
-
|
350
|
-
def erb_with(content, filename = nil)
|
351
|
-
erb = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
|
352
|
-
ERB.new(content, :trim_mode => options.format == :text ? '<>' : nil)
|
353
|
-
else
|
354
|
-
ERB.new(content, nil, options.format == :text ? '<>' : nil)
|
355
|
-
end
|
356
|
-
erb.filename = filename if filename
|
357
|
-
erb
|
358
|
-
end
|
359
|
-
|
360
|
-
private
|
361
|
-
|
362
|
-
def render_section(section, &block)
|
363
|
-
section = section.name if section.is_a?(Section)
|
364
|
-
case section
|
365
|
-
when Section, String, Symbol
|
366
|
-
if respond_to?(section)
|
367
|
-
send(section, &block)
|
368
|
-
else
|
369
|
-
erb(section, &block)
|
370
|
-
end
|
371
|
-
when Module, Template
|
372
|
-
section.run(options, &block) if section.is_a?(Template)
|
373
|
-
end || ""
|
374
|
-
end
|
375
|
-
|
376
|
-
def cache(section)
|
377
|
-
content = @cache[section.to_sym]
|
378
|
-
return content if content
|
379
|
-
|
380
|
-
file = cache_filename(section)
|
381
|
-
@cache_filename[section.to_sym] = file
|
382
|
-
raise ArgumentError, "no template for section '#{section}' in #{self.class.path}" unless file
|
383
|
-
@cache[section.to_sym] = IO.read(file)
|
384
|
-
end
|
385
|
-
|
386
|
-
def cache_filename(section)
|
387
|
-
@cache_filename[section.to_sym] ||=
|
388
|
-
self.class.find_file(erb_file_for(section))
|
389
|
-
end
|
390
|
-
|
391
|
-
def set_ivars
|
392
|
-
options.each do |k, v|
|
393
|
-
instance_variable_set("@#{k}", v)
|
394
|
-
end
|
395
|
-
end
|
396
|
-
|
397
|
-
def add_options(opts = nil)
|
398
|
-
return(yield) if opts.nil? && block_given?
|
399
|
-
cur_opts = options if block_given?
|
400
|
-
|
401
|
-
self.options = options.merge(opts)
|
402
|
-
|
403
|
-
if block_given?
|
404
|
-
value = yield
|
405
|
-
self.options = cur_opts
|
406
|
-
value
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
|
-
def with_section
|
411
|
-
sect = section
|
412
|
-
value = yield
|
413
|
-
self.section = sect
|
414
|
-
value
|
415
|
-
end
|
416
|
-
end
|
417
|
-
end
|
418
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module YARD
|
5
|
+
module Templates
|
6
|
+
module Template
|
7
|
+
attr_accessor :class, :section
|
8
|
+
attr_reader :options
|
9
|
+
|
10
|
+
class << self
|
11
|
+
# Extra includes are mixins that are included after a template is created. These
|
12
|
+
# mixins can be registered by plugins to operate on templates and override behaviour.
|
13
|
+
#
|
14
|
+
# Note that this array can be filled with modules or proc objects. If a proc object
|
15
|
+
# is given, the proc will be called with the {Template#options} hash containing
|
16
|
+
# relevant template information like the object, format, and more. The proc should
|
17
|
+
# return a module or nil if there is none.
|
18
|
+
#
|
19
|
+
# @example Adding in extra mixins to include on a template
|
20
|
+
# Template.extra_includes << MyHelper
|
21
|
+
# @example Conditionally including a mixin if the format is html
|
22
|
+
# Template.extra_includes << proc {|opts| MyHelper if opts.format == :html }
|
23
|
+
# @return [Array<Module, Proc>] a list of modules to be automatically included
|
24
|
+
# into any new template module
|
25
|
+
attr_accessor :extra_includes
|
26
|
+
|
27
|
+
# @!parse extend ClassMethods
|
28
|
+
# @private
|
29
|
+
def included(klass)
|
30
|
+
klass.extend(ClassMethods)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Includes the {extra_includes} modules into the template object.
|
34
|
+
#
|
35
|
+
# @param [Template] template the template object to mixin the extra includes.
|
36
|
+
# @param [SymbolHash] options the options hash containing all template information
|
37
|
+
# @return [void]
|
38
|
+
def include_extra(template, options)
|
39
|
+
extra_includes.each do |mod|
|
40
|
+
mod = mod.call(options) if mod.is_a?(Proc)
|
41
|
+
next unless mod.is_a?(Module)
|
42
|
+
template.extend(mod)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
self.extra_includes = [
|
48
|
+
proc do |options|
|
49
|
+
{:html => Helpers::HtmlHelper,
|
50
|
+
:text => Helpers::TextHelper,
|
51
|
+
:dot => Helpers::UMLHelper}[options.format]
|
52
|
+
end
|
53
|
+
]
|
54
|
+
|
55
|
+
include ErbCache
|
56
|
+
include Helpers::BaseHelper
|
57
|
+
include Helpers::MethodHelper
|
58
|
+
|
59
|
+
module ClassMethods
|
60
|
+
attr_accessor :path, :full_path
|
61
|
+
|
62
|
+
# @return [Array<String>] a list of full paths
|
63
|
+
# @note This method caches path results. Paths should not be modified
|
64
|
+
# after this method is called; call {#reset_full_paths} to reset cache.
|
65
|
+
def full_paths
|
66
|
+
reset_full_paths unless defined? @cached_included_modules
|
67
|
+
return @full_paths if included_modules == @cached_included_modules
|
68
|
+
|
69
|
+
@cached_included_modules = included_modules
|
70
|
+
@full_paths = included_modules.inject([full_path]) do |paths, mod|
|
71
|
+
paths |= mod.full_paths if mod.respond_to?(:full_paths)
|
72
|
+
paths
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Resets cache for {#full_paths}
|
77
|
+
def reset_full_paths
|
78
|
+
@cached_included_modules = nil
|
79
|
+
end
|
80
|
+
|
81
|
+
def initialize(path, full_paths)
|
82
|
+
full_path = full_paths.shift
|
83
|
+
self.path = path
|
84
|
+
self.full_path = full_path
|
85
|
+
include_inherited(full_paths)
|
86
|
+
include_parent
|
87
|
+
load_setup_rb
|
88
|
+
end
|
89
|
+
|
90
|
+
# Searches for a file identified by +basename+ in the template's
|
91
|
+
# path as well as any mixed in template paths. Equivalent to calling
|
92
|
+
# {ClassMethods#find_nth_file} with index of 1.
|
93
|
+
#
|
94
|
+
# @param [String] basename the filename to search for
|
95
|
+
# @return [String] the full path of a file on disk with filename
|
96
|
+
# +basename+ in one of the template's paths.
|
97
|
+
# @see find_nth_file
|
98
|
+
def find_file(basename)
|
99
|
+
find_nth_file(basename)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Searches for the nth file (where n = +index+) identified
|
103
|
+
# by basename in the template's path and any mixed in template paths.
|
104
|
+
#
|
105
|
+
# @param [String] basename the filename to search for
|
106
|
+
# @param [Fixnum] index the nth existing file to return
|
107
|
+
# @return [String] the full path of the nth file on disk with
|
108
|
+
# filename +basename+ in one of the template paths
|
109
|
+
def find_nth_file(basename, index = 1)
|
110
|
+
n = 1
|
111
|
+
full_paths.each do |path|
|
112
|
+
file = File.join(path, basename)
|
113
|
+
if File.file?(file)
|
114
|
+
return file if index == n
|
115
|
+
n += 1
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
nil
|
120
|
+
end
|
121
|
+
|
122
|
+
def is_a?(klass)
|
123
|
+
return true if klass == Template
|
124
|
+
super(klass)
|
125
|
+
end
|
126
|
+
|
127
|
+
# Creates a new template object to be rendered with {Template#run}
|
128
|
+
def new(*args)
|
129
|
+
obj = Object.new.extend(self)
|
130
|
+
obj.class = self
|
131
|
+
obj.send(:initialize, *args)
|
132
|
+
obj
|
133
|
+
end
|
134
|
+
|
135
|
+
def run(*args)
|
136
|
+
new(*args).run
|
137
|
+
end
|
138
|
+
|
139
|
+
# rubocop:disable Style/MethodName
|
140
|
+
|
141
|
+
# Alias for creating {Engine.template}.
|
142
|
+
def T(*path)
|
143
|
+
Engine.template(*path)
|
144
|
+
end
|
145
|
+
|
146
|
+
# Alias for creating a {Section} with arguments
|
147
|
+
# @see Section#initialize
|
148
|
+
# @since 0.6.0
|
149
|
+
def S(*args)
|
150
|
+
Section.new(*args)
|
151
|
+
end
|
152
|
+
|
153
|
+
# rubocop:enable Style/MethodName
|
154
|
+
|
155
|
+
private
|
156
|
+
|
157
|
+
def include_parent
|
158
|
+
pc = path.to_s.split('/')
|
159
|
+
if pc.size > 1
|
160
|
+
pc.pop
|
161
|
+
pc = pc.join('/')
|
162
|
+
begin
|
163
|
+
include Engine.template(pc)
|
164
|
+
rescue ArgumentError
|
165
|
+
include Engine.template!(pc, full_path.gsub(%r{/[^/]+$}, ''))
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def include_inherited(full_paths)
|
171
|
+
full_paths.reverse.each do |full_path|
|
172
|
+
include Engine.template!(path, full_path)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def load_setup_rb
|
177
|
+
setup_file = File.join(full_path, 'setup.rb')
|
178
|
+
if File.file? setup_file
|
179
|
+
module_eval(File.read(setup_file).taint, setup_file, 1)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def initialize(opts = TemplateOptions.new)
|
185
|
+
opts_class = opts.class
|
186
|
+
opts_class = TemplateOptions if opts_class == Hash
|
187
|
+
@cache = {}
|
188
|
+
@cache_filename = {}
|
189
|
+
@sections = []
|
190
|
+
@options = opts_class.new
|
191
|
+
add_options(opts)
|
192
|
+
Template.include_extra(self, options)
|
193
|
+
init
|
194
|
+
end
|
195
|
+
|
196
|
+
# Loads a template specified by path. If +:template+ or +:format+ is
|
197
|
+
# specified in the {#options} hash, they are prepended and appended
|
198
|
+
# to the path respectively.
|
199
|
+
#
|
200
|
+
# @param [Array<String, Symbol>] path the path of the template
|
201
|
+
# @return [Template] the loaded template module
|
202
|
+
def T(*path) # rubocop:disable Style/MethodName
|
203
|
+
path.unshift(options.template) if options.template
|
204
|
+
path.push(options.format) if options.format
|
205
|
+
self.class.T(*path)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Sets the sections (and subsections) to be rendered for the template
|
209
|
+
#
|
210
|
+
# @example Sets a set of erb sections
|
211
|
+
# sections :a, :b, :c # searches for a.erb, b.erb, c.erb
|
212
|
+
# @example Sets a set of method and erb sections
|
213
|
+
# sections :a, :b, :c # a is a method, the rest are erb files
|
214
|
+
# @example Sections with subsections
|
215
|
+
# sections :header, [:name, :children]
|
216
|
+
# # the above will call header.erb and only renders the subsections
|
217
|
+
# # if they are yielded by the template (see #yieldall)
|
218
|
+
# @param [Array<Symbol, String, Template, Array>] args the sections
|
219
|
+
# to use to render the template. For symbols and strings, the
|
220
|
+
# section will be executed as a method (if one exists), or rendered
|
221
|
+
# from the file "name.erb" where name is the section name. For
|
222
|
+
# templates, they will have {Template::ClassMethods#run} called on them.
|
223
|
+
# Any subsections can be yielded to using yield or {#yieldall}
|
224
|
+
def sections(*args)
|
225
|
+
@sections = Section.new(nil, *args) unless args.empty?
|
226
|
+
@sections
|
227
|
+
end
|
228
|
+
|
229
|
+
# Initialization called on the template. Override this in a 'setup.rb'
|
230
|
+
# file in the template's path to implement a template
|
231
|
+
#
|
232
|
+
# @example A default set of sections
|
233
|
+
# def init
|
234
|
+
# sections :section1, :section2, [:subsection1, :etc]
|
235
|
+
# end
|
236
|
+
# @see #sections
|
237
|
+
def init
|
238
|
+
end
|
239
|
+
|
240
|
+
# Runs a template on +sects+ using extra options. This method should
|
241
|
+
# not be called directly. Instead, call the class method {ClassMethods#run}
|
242
|
+
#
|
243
|
+
# @param [Hash, nil] opts any extra options to apply to sections
|
244
|
+
# @param [Section, Array] sects a section list of sections to render
|
245
|
+
# @param [Fixnum] start_at the index in the section list to start from
|
246
|
+
# @param [Boolean] break_first if true, renders only the first section
|
247
|
+
# @yield [opts] calls for the subsections to be rendered
|
248
|
+
# @yieldparam [Hash] opts any extra options to yield
|
249
|
+
# @return [String] the rendered sections joined together
|
250
|
+
def run(opts = nil, sects = sections, start_at = 0, break_first = false, &block)
|
251
|
+
out = String.new("")
|
252
|
+
return out if sects.nil?
|
253
|
+
sects = sects[start_at..-1] if start_at > 0
|
254
|
+
sects = Section.new(nil, sects) unless sects.is_a?(Section)
|
255
|
+
add_options(opts) do
|
256
|
+
sects.each do |s|
|
257
|
+
self.section = s
|
258
|
+
subsection_index = 0
|
259
|
+
value = render_section(section) do |*args|
|
260
|
+
value = with_section do
|
261
|
+
run(args.first, section, subsection_index, true, &block)
|
262
|
+
end
|
263
|
+
subsection_index += 1
|
264
|
+
value
|
265
|
+
end
|
266
|
+
out << (value || "")
|
267
|
+
break if break_first
|
268
|
+
end
|
269
|
+
end
|
270
|
+
out
|
271
|
+
end
|
272
|
+
|
273
|
+
# Yields all subsections with any extra options
|
274
|
+
#
|
275
|
+
# @param [Hash] opts extra options to be applied to subsections
|
276
|
+
def yieldall(opts = nil, &block)
|
277
|
+
with_section { run(opts, section, &block) }
|
278
|
+
end
|
279
|
+
|
280
|
+
# @param [String, Symbol] section the section name
|
281
|
+
# @yield calls subsections to be rendered
|
282
|
+
# @return [String] the contents of the ERB rendered section
|
283
|
+
def erb(section, &block)
|
284
|
+
method_name = ErbCache.method_for(cache_filename(section)) do
|
285
|
+
erb_with(cache(section), cache_filename(section))
|
286
|
+
end
|
287
|
+
send(method_name, &block)
|
288
|
+
end
|
289
|
+
|
290
|
+
# Returns the contents of a file. If +allow_inherited+ is set to +true+,
|
291
|
+
# use +{{{__super__}}}+ inside the file contents to insert the contents
|
292
|
+
# of the file from an inherited template. For instance, if +templates/b+
|
293
|
+
# inherits from +templates/a+ and file "test.css" exists in both directories,
|
294
|
+
# both file contents can be retrieved by having +templates/b/test.css+ look
|
295
|
+
# like:
|
296
|
+
#
|
297
|
+
# {{{__super__}}}
|
298
|
+
# ...
|
299
|
+
# body { css styles here }
|
300
|
+
# p.class { other styles }
|
301
|
+
#
|
302
|
+
# @param [String] basename the name of the file
|
303
|
+
# @param [Boolean] allow_inherited whether inherited templates can
|
304
|
+
# be inserted with +{{{__super__}}}+
|
305
|
+
# @return [String] the contents of a file identified by +basename+. All
|
306
|
+
# template paths (including any mixed in templates) are searched for
|
307
|
+
# the file
|
308
|
+
# @see ClassMethods#find_file
|
309
|
+
# @see ClassMethods#find_nth_file
|
310
|
+
def file(basename, allow_inherited = false)
|
311
|
+
file = self.class.find_file(basename)
|
312
|
+
raise ArgumentError, "no file for '#{basename}' in #{self.class.path}" unless file
|
313
|
+
|
314
|
+
data = IO.read(file)
|
315
|
+
if allow_inherited
|
316
|
+
superfile = self.class.find_nth_file(basename, 2)
|
317
|
+
data.gsub!('{{{__super__}}}', superfile ? IO.read(superfile) : "")
|
318
|
+
end
|
319
|
+
|
320
|
+
data
|
321
|
+
end
|
322
|
+
|
323
|
+
# Calls the ERB file from the last inherited template with {#section}.erb
|
324
|
+
#
|
325
|
+
# @param [Symbol, String] sect if provided, uses a specific section name
|
326
|
+
# @return [String] the rendered ERB file in any of the inherited template
|
327
|
+
# paths.
|
328
|
+
def superb(sect = section, &block)
|
329
|
+
filename = self.class.find_nth_file(erb_file_for(sect), 2)
|
330
|
+
return "" unless filename
|
331
|
+
method_name = ErbCache.method_for(filename) { erb_with(IO.read(filename), filename) }
|
332
|
+
send(method_name, &block)
|
333
|
+
end
|
334
|
+
|
335
|
+
def options=(value)
|
336
|
+
@options = value
|
337
|
+
set_ivars
|
338
|
+
end
|
339
|
+
|
340
|
+
def inspect
|
341
|
+
"Template(#{self.class.path}) [section=#{section.name}]"
|
342
|
+
end
|
343
|
+
|
344
|
+
protected
|
345
|
+
|
346
|
+
def erb_file_for(section)
|
347
|
+
"#{section}.erb"
|
348
|
+
end
|
349
|
+
|
350
|
+
def erb_with(content, filename = nil)
|
351
|
+
erb = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
|
352
|
+
ERB.new(content, :trim_mode => options.format == :text ? '<>' : nil)
|
353
|
+
else
|
354
|
+
ERB.new(content, nil, options.format == :text ? '<>' : nil)
|
355
|
+
end
|
356
|
+
erb.filename = filename if filename
|
357
|
+
erb
|
358
|
+
end
|
359
|
+
|
360
|
+
private
|
361
|
+
|
362
|
+
def render_section(section, &block)
|
363
|
+
section = section.name if section.is_a?(Section)
|
364
|
+
case section
|
365
|
+
when Section, String, Symbol
|
366
|
+
if respond_to?(section)
|
367
|
+
send(section, &block)
|
368
|
+
else
|
369
|
+
erb(section, &block)
|
370
|
+
end
|
371
|
+
when Module, Template
|
372
|
+
section.run(options, &block) if section.is_a?(Template)
|
373
|
+
end || ""
|
374
|
+
end
|
375
|
+
|
376
|
+
def cache(section)
|
377
|
+
content = @cache[section.to_sym]
|
378
|
+
return content if content
|
379
|
+
|
380
|
+
file = cache_filename(section)
|
381
|
+
@cache_filename[section.to_sym] = file
|
382
|
+
raise ArgumentError, "no template for section '#{section}' in #{self.class.path}" unless file
|
383
|
+
@cache[section.to_sym] = IO.read(file)
|
384
|
+
end
|
385
|
+
|
386
|
+
def cache_filename(section)
|
387
|
+
@cache_filename[section.to_sym] ||=
|
388
|
+
self.class.find_file(erb_file_for(section))
|
389
|
+
end
|
390
|
+
|
391
|
+
def set_ivars
|
392
|
+
options.each do |k, v|
|
393
|
+
instance_variable_set("@#{k}", v)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def add_options(opts = nil)
|
398
|
+
return(yield) if opts.nil? && block_given?
|
399
|
+
cur_opts = options if block_given?
|
400
|
+
|
401
|
+
self.options = options.merge(opts)
|
402
|
+
|
403
|
+
if block_given?
|
404
|
+
value = yield
|
405
|
+
self.options = cur_opts
|
406
|
+
value
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
def with_section
|
411
|
+
sect = section
|
412
|
+
value = yield
|
413
|
+
self.section = sect
|
414
|
+
value
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
end
|