yard 0.9.23 → 0.9.27
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 +4 -4
- data/.dockerignore +0 -0
- data/.gitattributes +4 -0
- data/.github/FUNDING.yml +3 -0
- data/.github/ISSUE_TEMPLATE.md +6 -6
- data/.github/PULL_REQUEST_TEMPLATE.md +5 -5
- data/.github/workflows/ci.yml +30 -0
- data/.github/workflows/gem.yml +19 -0
- data/.gitignore +0 -0
- data/.rspec +0 -0
- data/.rubocop.yml +37 -24
- data/.yardopts +0 -0
- data/.yardopts_guide +0 -0
- data/.yardopts_i18n +0 -0
- data/CHANGELOG.md +50 -4
- data/CONTRIBUTING.md +2 -2
- data/Gemfile +5 -3
- data/README.md +97 -102
- data/Rakefile +2 -3
- data/lib/yard/cli/diff.rb +4 -1
- data/lib/yard/cli/server.rb +22 -13
- data/lib/yard/cli/stats.rb +2 -0
- data/lib/yard/cli/yardoc.rb +2 -1
- data/lib/yard/code_objects/method_object.rb +1 -1
- data/lib/yard/code_objects/namespace_mapper.rb +30 -3
- data/lib/yard/code_objects/proxy.rb +2 -1
- data/lib/yard/globals.rb +1 -1
- data/lib/yard/handlers/c/base.rb +35 -0
- data/lib/yard/handlers/ruby/method_handler.rb +1 -1
- data/lib/yard/handlers/ruby/mixin_handler.rb +7 -2
- data/lib/yard/handlers/ruby/module_function_handler.rb +15 -3
- data/lib/yard/parser/ruby/ast_node.rb +2 -2
- data/lib/yard/parser/ruby/ruby_parser.rb +7 -5
- data/lib/yard/parser/ruby/token_resolver.rb +3 -1
- data/lib/yard/parser/source_parser.rb +1 -1
- data/lib/yard/registry_resolver.rb +10 -24
- data/lib/yard/registry_store.rb +1 -1
- data/lib/yard/serializers/yardoc_serializer.rb +1 -1
- data/lib/yard/server/commands/base.rb +2 -2
- data/lib/yard/server/commands/library_command.rb +1 -1
- data/lib/yard/tags/directives.rb +10 -1
- data/lib/yard/templates/helpers/html_helper.rb +15 -5
- data/lib/yard/templates/helpers/markup/rdoc_markup.rb +5 -4
- data/lib/yard/templates/helpers/markup_helper.rb +2 -1
- data/lib/yard/templates/section.rb +1 -3
- data/lib/yard/version.rb +1 -1
- data/lib/yard.rb +3 -0
- data/samus.json +15 -46
- data/tasks/prepare_tag.rake +45 -0
- data/tasks/update_error_map.rake +53 -0
- data/templates/default/fulldoc/html/css/style.css +1 -0
- data/yard.gemspec +3 -2
- metadata +23 -207
- data/.travis.yml +0 -52
- data/spec/cli/command_parser_spec.rb +0 -43
- data/spec/cli/command_spec.rb +0 -36
- data/spec/cli/config_spec.rb +0 -148
- data/spec/cli/diff_spec.rb +0 -254
- data/spec/cli/display_spec.rb +0 -30
- data/spec/cli/gems_spec.rb +0 -81
- data/spec/cli/graph_spec.rb +0 -18
- data/spec/cli/help_spec.rb +0 -22
- data/spec/cli/i18n_spec.rb +0 -107
- data/spec/cli/list_spec.rb +0 -8
- data/spec/cli/markup_types_spec.rb +0 -22
- data/spec/cli/server_spec.rb +0 -324
- data/spec/cli/stats_spec.rb +0 -96
- data/spec/cli/yard_on_yard_spec.rb +0 -38
- data/spec/cli/yardoc_spec.rb +0 -896
- data/spec/cli/yri_spec.rb +0 -101
- data/spec/code_objects/base_spec.rb +0 -485
- data/spec/code_objects/class_object_spec.rb +0 -226
- data/spec/code_objects/code_object_list_spec.rb +0 -36
- data/spec/code_objects/constants_spec.rb +0 -116
- data/spec/code_objects/extra_file_object_spec.rb +0 -161
- data/spec/code_objects/macro_object_spec.rb +0 -150
- data/spec/code_objects/method_object_spec.rb +0 -184
- data/spec/code_objects/module_object_spec.rb +0 -142
- data/spec/code_objects/namespace_object_spec.rb +0 -171
- data/spec/code_objects/proxy_spec.rb +0 -147
- data/spec/code_objects/spec_helper.rb +0 -3
- data/spec/config_spec.rb +0 -171
- data/spec/core_ext/array_spec.rb +0 -13
- data/spec/core_ext/file_spec.rb +0 -72
- data/spec/core_ext/hash_spec.rb +0 -14
- data/spec/core_ext/insertion_spec.rb +0 -37
- data/spec/core_ext/module_spec.rb +0 -9
- data/spec/core_ext/string_spec.rb +0 -42
- data/spec/core_ext/symbol_hash_spec.rb +0 -89
- data/spec/docstring_parser_spec.rb +0 -280
- data/spec/docstring_spec.rb +0 -373
- data/spec/handlers/alias_handler_spec.rb +0 -82
- data/spec/handlers/attribute_handler_spec.rb +0 -96
- data/spec/handlers/base_spec.rb +0 -216
- data/spec/handlers/c/alias_handler_spec.rb +0 -34
- data/spec/handlers/c/attribute_handler_spec.rb +0 -41
- data/spec/handlers/c/class_handler_spec.rb +0 -78
- data/spec/handlers/c/constant_handler_spec.rb +0 -71
- data/spec/handlers/c/init_handler_spec.rb +0 -48
- data/spec/handlers/c/method_handler_spec.rb +0 -327
- data/spec/handlers/c/mixin_handler_spec.rb +0 -44
- data/spec/handlers/c/module_handler_spec.rb +0 -71
- data/spec/handlers/c/override_comment_handler_spec.rb +0 -47
- data/spec/handlers/c/path_handler_spec.rb +0 -36
- data/spec/handlers/c/spec_helper.rb +0 -23
- data/spec/handlers/c/struct_handler_spec.rb +0 -16
- data/spec/handlers/class_condition_handler_spec.rb +0 -87
- data/spec/handlers/class_handler_spec.rb +0 -247
- data/spec/handlers/class_method_handler_shared_examples.rb +0 -133
- data/spec/handlers/class_variable_handler_spec.rb +0 -12
- data/spec/handlers/constant_handler_spec.rb +0 -112
- data/spec/handlers/decorator_handler_methods_spec.rb +0 -393
- data/spec/handlers/dsl_handler_spec.rb +0 -226
- data/spec/handlers/examples/alias_handler_001.rb.txt +0 -46
- data/spec/handlers/examples/attribute_handler_001.rb.txt +0 -32
- data/spec/handlers/examples/class_condition_handler_001.rb.txt +0 -69
- data/spec/handlers/examples/class_handler_001.rb.txt +0 -120
- data/spec/handlers/examples/class_variable_handler_001.rb.txt +0 -10
- data/spec/handlers/examples/constant_handler_001.rb.txt +0 -35
- data/spec/handlers/examples/dsl_handler_001.rb.txt +0 -156
- data/spec/handlers/examples/exception_handler_001.rb.txt +0 -59
- data/spec/handlers/examples/extend_handler_001.rb.txt +0 -19
- data/spec/handlers/examples/method_condition_handler_001.rb.txt +0 -10
- data/spec/handlers/examples/method_handler_001.rb.txt +0 -128
- data/spec/handlers/examples/mixin_handler_001.rb.txt +0 -40
- data/spec/handlers/examples/module_handler_001.rb.txt +0 -29
- data/spec/handlers/examples/private_constant_handler_001.rb.txt +0 -8
- data/spec/handlers/examples/process_handler_001.rb.txt +0 -11
- data/spec/handlers/examples/visibility_handler_001.rb.txt +0 -36
- data/spec/handlers/examples/yield_handler_001.rb.txt +0 -54
- data/spec/handlers/exception_handler_spec.rb +0 -49
- data/spec/handlers/extend_handler_spec.rb +0 -28
- data/spec/handlers/legacy_base_spec.rb +0 -128
- data/spec/handlers/method_condition_handler_spec.rb +0 -15
- data/spec/handlers/method_handler_spec.rb +0 -214
- data/spec/handlers/mixin_handler_spec.rb +0 -60
- data/spec/handlers/module_function_handler_spec.rb +0 -106
- data/spec/handlers/module_handler_spec.rb +0 -35
- data/spec/handlers/private_class_method_handler_spec.rb +0 -11
- data/spec/handlers/private_constant_handler_spec.rb +0 -25
- data/spec/handlers/processor_spec.rb +0 -35
- data/spec/handlers/public_class_method_handler_spec.rb +0 -11
- data/spec/handlers/ruby/base_spec.rb +0 -95
- data/spec/handlers/ruby/legacy/base_spec.rb +0 -84
- data/spec/handlers/spec_helper.rb +0 -33
- data/spec/handlers/visibility_handler_spec.rb +0 -44
- data/spec/handlers/yield_handler_spec.rb +0 -52
- data/spec/i18n/locale_spec.rb +0 -81
- data/spec/i18n/message_spec.rb +0 -52
- data/spec/i18n/messages_spec.rb +0 -67
- data/spec/i18n/pot_generator_spec.rb +0 -295
- data/spec/i18n/text_spec.rb +0 -184
- data/spec/logging_spec.rb +0 -44
- data/spec/options_spec.rb +0 -171
- data/spec/parser/base_spec.rb +0 -24
- data/spec/parser/c_parser_spec.rb +0 -236
- data/spec/parser/examples/array.c.txt +0 -6267
- data/spec/parser/examples/example1.rb.txt +0 -8
- data/spec/parser/examples/extrafile.c.txt +0 -8
- data/spec/parser/examples/file.c.txt +0 -28
- data/spec/parser/examples/multifile.c.txt +0 -22
- data/spec/parser/examples/namespace.cpp.txt +0 -68
- data/spec/parser/examples/override.c.txt +0 -424
- data/spec/parser/examples/parse_in_order_001.rb.txt +0 -2
- data/spec/parser/examples/parse_in_order_002.rb.txt +0 -2
- data/spec/parser/examples/tag_handler_001.rb.txt +0 -8
- data/spec/parser/ruby/ast_node_spec.rb +0 -33
- data/spec/parser/ruby/legacy/statement_list_spec.rb +0 -299
- data/spec/parser/ruby/legacy/token_list_spec.rb +0 -79
- data/spec/parser/ruby/ruby_parser_spec.rb +0 -508
- data/spec/parser/ruby/token_resolver_spec.rb +0 -165
- data/spec/parser/source_parser_spec.rb +0 -727
- data/spec/parser/tag_parsing_spec.rb +0 -17
- data/spec/rake/yardoc_task_spec.rb +0 -118
- data/spec/registry_spec.rb +0 -463
- data/spec/registry_store_spec.rb +0 -327
- data/spec/rubygems/doc_manager_spec.rb +0 -112
- data/spec/serializers/data/serialized_yardoc/checksums +0 -1
- data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
- data/spec/serializers/data/serialized_yardoc/proxy_types +0 -2
- data/spec/serializers/file_system_serializer_spec.rb +0 -145
- data/spec/serializers/spec_helper.rb +0 -2
- data/spec/serializers/yardoc_serializer_spec.rb +0 -78
- data/spec/server/adapter_spec.rb +0 -39
- data/spec/server/commands/base_spec.rb +0 -91
- data/spec/server/commands/library_command_spec.rb +0 -39
- data/spec/server/doc_server_helper_spec.rb +0 -72
- data/spec/server/doc_server_serializer_spec.rb +0 -60
- data/spec/server/rack_adapter_spec.rb +0 -21
- data/spec/server/router_spec.rb +0 -123
- data/spec/server/spec_helper.rb +0 -22
- data/spec/server/static_caching_spec.rb +0 -47
- data/spec/server/webrick_servlet_spec.rb +0 -20
- data/spec/server_spec.rb +0 -19
- data/spec/spec_helper.rb +0 -212
- data/spec/tags/default_factory_spec.rb +0 -168
- data/spec/tags/default_tag_spec.rb +0 -11
- data/spec/tags/directives_spec.rb +0 -463
- data/spec/tags/library_spec.rb +0 -48
- data/spec/tags/overload_tag_spec.rb +0 -53
- data/spec/tags/ref_tag_list_spec.rb +0 -53
- data/spec/tags/types_explainer_spec.rb +0 -203
- data/spec/templates/class_spec.rb +0 -45
- data/spec/templates/constant_spec.rb +0 -41
- data/spec/templates/engine_spec.rb +0 -131
- data/spec/templates/examples/class001.html +0 -308
- data/spec/templates/examples/class001.txt +0 -36
- data/spec/templates/examples/class002.html +0 -39
- data/spec/templates/examples/constant001.txt +0 -25
- data/spec/templates/examples/constant002.txt +0 -7
- data/spec/templates/examples/constant003.txt +0 -11
- data/spec/templates/examples/method001.html +0 -137
- data/spec/templates/examples/method001.txt +0 -35
- data/spec/templates/examples/method002.html +0 -91
- data/spec/templates/examples/method002.txt +0 -20
- data/spec/templates/examples/method003.html +0 -165
- data/spec/templates/examples/method003.txt +0 -45
- data/spec/templates/examples/method004.html +0 -48
- data/spec/templates/examples/method004.txt +0 -10
- data/spec/templates/examples/method005.html +0 -105
- data/spec/templates/examples/method005.txt +0 -33
- data/spec/templates/examples/method006.html +0 -108
- data/spec/templates/examples/method006.txt +0 -20
- data/spec/templates/examples/module001.dot +0 -33
- data/spec/templates/examples/module001.html +0 -833
- data/spec/templates/examples/module001.txt +0 -33
- data/spec/templates/examples/module002.html +0 -341
- data/spec/templates/examples/module003.html +0 -202
- data/spec/templates/examples/module004.html +0 -394
- data/spec/templates/examples/module005.html +0 -82
- data/spec/templates/examples/tag001.txt +0 -82
- data/spec/templates/helpers/base_helper_spec.rb +0 -171
- data/spec/templates/helpers/html_helper_spec.rb +0 -687
- data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +0 -65
- data/spec/templates/helpers/markup/rdoc_markup_spec.rb +0 -84
- data/spec/templates/helpers/markup_helper_spec.rb +0 -136
- data/spec/templates/helpers/method_helper_spec.rb +0 -107
- data/spec/templates/helpers/module_helper_spec.rb +0 -35
- data/spec/templates/helpers/shared_signature_examples.rb +0 -126
- data/spec/templates/helpers/text_helper_spec.rb +0 -65
- data/spec/templates/markup_processor_integrations/asciidoctor_spec.rb +0 -60
- data/spec/templates/markup_processor_integrations/integration_spec_helper.rb +0 -46
- data/spec/templates/markup_processor_integrations/rdoc_markdown_spec.rb +0 -59
- data/spec/templates/markup_processor_integrations/rdoc_spec.rb +0 -39
- data/spec/templates/markup_processor_integrations/redcarpet_spec.rb +0 -59
- data/spec/templates/markup_processor_integrations/redcloth_spec.rb +0 -48
- data/spec/templates/method_spec.rb +0 -118
- data/spec/templates/module_spec.rb +0 -203
- data/spec/templates/onefile_spec.rb +0 -66
- data/spec/templates/section_spec.rb +0 -144
- data/spec/templates/spec_helper.rb +0 -76
- data/spec/templates/tag_spec.rb +0 -52
- data/spec/templates/template_spec.rb +0 -410
- data/spec/verifier_spec.rb +0 -106
@@ -1,687 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require File.dirname(__FILE__) + "/shared_signature_examples"
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
RSpec.describe YARD::Templates::Helpers::HtmlHelper do
|
6
|
-
include YARD::Templates::Helpers::BaseHelper
|
7
|
-
include YARD::Templates::Helpers::HtmlHelper
|
8
|
-
include YARD::Templates::Helpers::MethodHelper
|
9
|
-
|
10
|
-
def options
|
11
|
-
Templates::TemplateOptions.new.tap do |o|
|
12
|
-
o.reset_defaults
|
13
|
-
o.default_return = nil
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "#h" do
|
18
|
-
it "uses #h to escape HTML" do
|
19
|
-
expect(h('Usage: foo "bar" <baz>')).to eq "Usage: foo "bar" <baz>"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "#charset" do
|
24
|
-
it "returns foo if LANG=foo" do
|
25
|
-
expect(ENV).to receive(:[]).with('LANG').and_return('shift_jis') if YARD.ruby18?
|
26
|
-
expect(Encoding.default_external).to receive(:name).and_return('shift_jis') if defined?(Encoding)
|
27
|
-
expect(charset).to eq 'shift_jis'
|
28
|
-
end
|
29
|
-
|
30
|
-
['US-ASCII', 'ASCII-7BIT', 'ASCII-8BIT'].each do |type|
|
31
|
-
it "converts #{type} to iso-8859-1" do
|
32
|
-
expect(ENV).to receive(:[]).with('LANG').and_return(type) if YARD.ruby18?
|
33
|
-
expect(Encoding.default_external).to receive(:name).and_return(type) if defined?(Encoding)
|
34
|
-
expect(charset).to eq 'iso-8859-1'
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
it "supports utf8 as an encoding value for utf-8" do
|
39
|
-
type = 'utf8'
|
40
|
-
expect(ENV).to receive(:[]).with('LANG').and_return(type) if YARD.ruby18?
|
41
|
-
expect(Encoding.default_external).to receive(:name).and_return(type) if defined?(Encoding)
|
42
|
-
expect(charset).to eq 'utf-8'
|
43
|
-
end
|
44
|
-
|
45
|
-
it "takes file encoding if there is a file" do
|
46
|
-
@file = OpenStruct.new(:contents => String.new('foo').force_encoding('sjis'))
|
47
|
-
# not the correct charset name, but good enough
|
48
|
-
expect(['Shift_JIS', 'Windows-31J']).to include(charset)
|
49
|
-
end if YARD.ruby19?
|
50
|
-
|
51
|
-
it "takes file encoding if there is a file" do
|
52
|
-
allow(ENV).to receive(:[]).with('LANG').and_return('utf-8') if YARD.ruby18?
|
53
|
-
@file = OpenStruct.new(:contents => 'foo')
|
54
|
-
expect(charset).to eq 'utf-8'
|
55
|
-
end if YARD.ruby18?
|
56
|
-
|
57
|
-
if YARD.ruby18?
|
58
|
-
it "returns utf-8 if no LANG env is set" do
|
59
|
-
expect(ENV).to receive(:[]).with('LANG').and_return(nil)
|
60
|
-
expect(charset).to eq 'utf-8'
|
61
|
-
end
|
62
|
-
|
63
|
-
it "only returns charset part of lang" do
|
64
|
-
expect(ENV).to receive(:[]).with('LANG').and_return('en_US.UTF-8')
|
65
|
-
expect(charset).to eq 'utf-8'
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe "#format_types" do
|
71
|
-
it "includes brackets by default" do
|
72
|
-
text = ["String"]
|
73
|
-
expect(self).to receive(:linkify).at_least(1).times.with("String", "String").and_return("String")
|
74
|
-
expect(format_types(text)).to eq format_types(text, true)
|
75
|
-
expect(format_types(text)).to eq "(<tt>String</tt>)"
|
76
|
-
end
|
77
|
-
|
78
|
-
it "avoids brackets if brackets=false" do
|
79
|
-
expect(self).to receive(:linkify).with("String", "String").and_return("String")
|
80
|
-
expect(self).to receive(:linkify).with("Symbol", "Symbol").and_return("Symbol")
|
81
|
-
expect(format_types(["String", "Symbol"], false)).to eq "<tt>String</tt>, <tt>Symbol</tt>"
|
82
|
-
end
|
83
|
-
|
84
|
-
{"String" => [["String"],
|
85
|
-
"<tt><a href=''>String</a></tt>"],
|
86
|
-
"A::B::C" => [["A::B::C"],
|
87
|
-
"<tt><a href=''>A::B::C</a></tt>"],
|
88
|
-
"Array<String>" => [["Array", "String"],
|
89
|
-
"<tt><a href=''>Array</a><<a href=''>String</a>></tt>"],
|
90
|
-
"Array<String, Symbol>" => [["Array", "String", "Symbol"],
|
91
|
-
"<tt><a href=''>Array</a><<a href=''>String</a>, <a href=''>Symbol</a>></tt>"],
|
92
|
-
"Array<{String => Array<Symbol>}>" => [["Array", "String", "Array", "Symbol"],
|
93
|
-
"<tt><a href=''>Array</a><{<a href=''>String</a> => " \
|
94
|
-
"<a href=''>Array</a><<a href=''>Symbol</a>>}></tt>"]}.each do |text, values|
|
95
|
-
it "links all classes in #{text}" do
|
96
|
-
if text.count('<') > 0
|
97
|
-
expect(self).to receive(:h).with('<').at_least(text.count('<')).times.and_return("<")
|
98
|
-
end
|
99
|
-
if text.count('>') > 0
|
100
|
-
expect(self).to receive(:h).with('>').at_least(text.count('>')).times.and_return(">")
|
101
|
-
end
|
102
|
-
values[0].each {|v| expect(self).to receive(:linkify).with(v, v).and_return("<a href=''>#{v}</a>") }
|
103
|
-
expect(format_types([text], false)).to eq values[1]
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
describe "#htmlify" do
|
109
|
-
it "does not use hard breaks for textile markup (RedCloth specific)" do
|
110
|
-
begin; require 'redcloth'; rescue LoadError; pending 'test requires redcloth gem' end
|
111
|
-
expect(htmlify("A\nB", :textile)).not_to include("<br")
|
112
|
-
end
|
113
|
-
|
114
|
-
it "uses hard breaks for textile_strict markup (RedCloth specific)" do
|
115
|
-
begin; require 'redcloth'; rescue LoadError; pending 'test requires redcloth gem' end
|
116
|
-
expect(htmlify("A\nB", :textile_strict)).to include("<br")
|
117
|
-
end
|
118
|
-
|
119
|
-
it "handles various encodings" do
|
120
|
-
allow(self).to receive(:object).and_return(Registry.root)
|
121
|
-
text = String.new("\xB0\xB1")
|
122
|
-
if defined?(Encoding)
|
123
|
-
utf8 = Encoding.find('utf-8')
|
124
|
-
|
125
|
-
Encoding.default_internal = utf8 unless Encoding.default_internal == utf8
|
126
|
-
text = text.force_encoding('binary')
|
127
|
-
end
|
128
|
-
htmlify(text, :text)
|
129
|
-
# TODO: add more encoding tests
|
130
|
-
end
|
131
|
-
|
132
|
-
it "returns pre-formatted text with :pre markup" do
|
133
|
-
expect(htmlify("fo\no\n\nbar<>", :pre)).to eq "<pre>fo\no\n\nbar<></pre>"
|
134
|
-
end
|
135
|
-
|
136
|
-
it "returns regular text with :text markup" do
|
137
|
-
expect(htmlify("fo\no\n\nbar<>", :text)).to eq "fo<br/>o<br/><br/>bar<>"
|
138
|
-
end
|
139
|
-
|
140
|
-
it "returns unmodified text with :none markup" do
|
141
|
-
expect(htmlify("fo\no\n\nbar<>", :none)).to eq "fo\no\n\nbar<>"
|
142
|
-
end
|
143
|
-
|
144
|
-
it "highlights ruby if markup is :ruby" do
|
145
|
-
expect(htmlify("class Foo; end", :ruby)).to match(/\A<pre class="code ruby"><span/)
|
146
|
-
end
|
147
|
-
|
148
|
-
it "includes file and htmlifies it" do
|
149
|
-
load_markup_provider(:rdoc)
|
150
|
-
expect(File).to receive(:file?).with('foo.rdoc').and_return(true)
|
151
|
-
expect(File).to receive(:read).with('foo.rdoc').and_return('HI')
|
152
|
-
expect(htmlify("{include:file:foo.rdoc}", :rdoc).gsub(/\s+/, '')).to eq "<p>HI</p>"
|
153
|
-
end
|
154
|
-
|
155
|
-
it "allows inline includes for {include:} in the middle of a line" do
|
156
|
-
load_markup_provider(:rdoc)
|
157
|
-
expect(File).to receive(:file?).with('foo.rdoc').and_return(true)
|
158
|
-
expect(File).to receive(:read).with('foo.rdoc').and_return('HI')
|
159
|
-
expect(htmlify("test {include:file:foo.rdoc}", :rdoc).gsub(/[\r?\n]+/, '')).to eq '<p>test HI</p>'
|
160
|
-
end
|
161
|
-
|
162
|
-
it "autolinks URLs (markdown specific)" do
|
163
|
-
log.enter_level(Logger::FATAL) do
|
164
|
-
unless markup_class(:markdown).to_s == "RedcarpetCompat"
|
165
|
-
pending 'This test depends on a markdown engine that supports autolinking'
|
166
|
-
end
|
167
|
-
end
|
168
|
-
expect(htmlify('http://example.com', :markdown).chomp.gsub('/', '/')).to eq(
|
169
|
-
'<p><a href="http://example.com">http://example.com</a></p>'
|
170
|
-
)
|
171
|
-
end
|
172
|
-
|
173
|
-
it "does not autolink URLs inside of {} (markdown specific)" do
|
174
|
-
log.enter_level(Logger::FATAL) do
|
175
|
-
pending 'This test depends on markdown' unless markup_class(:markdown)
|
176
|
-
end
|
177
|
-
expect(htmlify('{http://example.com Title}', :markdown).chomp).to match(
|
178
|
-
%r{<p><a href="http://example.com".*>Title</a></p>}
|
179
|
-
)
|
180
|
-
expect(htmlify('{http://example.com}', :markdown).chomp).to match(
|
181
|
-
%r{<p><a href="http://example.com".*>http://example.com</a></p>}
|
182
|
-
)
|
183
|
-
end
|
184
|
-
|
185
|
-
it "creates tables (markdown specific)" do
|
186
|
-
log.enter_level(Logger::FATAL) do
|
187
|
-
supports_table = %w(RedcarpetCompat Kramdown::Document)
|
188
|
-
unless supports_table.include?(markup_class(:markdown).to_s)
|
189
|
-
pending "This test depends on a markdown engine that supports tables"
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
markdown = <<-EOF.strip
|
194
|
-
City | State | Country
|
195
|
-
--------|-------|--------
|
196
|
-
Raleigh | NC | US
|
197
|
-
Seattle | WA | US
|
198
|
-
EOF
|
199
|
-
|
200
|
-
html = htmlify(markdown, :markdown)
|
201
|
-
expect(html).to match(/<table>/)
|
202
|
-
expect(html).to match %r{<th>City</th>}
|
203
|
-
expect(html).to match %r{<td>NC</td>}
|
204
|
-
end
|
205
|
-
|
206
|
-
it "handles fenced code blocks (Redcarpet specific)" do
|
207
|
-
log.enter_level(Logger::FATAL) do
|
208
|
-
unless markup_class(:markdown).to_s == 'RedcarpetCompat'
|
209
|
-
pending 'This test is Redcarpet specific'
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
markdown = "Introduction:\n```ruby\nputs\n\nputs\n```"
|
214
|
-
html = htmlify(markdown, :markdown)
|
215
|
-
expect(html).to match %r{^<p>Introduction:</p>.*<code class="ruby">}m
|
216
|
-
end
|
217
|
-
|
218
|
-
it "sets env and env-yard attributes (AsciiDoc specific)" do
|
219
|
-
adoc = <<-EOF.strip.gsub(/^ +/, "") # strip and unindent
|
220
|
-
ifdef::env[]
|
221
|
-
Attribute "env" is set, and its value is "{env}".
|
222
|
-
endif::[]
|
223
|
-
|
224
|
-
ifdef::env-yard[]
|
225
|
-
Attribute "env-yard" is set, and its value is "{env-yard}".
|
226
|
-
endif::[]
|
227
|
-
EOF
|
228
|
-
html = htmlify(adoc, :asciidoc)
|
229
|
-
expect(html).to match(/"env" is set, and its value is "yard"./)
|
230
|
-
expect(html).to match(/"env-yard" is set, and its value is ""./)
|
231
|
-
end
|
232
|
-
|
233
|
-
it "should not include the document title from the AsciiDoc header" do
|
234
|
-
adoc = <<-EOF.strip.gsub(/^ +/, "") # strip and unindent
|
235
|
-
= Project Name
|
236
|
-
|
237
|
-
Introduction.
|
238
|
-
|
239
|
-
== Installation
|
240
|
-
|
241
|
-
Installation instructions.
|
242
|
-
|
243
|
-
== Usage
|
244
|
-
|
245
|
-
Usage instructions.
|
246
|
-
EOF
|
247
|
-
html = htmlify(adoc, :asciidoc)
|
248
|
-
expect(html).to_not match(/Project Name/)
|
249
|
-
expect(html).to include(%(<h2 id="_installation">Installation</h2>))
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
describe "#link_object" do
|
254
|
-
let(:object) { CodeObjects::NamespaceObject.new(nil, :YARD) }
|
255
|
-
|
256
|
-
it "returns the object path if there's no serializer and no title" do
|
257
|
-
allow(self).to receive(:serializer).and_return(nil)
|
258
|
-
expect(link_object(CodeObjects::NamespaceObject.new(nil, :YARD))).to eq "YARD"
|
259
|
-
end
|
260
|
-
|
261
|
-
it "returns the title if there's a title but no serializer" do
|
262
|
-
allow(self).to receive(:serializer).and_return(nil)
|
263
|
-
expect(link_object(CodeObjects::NamespaceObject.new(nil, :YARD), 'title')).to eq "title"
|
264
|
-
end
|
265
|
-
|
266
|
-
it "links objects from overload tag" do
|
267
|
-
YARD.parse_string <<-'eof'
|
268
|
-
module Foo
|
269
|
-
class Bar; def a; end end
|
270
|
-
class Baz
|
271
|
-
# @overload a
|
272
|
-
def a; end
|
273
|
-
end
|
274
|
-
end
|
275
|
-
eof
|
276
|
-
obj = Registry.at('Foo::Baz#a').tag(:overload)
|
277
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
278
|
-
allow(self).to receive(:object).and_return(obj)
|
279
|
-
expect(link_object("Bar#a")).to match(/href="Bar.html#a-instance_method"/)
|
280
|
-
end
|
281
|
-
|
282
|
-
it "uses relative path in title" do
|
283
|
-
CodeObjects::ModuleObject.new(:root, :YARD)
|
284
|
-
CodeObjects::ClassObject.new(P('YARD'), :Bar)
|
285
|
-
allow(self).to receive(:object).and_return(CodeObjects::ModuleObject.new(P('YARD'), :Foo))
|
286
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
287
|
-
expect(link_object("Bar")).to match %r{>Bar</a>}
|
288
|
-
end
|
289
|
-
|
290
|
-
it "uses #title if overridden" do
|
291
|
-
CodeObjects::ModuleObject.new(:root, :YARD)
|
292
|
-
CodeObjects::ClassObject.new(P('YARD'), :Bar)
|
293
|
-
allow(Registry.at('YARD::Bar')).to receive(:title).and_return('TITLE!')
|
294
|
-
allow(self).to receive(:object).and_return(Registry.at('YARD::Bar'))
|
295
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
296
|
-
expect(link_object("Bar")).to match %r{>TITLE!</a>}
|
297
|
-
end
|
298
|
-
|
299
|
-
it "uses relative path to parent class in title" do
|
300
|
-
root = CodeObjects::ModuleObject.new(:root, :YARD)
|
301
|
-
obj = CodeObjects::ModuleObject.new(root, :SubModule)
|
302
|
-
allow(self).to receive(:object).and_return(obj)
|
303
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
304
|
-
expect(link_object("YARD")).to match %r{>YARD</a>}
|
305
|
-
end
|
306
|
-
|
307
|
-
it "uses Klass.foo when linking to class method in current namespace" do
|
308
|
-
root = CodeObjects::ModuleObject.new(:root, :Klass)
|
309
|
-
CodeObjects::MethodObject.new(root, :foo, :class)
|
310
|
-
allow(self).to receive(:object).and_return(root)
|
311
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
312
|
-
expect(link_object("foo")).to match %r{>Klass.foo</a>}
|
313
|
-
end
|
314
|
-
|
315
|
-
it "escapes method name in title" do
|
316
|
-
YARD.parse_string <<-'eof'
|
317
|
-
class Array
|
318
|
-
def &(other)
|
319
|
-
end
|
320
|
-
end
|
321
|
-
eof
|
322
|
-
obj = Registry.at('Array#&')
|
323
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
324
|
-
allow(self).to receive(:object).and_return(obj)
|
325
|
-
expect(link_object("Array#&")).to match(/title="Array#& \(method\)"/)
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
describe "#url_for" do
|
330
|
-
before { Registry.clear }
|
331
|
-
|
332
|
-
it "returns nil if serializer is nil" do
|
333
|
-
allow(self).to receive(:serializer).and_return nil
|
334
|
-
allow(self).to receive(:object).and_return Registry.root
|
335
|
-
expect(url_for(P("Mod::Class#meth"))).to be nil
|
336
|
-
end
|
337
|
-
|
338
|
-
it "returns nil if object is hidden" do
|
339
|
-
yard = CodeObjects::ModuleObject.new(:root, :YARD)
|
340
|
-
|
341
|
-
allow(self).to receive(:serializer).and_return(Serializers::FileSystemSerializer.new)
|
342
|
-
allow(self).to receive(:object).and_return Registry.root
|
343
|
-
allow(self).to receive(:options).and_return OpenStruct.new(:verifier => Verifier.new('false'))
|
344
|
-
|
345
|
-
expect(url_for(yard)).to be nil
|
346
|
-
end
|
347
|
-
|
348
|
-
it "returns nil if serializer does not implement #serialized_path" do
|
349
|
-
allow(self).to receive(:serializer).and_return Serializers::Base.new
|
350
|
-
allow(self).to receive(:object).and_return Registry.root
|
351
|
-
expect(url_for(P("Mod::Class#meth"))).to be nil
|
352
|
-
end
|
353
|
-
|
354
|
-
it "links to a path/file for a namespace object" do
|
355
|
-
allow(self).to receive(:serializer).and_return Serializers::FileSystemSerializer.new
|
356
|
-
allow(self).to receive(:object).and_return Registry.root
|
357
|
-
|
358
|
-
yard = CodeObjects::ModuleObject.new(:root, :YARD)
|
359
|
-
expect(url_for(yard)).to eq 'YARD.html'
|
360
|
-
end
|
361
|
-
|
362
|
-
it "links to the object's namespace path/file and use the object as the anchor" do
|
363
|
-
allow(self).to receive(:serializer).and_return Serializers::FileSystemSerializer.new
|
364
|
-
allow(self).to receive(:object).and_return Registry.root
|
365
|
-
|
366
|
-
yard = CodeObjects::ModuleObject.new(:root, :YARD)
|
367
|
-
meth = CodeObjects::MethodObject.new(yard, :meth)
|
368
|
-
expect(url_for(meth)).to eq 'YARD.html#meth-instance_method'
|
369
|
-
end
|
370
|
-
|
371
|
-
it "properly urlencodes methods with punctuation in links" do
|
372
|
-
obj = CodeObjects::MethodObject.new(nil, :/)
|
373
|
-
serializer = double(:serializer, :serialized_path => "file.html")
|
374
|
-
allow(self).to receive(:serializer).and_return serializer
|
375
|
-
allow(self).to receive(:object).and_return obj
|
376
|
-
expect(url_for(obj)).to eq "#%2F-instance_method"
|
377
|
-
end
|
378
|
-
end
|
379
|
-
|
380
|
-
describe "#anchor_for" do
|
381
|
-
it "does not urlencode data when called directly" do
|
382
|
-
obj = CodeObjects::MethodObject.new(nil, :/)
|
383
|
-
expect(anchor_for(obj)).to eq "/-instance_method"
|
384
|
-
end
|
385
|
-
end
|
386
|
-
|
387
|
-
describe "#resolve_links" do
|
388
|
-
def parse_link(link)
|
389
|
-
results = {}
|
390
|
-
link =~ %r{<a (.+?)>(.+?)</a>}m
|
391
|
-
params = $1
|
392
|
-
results[:inner_text] = $2
|
393
|
-
params.scan(/\s*(\S+?)=['"](.+?)['"]\s*/).each do |key, value|
|
394
|
-
results[key.to_sym] = value.gsub(/^["'](.+)["']$/, '\1')
|
395
|
-
end
|
396
|
-
results
|
397
|
-
end
|
398
|
-
|
399
|
-
it "escapes {} syntax with backslash (\\{foo bar})" do
|
400
|
-
input = '\{foo bar} \{XYZ} \{file:FOO} $\{N-M}'
|
401
|
-
output = '{foo bar} {XYZ} {file:FOO} ${N-M}'
|
402
|
-
expect(resolve_links(input)).to eq output
|
403
|
-
end
|
404
|
-
|
405
|
-
it "escapes {} syntax with ! (!{foo bar})" do
|
406
|
-
input = '!{foo bar} !{XYZ} !{file:FOO} $!{N-M}'
|
407
|
-
output = '{foo bar} {XYZ} {file:FOO} ${N-M}'
|
408
|
-
expect(resolve_links(input)).to eq output
|
409
|
-
end
|
410
|
-
|
411
|
-
it "links static files with file: prefix" do
|
412
|
-
allow(self).to receive(:serializer).and_return Serializers::FileSystemSerializer.new
|
413
|
-
allow(self).to receive(:object).and_return Registry.root
|
414
|
-
|
415
|
-
expect(parse_link(resolve_links("{file:TEST.txt#abc}"))).to eq(
|
416
|
-
:inner_text => "TEST",
|
417
|
-
:title => "TEST",
|
418
|
-
:href => "file.TEST.html#abc"
|
419
|
-
)
|
420
|
-
expect(parse_link(resolve_links("{file:TEST.txt title}"))).to eq(
|
421
|
-
:inner_text => "title",
|
422
|
-
:title => "title",
|
423
|
-
:href => "file.TEST.html"
|
424
|
-
)
|
425
|
-
end
|
426
|
-
|
427
|
-
it "creates regular links with http:// or https:// prefixes" do
|
428
|
-
expect(parse_link(resolve_links("{http://example.com}"))).to eq(
|
429
|
-
:inner_text => "http://example.com",
|
430
|
-
:target => "_parent",
|
431
|
-
:href => "http://example.com",
|
432
|
-
:title => "http://example.com"
|
433
|
-
)
|
434
|
-
expect(parse_link(resolve_links("{http://example.com title}"))).to eq(
|
435
|
-
:inner_text => "title",
|
436
|
-
:target => "_parent",
|
437
|
-
:href => "http://example.com",
|
438
|
-
:title => "title"
|
439
|
-
)
|
440
|
-
end
|
441
|
-
|
442
|
-
it "creates mailto links with mailto: prefixes" do
|
443
|
-
expect(parse_link(resolve_links('{mailto:joanna@example.com}'))).to eq(
|
444
|
-
:inner_text => 'mailto:joanna@example.com',
|
445
|
-
:target => '_parent',
|
446
|
-
:href => 'mailto:joanna@example.com',
|
447
|
-
:title => 'mailto:joanna@example.com'
|
448
|
-
)
|
449
|
-
expect(parse_link(resolve_links('{mailto:steve@example.com Steve}'))).to eq(
|
450
|
-
:inner_text => 'Steve',
|
451
|
-
:target => '_parent',
|
452
|
-
:href => 'mailto:steve@example.com',
|
453
|
-
:title => 'Steve'
|
454
|
-
)
|
455
|
-
end
|
456
|
-
|
457
|
-
it "ignores {links} that begin with |...|" do
|
458
|
-
expect(resolve_links("{|x|x == 1}")).to eq "{|x|x == 1}"
|
459
|
-
end
|
460
|
-
|
461
|
-
it "gracefully ignores {} in links" do
|
462
|
-
allow(self).to receive(:linkify).with('Foo', 'Foo').and_return('FOO')
|
463
|
-
expect(resolve_links("{} {} {Foo Foo}")).to eq '{} {} FOO'
|
464
|
-
end
|
465
|
-
|
466
|
-
%w(tt code pre).each do |tag|
|
467
|
-
it "ignores links in <#{tag}>" do
|
468
|
-
text = "<#{tag}>{Foo}</#{tag}>"
|
469
|
-
expect(resolve_links(text)).to eq text
|
470
|
-
end
|
471
|
-
end
|
472
|
-
|
473
|
-
it "resolves {Name}" do
|
474
|
-
expect(self).to receive(:link_file).with('TEST', nil, nil).and_return('')
|
475
|
-
resolve_links("{file:TEST}")
|
476
|
-
end
|
477
|
-
|
478
|
-
it "resolves ({Name})" do
|
479
|
-
expect(self).to receive(:link_file).with('TEST', nil, nil).and_return('')
|
480
|
-
resolve_links("({file:TEST})")
|
481
|
-
end
|
482
|
-
|
483
|
-
it "resolves link with newline in title-part" do
|
484
|
-
expect(parse_link(resolve_links("{http://example.com foo\nbar}"))).to eq(
|
485
|
-
:inner_text => "foo bar",
|
486
|
-
:target => "_parent",
|
487
|
-
:href => "http://example.com",
|
488
|
-
:title => "foo bar"
|
489
|
-
)
|
490
|
-
end
|
491
|
-
|
492
|
-
it "resolves links to methods whose names have been escaped" do
|
493
|
-
expect(self).to receive(:linkify).with('Object#<<', nil).and_return('')
|
494
|
-
resolve_links("{Object#<<}")
|
495
|
-
end
|
496
|
-
|
497
|
-
it "warns about missing reference at right file location for object" do
|
498
|
-
YARD.parse_string <<-eof
|
499
|
-
# Comments here
|
500
|
-
# And a reference to {InvalidObject}
|
501
|
-
class MyObject; end
|
502
|
-
eof
|
503
|
-
logger = double(:log)
|
504
|
-
expect(logger).to receive(:warn).ordered.with(
|
505
|
-
"In file `(stdin)':2: Cannot resolve link to InvalidObject from text:\n\t...{InvalidObject}"
|
506
|
-
)
|
507
|
-
allow(self).to receive(:log).and_return(logger)
|
508
|
-
allow(self).to receive(:object).and_return(Registry.at('MyObject'))
|
509
|
-
resolve_links(object.docstring)
|
510
|
-
end
|
511
|
-
|
512
|
-
it "shows ellipsis on either side if there is more on the line in a reference warning" do
|
513
|
-
YARD.parse_string <<-eof
|
514
|
-
# {InvalidObject1} beginning of line
|
515
|
-
# end of line {InvalidObject2}
|
516
|
-
# Middle of {InvalidObject3} line
|
517
|
-
# {InvalidObject4}
|
518
|
-
class MyObject; end
|
519
|
-
eof
|
520
|
-
logger = double(:log)
|
521
|
-
expect(logger).to receive(:warn).ordered.with("In file `(stdin)':1: Cannot resolve link to InvalidObject1 from text:\n\t{InvalidObject1}...")
|
522
|
-
expect(logger).to receive(:warn).ordered.with("In file `(stdin)':2: Cannot resolve link to InvalidObject2 from text:\n\t...{InvalidObject2}")
|
523
|
-
expect(logger).to receive(:warn).ordered.with("In file `(stdin)':3: Cannot resolve link to InvalidObject3 from text:\n\t...{InvalidObject3}...")
|
524
|
-
expect(logger).to receive(:warn).ordered.with("In file `(stdin)':4: Cannot resolve link to InvalidObject4 from text:\n\t{InvalidObject4}")
|
525
|
-
allow(self).to receive(:log).and_return(logger)
|
526
|
-
allow(self).to receive(:object).and_return(Registry.at('MyObject'))
|
527
|
-
resolve_links(object.docstring)
|
528
|
-
end
|
529
|
-
|
530
|
-
it "warns about missing reference for file template (no object)" do
|
531
|
-
@file = CodeObjects::ExtraFileObject.new('myfile.txt', '')
|
532
|
-
logger = double(:log)
|
533
|
-
expect(logger).to receive(:warn).ordered.with("In file `myfile.txt':3: Cannot resolve link to InvalidObject from text:\n\t...{InvalidObject Some Title}")
|
534
|
-
allow(self).to receive(:log).and_return(logger)
|
535
|
-
allow(self).to receive(:object).and_return(Registry.root)
|
536
|
-
resolve_links(<<-eof)
|
537
|
-
Hello world
|
538
|
-
This is a line
|
539
|
-
And {InvalidObject Some Title}
|
540
|
-
And more.
|
541
|
-
eof
|
542
|
-
end
|
543
|
-
end
|
544
|
-
|
545
|
-
describe "#signature" do
|
546
|
-
before do
|
547
|
-
arrow = "⇒"
|
548
|
-
@results = {
|
549
|
-
:regular => "#<strong>foo</strong> #{arrow} Object",
|
550
|
-
:default_return => "#<strong>foo</strong> #{arrow} Hello",
|
551
|
-
:no_default_return => "#<strong>foo</strong>",
|
552
|
-
:private_class => ".<strong>foo</strong> #{arrow} Object <span class=\"extras\">(private)</span>",
|
553
|
-
:single => "#<strong>foo</strong> #{arrow} String",
|
554
|
-
:two_types => "#<strong>foo</strong> #{arrow} String, Symbol",
|
555
|
-
:two_types_multitag => "#<strong>foo</strong> #{arrow} String, Symbol",
|
556
|
-
:type_nil => "#<strong>foo</strong> #{arrow} Type<sup>?</sup>",
|
557
|
-
:type_array => "#<strong>foo</strong> #{arrow} Type<sup>+</sup>",
|
558
|
-
:multitype => "#<strong>foo</strong> #{arrow} Type, ...",
|
559
|
-
:void => "#<strong>foo</strong> #{arrow} void",
|
560
|
-
:hide_void => "#<strong>foo</strong>",
|
561
|
-
:block => "#<strong>foo</strong> {|a, b, c| ... } #{arrow} Object",
|
562
|
-
:empty_overload => "#<strong>foobar</strong> #{arrow} String"
|
563
|
-
}
|
564
|
-
end
|
565
|
-
|
566
|
-
def format_types(types, _brackets = false) types.join(", ") end
|
567
|
-
def signature(obj, link = false) super(obj, link).strip end
|
568
|
-
|
569
|
-
it_should_behave_like "signature"
|
570
|
-
|
571
|
-
it "links to regular method if overload name does not have the same method name" do
|
572
|
-
YARD.parse_string <<-eof
|
573
|
-
class Foo
|
574
|
-
# @overload bar(a, b, c)
|
575
|
-
def foo; end
|
576
|
-
end
|
577
|
-
eof
|
578
|
-
serializer = double(:serializer)
|
579
|
-
allow(serializer).to receive(:serialized_path).with(Registry.at('Foo')).and_return('')
|
580
|
-
allow(self).to receive(:serializer).and_return(serializer)
|
581
|
-
allow(self).to receive(:object).and_return(Registry.at('Foo'))
|
582
|
-
expect(signature(Registry.at('Foo#foo').tag(:overload), true)).to eq(
|
583
|
-
"<a href=\"#foo-instance_method\" title=\"#bar (instance method)\">#<strong>bar</strong>(a, b, c) </a>"
|
584
|
-
)
|
585
|
-
end
|
586
|
-
end
|
587
|
-
|
588
|
-
describe "#html_syntax_highlight" do
|
589
|
-
subject do
|
590
|
-
obj = OpenStruct.new
|
591
|
-
obj.options = options
|
592
|
-
obj.object = Registry.root
|
593
|
-
obj.extend(Templates::Helpers::HtmlHelper)
|
594
|
-
obj
|
595
|
-
end
|
596
|
-
|
597
|
-
it "returns empty string on nil input" do
|
598
|
-
expect(subject.html_syntax_highlight(nil)).to eq ''
|
599
|
-
end
|
600
|
-
|
601
|
-
it "calls #html_syntax_highlight_ruby by default" do
|
602
|
-
Registry.root.source_type = nil
|
603
|
-
expect(subject).to receive(:html_syntax_highlight_ruby).with('def x; end')
|
604
|
-
subject.html_syntax_highlight('def x; end')
|
605
|
-
end
|
606
|
-
|
607
|
-
it "calls #html_syntax_highlight_NAME if there's an object with a #source_type" do
|
608
|
-
subject.object = OpenStruct.new(:source_type => :NAME)
|
609
|
-
expect(subject).to receive(:html_markup_html) {|text| text }
|
610
|
-
expect(subject).to receive(:html_syntax_highlight_NAME).and_return("foobar")
|
611
|
-
expect(subject.htmlify('<pre><code>def x; end</code></pre>', :html)).to eq(
|
612
|
-
'<pre class="code NAME"><code class="NAME">foobar</code></pre>'
|
613
|
-
)
|
614
|
-
end
|
615
|
-
|
616
|
-
it "adds !!!LANG to className in outputted pre tag" do
|
617
|
-
subject.object = OpenStruct.new(:source_type => :LANG)
|
618
|
-
expect(subject).to receive(:html_markup_html) {|text| text }
|
619
|
-
expect(subject).to receive(:html_syntax_highlight_LANG).and_return("foobar")
|
620
|
-
expect(subject.htmlify("<pre><code>!!!LANG\ndef x; end</code></pre>", :html)).to eq(
|
621
|
-
'<pre class="code LANG"><code class="LANG">foobar</code></pre>'
|
622
|
-
)
|
623
|
-
end
|
624
|
-
|
625
|
-
it "calls html_syntax_highlight_NAME if source starts with !!!NAME" do
|
626
|
-
expect(subject).to receive(:html_syntax_highlight_NAME).and_return("foobar")
|
627
|
-
expect(subject.html_syntax_highlight(<<-eof
|
628
|
-
!!!NAME
|
629
|
-
def x; end
|
630
|
-
eof
|
631
|
-
)).to eq "foobar"
|
632
|
-
end
|
633
|
-
|
634
|
-
it "does not highlight if highlight option is false" do
|
635
|
-
subject.options.highlight = false
|
636
|
-
expect(subject).not_to receive(:html_syntax_highlight_ruby)
|
637
|
-
expect(subject.html_syntax_highlight('def x; end')).to eq 'def x; end'
|
638
|
-
end
|
639
|
-
|
640
|
-
it "does not highlight if there is no highlight method specified by !!!NAME" do
|
641
|
-
def subject.respond_to?(method, include_all = false)
|
642
|
-
return false if method == 'html_syntax_highlight_NAME'
|
643
|
-
super
|
644
|
-
end
|
645
|
-
expect(subject).not_to receive(:html_syntax_highlight_NAME)
|
646
|
-
expect(subject.html_syntax_highlight("!!!NAME\ndef x; end")).to eq "def x; end"
|
647
|
-
end
|
648
|
-
|
649
|
-
it "highlights as ruby if htmlify(text, :ruby) is called" do
|
650
|
-
expect(subject).to receive(:html_syntax_highlight_ruby).with('def x; end').and_return('x')
|
651
|
-
expect(subject.htmlify('def x; end', :ruby)).to eq '<pre class="code ruby">x</pre>'
|
652
|
-
end
|
653
|
-
|
654
|
-
it "does not prioritize object source type when called directly" do
|
655
|
-
expect(subject).to receive(:html_syntax_highlight_ruby).with('def x; end').and_return('x')
|
656
|
-
subject.object = OpenStruct.new(:source_type => :c)
|
657
|
-
expect(subject.html_syntax_highlight("def x; end")).to eq "x"
|
658
|
-
end
|
659
|
-
|
660
|
-
it "doesn't escape code snippets twice" do
|
661
|
-
expect(subject.htmlify('<pre lang="foo"><code>{"foo" => 1}</code></pre>', :html)).to eq(
|
662
|
-
'<pre class="code foo"><code class="foo">{"foo" => 1}</code></pre>'
|
663
|
-
)
|
664
|
-
end
|
665
|
-
|
666
|
-
it "highlights source when matching a pre lang= tag" do
|
667
|
-
expect(subject.htmlify('<pre lang="foo"><code>x = 1</code></pre>', :html)).to eq(
|
668
|
-
'<pre class="code foo"><code class="foo">x = 1</code></pre>'
|
669
|
-
)
|
670
|
-
end
|
671
|
-
|
672
|
-
it "highlights source when matching a code class= tag" do
|
673
|
-
expect(subject.htmlify('<pre><code class="foo">x = 1</code></pre>', :html)).to eq(
|
674
|
-
'<pre class="code foo"><code class="foo">x = 1</code></pre>'
|
675
|
-
)
|
676
|
-
end
|
677
|
-
end
|
678
|
-
|
679
|
-
describe "#link_url" do
|
680
|
-
it "adds target if scheme is provided" do
|
681
|
-
expect(link_url("http://url.com")).to include(" target=\"_parent\"")
|
682
|
-
expect(link_url("https://url.com")).to include(" target=\"_parent\"")
|
683
|
-
expect(link_url("irc://url.com")).to include(" target=\"_parent\"")
|
684
|
-
expect(link_url("../not/scheme")).not_to include("target")
|
685
|
-
end
|
686
|
-
end
|
687
|
-
end
|