jazzy 0.12.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/Gemfile.lock +9 -11
- data/lib/jazzy/config.rb +1 -1
- data/lib/jazzy/doc_builder.rb +3 -2
- data/lib/jazzy/gem_version.rb +1 -1
- data/lib/jazzy/jazzy_markdown.rb +3 -4
- data/lib/jazzy/source_declaration.rb +32 -0
- data/lib/jazzy/source_declaration/type.rb +4 -0
- data/lib/jazzy/source_mark.rb +11 -0
- data/lib/jazzy/sourcekitten.rb +172 -59
- data/lib/jazzy/stats.rb +4 -0
- data/lib/jazzy/themes/apple/assets/css/jazzy.css.scss +36 -2
- data/lib/jazzy/themes/apple/templates/task.mustache +4 -3
- data/lib/jazzy/themes/fullwidth/assets/css/jazzy.css.scss +35 -7
- data/lib/jazzy/themes/fullwidth/templates/doc.mustache +1 -1
- data/lib/jazzy/themes/fullwidth/templates/task.mustache +4 -3
- data/lib/jazzy/themes/jony/assets/css/jazzy.css.scss +35 -2
- data/lib/jazzy/themes/jony/templates/task.mustache +4 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d55202d57dfdb0b3aad10b90f122d34e10a529bf73dde92ce2d0063473c011fe
|
4
|
+
data.tar.gz: 221dd32f5dac077431fe1d449b857966b2b9dcfc8a5f4cd0cefd61e1862558c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf1b7616ead246ea0e45a0c1e3148fc8cf3a04600c295c5bec0c7b5cff530296b9deb50f6b9c429940c1bf12dce036d4863038e55b3f892e748e5e99e7f3fc65
|
7
|
+
data.tar.gz: e7725d323d9550f97f27a6bd2e0c89d674cda5d4199dc6433e38f7b78e01f58388d8af8842c28293abb9ce4434068e24fbf1483941e2ab771787db7220dd788a
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
+
## 0.13.0
|
2
|
+
|
3
|
+
##### Breaking
|
4
|
+
|
5
|
+
* None.
|
6
|
+
|
7
|
+
##### Enhancements
|
8
|
+
|
9
|
+
* Add section headings for members added by Swift conditional conformances.
|
10
|
+
[John Fairhurst](https://github.com/johnfairh)
|
11
|
+
[#717](https://github.com/realm/jazzy/issues/717)
|
12
|
+
|
13
|
+
* Parse markdown in MARK comments, make the html available to themes via
|
14
|
+
`name_html` mustache tag key for section headings.
|
15
|
+
[John Fairhurst](https://github.com/johnfairh)
|
16
|
+
|
17
|
+
* Include protocol conformances added by extensions in Swift docs.
|
18
|
+
[John Fairhurst](https://github.com/johnfairh)
|
19
|
+
|
20
|
+
##### Bug Fixes
|
21
|
+
|
22
|
+
* Render bullet lists correctly when followed by a callout.
|
23
|
+
[John Fairhurst](https://github.com/johnfairh)
|
24
|
+
[#785](https://github.com/realm/jazzy/issues/785)
|
25
|
+
|
26
|
+
* Render markup of text inside double quotes.
|
27
|
+
[John Fairhurst](https://github.com/johnfairh)
|
28
|
+
[#992](https://github.com/realm/jazzy/issues/992)
|
29
|
+
|
30
|
+
* Fix `sourcekitten_sourcefile` used from config file.
|
31
|
+
[John Fairhurst](https://github.com/johnfairh)
|
32
|
+
[#1137](https://github.com/realm/jazzy/issues/1137)
|
33
|
+
|
1
34
|
## 0.12.0
|
2
35
|
|
3
36
|
##### Breaking
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
jazzy (0.
|
4
|
+
jazzy (0.13.0)
|
5
5
|
cocoapods (~> 1.5)
|
6
6
|
mustache (~> 1.1)
|
7
7
|
open4
|
@@ -14,7 +14,7 @@ PATH
|
|
14
14
|
GEM
|
15
15
|
remote: https://rubygems.org/
|
16
16
|
specs:
|
17
|
-
CFPropertyList (3.0.
|
17
|
+
CFPropertyList (3.0.2)
|
18
18
|
activesupport (4.2.11.1)
|
19
19
|
i18n (~> 0.7)
|
20
20
|
minitest (~> 5.1)
|
@@ -62,7 +62,7 @@ GEM
|
|
62
62
|
fuzzy_match (~> 2.0.4)
|
63
63
|
nap (~> 1.0)
|
64
64
|
cocoapods-deintegrate (1.0.4)
|
65
|
-
cocoapods-downloader (1.
|
65
|
+
cocoapods-downloader (1.3.0)
|
66
66
|
cocoapods-plugins (1.0.0)
|
67
67
|
nap
|
68
68
|
cocoapods-search (1.0.0)
|
@@ -93,11 +93,11 @@ GEM
|
|
93
93
|
terminal-table (~> 1)
|
94
94
|
diffy (3.3.0)
|
95
95
|
escape (0.0.4)
|
96
|
-
faraday (0.17.
|
96
|
+
faraday (0.17.1)
|
97
97
|
multipart-post (>= 1.2, < 3)
|
98
98
|
faraday-http-cache (2.0.0)
|
99
99
|
faraday (~> 0.8)
|
100
|
-
ffi (1.11.
|
100
|
+
ffi (1.11.3)
|
101
101
|
fourflusher (2.3.1)
|
102
102
|
fuzzy_match (2.0.4)
|
103
103
|
gh_inspector (1.1.3)
|
@@ -111,15 +111,13 @@ GEM
|
|
111
111
|
kramdown-parser-gfm (1.1.0)
|
112
112
|
kramdown (~> 2.0)
|
113
113
|
liferaft (0.0.6)
|
114
|
-
metaclass (0.0.4)
|
115
114
|
minitest (5.13.0)
|
116
|
-
mocha (1.
|
117
|
-
metaclass (~> 0.0.1)
|
115
|
+
mocha (1.10.1)
|
118
116
|
mocha-on-bacon (0.2.3)
|
119
117
|
mocha (>= 0.13.0)
|
120
118
|
molinillo (0.6.6)
|
121
119
|
multipart-post (2.1.1)
|
122
|
-
mustache (1.1.
|
120
|
+
mustache (1.1.1)
|
123
121
|
nanaimo (0.2.6)
|
124
122
|
nap (1.1.0)
|
125
123
|
netrc (0.11.0)
|
@@ -127,7 +125,7 @@ GEM
|
|
127
125
|
octokit (4.14.0)
|
128
126
|
sawyer (~> 0.8.0, >= 0.5.3)
|
129
127
|
open4 (1.3.4)
|
130
|
-
parallel (1.
|
128
|
+
parallel (1.19.1)
|
131
129
|
parser (2.6.5.0)
|
132
130
|
ast (~> 2.4.0)
|
133
131
|
powerpack (0.1.2)
|
@@ -138,7 +136,7 @@ GEM
|
|
138
136
|
rake
|
139
137
|
rake (10.5.0)
|
140
138
|
redcarpet (3.5.0)
|
141
|
-
rouge (3.
|
139
|
+
rouge (3.13.0)
|
142
140
|
rubocop (0.49.0)
|
143
141
|
parallel (~> 1.10)
|
144
142
|
parser (>= 2.3.3.1, < 3.0)
|
data/lib/jazzy/config.rb
CHANGED
@@ -176,7 +176,7 @@ module Jazzy
|
|
176
176
|
command_line: ['-s', '--sourcekitten-sourcefile filepath1,…filepathN',
|
177
177
|
Array],
|
178
178
|
description: 'File(s) generated from sourcekitten output to parse',
|
179
|
-
parse: ->(paths) { paths.map { |path| expand_path(path) } }
|
179
|
+
parse: ->(paths) { [paths].flatten.map { |path| expand_path(path) } }
|
180
180
|
|
181
181
|
config_attr :source_directory,
|
182
182
|
command_line: '--source-directory DIRPATH',
|
data/lib/jazzy/doc_builder.rb
CHANGED
@@ -350,9 +350,10 @@ module Jazzy
|
|
350
350
|
end
|
351
351
|
# rubocop:enable Metrics/MethodLength
|
352
352
|
|
353
|
-
def self.make_task(mark, uid, items)
|
353
|
+
def self.make_task(mark, uid, items, doc_model)
|
354
354
|
{
|
355
355
|
name: mark.name,
|
356
|
+
name_html: (render(doc_model, mark.name) if mark.name),
|
356
357
|
uid: URI.encode(uid),
|
357
358
|
items: items,
|
358
359
|
pre_separator: mark.has_start_dash,
|
@@ -376,7 +377,7 @@ module Jazzy
|
|
376
377
|
else
|
377
378
|
mark_names_counts[uid] = 1
|
378
379
|
end
|
379
|
-
make_task(mark, uid, items)
|
380
|
+
make_task(mark, uid, items, mark_children.first)
|
380
381
|
end
|
381
382
|
end
|
382
383
|
|
data/lib/jazzy/gem_version.rb
CHANGED
data/lib/jazzy/jazzy_markdown.rb
CHANGED
@@ -82,21 +82,21 @@ module Jazzy
|
|
82
82
|
|
83
83
|
def render_aside(type, text)
|
84
84
|
<<-HTML
|
85
|
-
|
85
|
+
</ul><div class="aside aside-#{type.underscore.tr('_', '-')}">
|
86
86
|
<p class="aside-title">#{type.underscore.humanize}</p>
|
87
87
|
#{text}
|
88
|
-
</div>
|
88
|
+
</div><ul>
|
89
89
|
HTML
|
90
90
|
end
|
91
91
|
|
92
92
|
def list(text, list_type)
|
93
93
|
elided = text.gsub!(ELIDED_LI_TOKEN, '')
|
94
94
|
return if text =~ /\A\s*\Z/ && elided
|
95
|
-
return text if text =~ /class="aside-title"/
|
96
95
|
str = "\n"
|
97
96
|
str << (list_type == :ordered ? "<ol>\n" : "<ul>\n")
|
98
97
|
str << text
|
99
98
|
str << (list_type == :ordered ? "</ol>\n" : "</ul>\n")
|
99
|
+
str.gsub(%r{\n?<ul>\n<\/ul>}, '')
|
100
100
|
end
|
101
101
|
|
102
102
|
def block_code(code, language)
|
@@ -112,7 +112,6 @@ module Jazzy
|
|
112
112
|
autolink: true,
|
113
113
|
fenced_code_blocks: true,
|
114
114
|
no_intra_emphasis: true,
|
115
|
-
quote: true,
|
116
115
|
strikethrough: true,
|
117
116
|
space_after_headers: false,
|
118
117
|
tables: true,
|
@@ -130,6 +130,8 @@ module Jazzy
|
|
130
130
|
attr_accessor :deprecation_message
|
131
131
|
attr_accessor :unavailable
|
132
132
|
attr_accessor :unavailable_message
|
133
|
+
attr_accessor :generic_requirements
|
134
|
+
attr_accessor :inherited_types
|
133
135
|
|
134
136
|
def usage_discouraged?
|
135
137
|
unavailable || deprecated
|
@@ -139,6 +141,36 @@ module Jazzy
|
|
139
141
|
CGI.unescape(url)
|
140
142
|
end
|
141
143
|
|
144
|
+
def constrained_extension?
|
145
|
+
type.swift_extension? &&
|
146
|
+
generic_requirements
|
147
|
+
end
|
148
|
+
|
149
|
+
def mark_for_children
|
150
|
+
if constrained_extension?
|
151
|
+
SourceMark.new_generic_requirements(generic_requirements)
|
152
|
+
else
|
153
|
+
SourceMark.new
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def inherited_types?
|
158
|
+
inherited_types &&
|
159
|
+
!inherited_types.empty?
|
160
|
+
end
|
161
|
+
|
162
|
+
# Is there at least one inherited type that is not in the given list?
|
163
|
+
def other_inherited_types?(unwanted)
|
164
|
+
return false unless inherited_types?
|
165
|
+
inherited_types.any? { |t| !unwanted.include?(t) }
|
166
|
+
end
|
167
|
+
|
168
|
+
# SourceKit only sets modulename for imported modules
|
169
|
+
def type_from_doc_module?
|
170
|
+
!type.extension? ||
|
171
|
+
(swift? && usr && modulename.nil?)
|
172
|
+
end
|
173
|
+
|
142
174
|
def alternative_abstract
|
143
175
|
if file = alternative_abstract_file
|
144
176
|
Pathname(file).read
|
@@ -114,6 +114,10 @@ module Jazzy
|
|
114
114
|
kind == 'source.lang.swift.decl.protocol'
|
115
115
|
end
|
116
116
|
|
117
|
+
def swift_typealias?
|
118
|
+
kind == 'source.lang.swift.decl.typealias'
|
119
|
+
end
|
120
|
+
|
117
121
|
def param?
|
118
122
|
# SourceKit strangely categorizes initializer parameters as local
|
119
123
|
# variables, so both kinds represent a parameter in jazzy.
|
data/lib/jazzy/source_mark.rb
CHANGED
@@ -28,6 +28,12 @@ module Jazzy
|
|
28
28
|
self.name = mark_string[start_index..end_index]
|
29
29
|
end
|
30
30
|
|
31
|
+
def self.new_generic_requirements(requirements)
|
32
|
+
marked_up = requirements.gsub(/\b([^=:]\S*)\b/, '`\1`')
|
33
|
+
text = "Available where #{marked_up}"
|
34
|
+
new(text)
|
35
|
+
end
|
36
|
+
|
31
37
|
def empty?
|
32
38
|
!name && !has_start_dash && !has_end_dash
|
33
39
|
end
|
@@ -37,5 +43,10 @@ module Jazzy
|
|
37
43
|
self.has_start_dash = other.has_start_dash
|
38
44
|
self.has_end_dash = other.has_end_dash
|
39
45
|
end
|
46
|
+
|
47
|
+
# Can we merge the contents of another mark into our own?
|
48
|
+
def can_merge?(other)
|
49
|
+
other.empty? || other.name == name
|
50
|
+
end
|
40
51
|
end
|
41
52
|
end
|
data/lib/jazzy/sourcekitten.rb
CHANGED
@@ -124,6 +124,18 @@ module Jazzy
|
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
127
|
+
# Merge consecutive sections with the same mark into one section
|
128
|
+
def self.merge_consecutive_marks(docs)
|
129
|
+
prev_mark = nil
|
130
|
+
docs.each do |doc|
|
131
|
+
if prev_mark && prev_mark.can_merge?(doc.mark)
|
132
|
+
doc.mark = prev_mark
|
133
|
+
end
|
134
|
+
prev_mark = doc.mark
|
135
|
+
merge_consecutive_marks(doc.children)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
127
139
|
def self.sanitize_filename(doc)
|
128
140
|
unsafe_filename = doc.url_name || doc.name
|
129
141
|
sanitzation_enabled = Config.instance.use_safe_filenames
|
@@ -289,21 +301,29 @@ module Jazzy
|
|
289
301
|
return false
|
290
302
|
end
|
291
303
|
|
292
|
-
# Document
|
304
|
+
# Document enum elements, since we can't tell their ACL.
|
293
305
|
return true if type.swift_enum_element?
|
294
|
-
if
|
295
|
-
|
296
|
-
subtype = SourceDeclaration::Type.new(subdoc['key.kind'])
|
297
|
-
!subtype.mark? && should_document?(subdoc)
|
298
|
-
end
|
299
|
-
end
|
306
|
+
# Document extensions if they might have parts covered by the ACL.
|
307
|
+
return should_document_swift_extension?(doc) if type.swift_extension?
|
300
308
|
|
301
309
|
acl_ok = SourceDeclaration::AccessControlLevel.from_doc(doc) >= @min_acl
|
302
|
-
|
310
|
+
unless acl_ok
|
311
|
+
@stats.add_acl_skipped
|
312
|
+
@inaccessible_protocols.append(doc['key.name']) if type.swift_protocol?
|
313
|
+
end
|
314
|
+
acl_ok
|
303
315
|
end
|
304
316
|
# rubocop:enable Metrics/CyclomaticComplexity
|
305
317
|
# rubocop:enable Metrics/PerceivedComplexity
|
306
318
|
|
319
|
+
def self.should_document_swift_extension?(doc)
|
320
|
+
doc['key.inheritedtypes'] ||
|
321
|
+
Array(doc['key.substructure']).any? do |subdoc|
|
322
|
+
subtype = SourceDeclaration::Type.new(subdoc['key.kind'])
|
323
|
+
!subtype.mark? && should_document?(subdoc)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
307
327
|
def self.should_mark_undocumented(filepath)
|
308
328
|
source_directory = Config.instance.source_directory.to_s
|
309
329
|
(filepath || '').start_with?(source_directory)
|
@@ -467,14 +487,10 @@ module Jazzy
|
|
467
487
|
end
|
468
488
|
|
469
489
|
def self.make_substructure(doc, declaration)
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
)
|
475
|
-
else
|
476
|
-
[]
|
477
|
-
end
|
490
|
+
return [] unless subdocs = doc['key.substructure']
|
491
|
+
make_source_declarations(subdocs,
|
492
|
+
declaration,
|
493
|
+
declaration.mark_for_children)
|
478
494
|
end
|
479
495
|
|
480
496
|
# rubocop:disable Metrics/MethodLength
|
@@ -531,10 +547,17 @@ module Jazzy
|
|
531
547
|
declaration.end_line = doc['key.parsed_scope.end']
|
532
548
|
declaration.deprecated = doc['key.always_deprecated']
|
533
549
|
declaration.unavailable = doc['key.always_unavailable']
|
550
|
+
declaration.generic_requirements =
|
551
|
+
find_generic_requirements(doc['key.parsed_declaration'])
|
552
|
+
inherited_types = doc['key.inheritedtypes'] || []
|
553
|
+
declaration.inherited_types =
|
554
|
+
inherited_types.map { |type| type['key.name'] }.compact
|
534
555
|
|
535
556
|
next unless make_doc_info(doc, declaration)
|
536
|
-
make_substructure(doc, declaration)
|
537
|
-
next if declaration.type.extension? &&
|
557
|
+
declaration.children = make_substructure(doc, declaration)
|
558
|
+
next if declaration.type.extension? &&
|
559
|
+
declaration.children.empty? &&
|
560
|
+
!declaration.inherited_types?
|
538
561
|
declarations << declaration
|
539
562
|
end
|
540
563
|
declarations
|
@@ -543,6 +566,12 @@ module Jazzy
|
|
543
566
|
# rubocop:enable Metrics/CyclomaticComplexity
|
544
567
|
# rubocop:enable Metrics/MethodLength
|
545
568
|
|
569
|
+
def self.find_generic_requirements(parsed_declaration)
|
570
|
+
parsed_declaration =~ /\bwhere\s+(.*)$/m
|
571
|
+
return nil unless Regexp.last_match
|
572
|
+
Regexp.last_match[1].gsub(/\s+/, ' ')
|
573
|
+
end
|
574
|
+
|
546
575
|
# Expands extensions of nested types declared at the top level into
|
547
576
|
# a tree so they can be deduplicated properly
|
548
577
|
def self.expand_extensions(decls)
|
@@ -566,6 +595,7 @@ module Jazzy
|
|
566
595
|
SourceDeclaration.new.tap do |decl|
|
567
596
|
make_default_doc_info(decl)
|
568
597
|
decl.name = name
|
598
|
+
decl.modulename = extension.modulename
|
569
599
|
decl.type = extension.type
|
570
600
|
decl.mark = extension.mark
|
571
601
|
decl.usr = candidates.first.usr unless candidates.empty?
|
@@ -588,10 +618,10 @@ module Jazzy
|
|
588
618
|
.group_by { |d| deduplication_key(d, declarations) }
|
589
619
|
.values
|
590
620
|
|
591
|
-
duplicate_groups.
|
621
|
+
duplicate_groups.flat_map do |group|
|
592
622
|
# Put extended type (if present) before extensions
|
593
623
|
merge_declarations(group)
|
594
|
-
end
|
624
|
+
end.compact
|
595
625
|
end
|
596
626
|
|
597
627
|
# Returns true if an Objective-C declaration is mergeable.
|
@@ -601,13 +631,21 @@ module Jazzy
|
|
601
631
|
&& name_match(decl.objc_category_name[0], root_decls))
|
602
632
|
end
|
603
633
|
|
634
|
+
# Returns if a Swift declaration is mergeable.
|
635
|
+
# Start off merging in typealiases to help understand extensions.
|
636
|
+
def self.mergeable_swift?(decl)
|
637
|
+
decl.type.swift_extensible? ||
|
638
|
+
decl.type.swift_extension? ||
|
639
|
+
decl.type.swift_typealias?
|
640
|
+
end
|
641
|
+
|
604
642
|
# Two declarations get merged if they have the same deduplication key.
|
605
643
|
def self.deduplication_key(decl, root_decls)
|
606
644
|
# Swift extension of objc class
|
607
645
|
if decl.swift_objc_extension?
|
608
646
|
[decl.swift_extension_objc_name, :objc_class_and_categories]
|
609
647
|
# Swift type or Swift extension of Swift type
|
610
|
-
elsif
|
648
|
+
elsif mergeable_swift?(decl)
|
611
649
|
[decl.usr, decl.name]
|
612
650
|
# Objc categories and classes
|
613
651
|
elsif mergeable_objc?(decl, root_decls)
|
@@ -633,17 +671,36 @@ module Jazzy
|
|
633
671
|
end
|
634
672
|
typedecl = typedecls.first
|
635
673
|
|
674
|
+
extensions = reject_inaccessible_extensions(typedecl, extensions)
|
675
|
+
|
636
676
|
if typedecl
|
637
677
|
if typedecl.type.swift_protocol?
|
638
|
-
|
639
|
-
mark_members_from_protocol_extension(extensions)
|
678
|
+
mark_and_merge_protocol_extensions(typedecl, extensions)
|
640
679
|
extensions.reject! { |ext| ext.children.empty? }
|
641
680
|
end
|
642
681
|
|
643
|
-
|
682
|
+
merge_objc_declaration_marks(typedecl, extensions)
|
644
683
|
end
|
645
684
|
|
646
|
-
|
685
|
+
# Keep type-aliases separate from any extensions
|
686
|
+
if typedecl && typedecl.type.swift_typealias?
|
687
|
+
[merge_type_and_extensions(typedecls, []),
|
688
|
+
merge_type_and_extensions([], extensions)]
|
689
|
+
else
|
690
|
+
merge_type_and_extensions(typedecls, extensions)
|
691
|
+
end
|
692
|
+
end
|
693
|
+
# rubocop:enable Metrics/MethodLength
|
694
|
+
|
695
|
+
def self.merge_type_and_extensions(typedecls, extensions)
|
696
|
+
# Constrained extensions at the end
|
697
|
+
constrained, regular_exts = extensions.partition(&:constrained_extension?)
|
698
|
+
decls = typedecls + regular_exts + constrained
|
699
|
+
return nil if decls.empty?
|
700
|
+
|
701
|
+
move_merged_extension_marks(decls)
|
702
|
+
merge_code_declaration(decls)
|
703
|
+
|
647
704
|
decls.first.tap do |merged|
|
648
705
|
merged.children = deduplicate_declarations(
|
649
706
|
decls.flat_map(&:children).uniq,
|
@@ -653,58 +710,112 @@ module Jazzy
|
|
653
710
|
end
|
654
711
|
end
|
655
712
|
end
|
656
|
-
# rubocop:enable Metrics/MethodLength
|
657
713
|
|
714
|
+
# Now we know all the public types and all the private protocols,
|
715
|
+
# reject extensions that add public protocols to private types
|
716
|
+
# or add private protocols to public types.
|
717
|
+
def self.reject_inaccessible_extensions(typedecl, extensions)
|
718
|
+
swift_exts, objc_exts = extensions.partition(&:swift?)
|
719
|
+
|
720
|
+
# Reject extensions that are just conformances to private protocols
|
721
|
+
unwanted_exts, wanted_exts = swift_exts.partition do |ext|
|
722
|
+
ext.children.empty? &&
|
723
|
+
!ext.other_inherited_types?(@inaccessible_protocols)
|
724
|
+
end
|
725
|
+
|
726
|
+
# Given extensions of a type from this module, without the
|
727
|
+
# type itself, the type must be private and the extensions
|
728
|
+
# should be rejected.
|
729
|
+
if !typedecl &&
|
730
|
+
wanted_exts.first &&
|
731
|
+
wanted_exts.first.type_from_doc_module?
|
732
|
+
unwanted_exts += wanted_exts
|
733
|
+
wanted_exts = []
|
734
|
+
end
|
735
|
+
|
736
|
+
# Don't tell the user to document them
|
737
|
+
unwanted_exts.each { |e| @stats.remove_undocumented(e) }
|
738
|
+
|
739
|
+
objc_exts + wanted_exts
|
740
|
+
end
|
741
|
+
|
742
|
+
# Protocol extensions.
|
743
|
+
#
|
658
744
|
# If any of the extensions provide default implementations for methods in
|
659
745
|
# the given protocol, merge those members into the protocol doc instead of
|
660
746
|
# keeping them on the extension. These get a “Default implementation”
|
661
|
-
# annotation in the generated docs.
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
747
|
+
# annotation in the generated docs. Default implementations added by
|
748
|
+
# conditional extensions are annotated but listed separately.
|
749
|
+
#
|
750
|
+
# Protocol methods provided only in an extension and not in the protocol
|
751
|
+
# itself are a special beast: they do not use dynamic dispatch. These get an
|
752
|
+
# “Extension method” annotation in the generated docs.
|
753
|
+
def self.mark_and_merge_protocol_extensions(protocol, extensions)
|
754
|
+
extensions.each do |ext|
|
755
|
+
ext.children = ext.children.select do |ext_member|
|
756
|
+
proto_member = protocol.children.find do |p|
|
757
|
+
p.name == ext_member.name && p.type == ext_member.type
|
758
|
+
end
|
759
|
+
|
760
|
+
# Extension-only method, keep.
|
761
|
+
unless proto_member
|
762
|
+
ext_member.from_protocol_extension = true
|
763
|
+
next true
|
667
764
|
end
|
668
|
-
|
669
|
-
|
670
|
-
|
765
|
+
|
766
|
+
# Default impl but constrained, mark and keep.
|
767
|
+
if ext.constrained_extension?
|
768
|
+
ext_member.default_impl_abstract = ext_member.abstract
|
769
|
+
ext_member.abstract = nil
|
770
|
+
next true
|
671
771
|
end
|
772
|
+
|
773
|
+
# Default impl for all users, merge.
|
774
|
+
proto_member.default_impl_abstract = ext_member.abstract
|
775
|
+
next false
|
672
776
|
end
|
673
777
|
end
|
674
778
|
end
|
675
779
|
|
676
|
-
#
|
677
|
-
#
|
678
|
-
|
679
|
-
|
780
|
+
# Mark children merged from categories with the name of category
|
781
|
+
# (unless they already have a mark)
|
782
|
+
def self.merge_objc_declaration_marks(typedecl, extensions)
|
783
|
+
return unless typedecl.type.objc_class?
|
680
784
|
extensions.each do |ext|
|
681
|
-
ext.
|
682
|
-
|
683
|
-
end
|
785
|
+
_, category_name = ext.objc_category_name
|
786
|
+
ext.children.each { |c| c.mark.name ||= category_name }
|
684
787
|
end
|
685
788
|
end
|
686
789
|
|
687
|
-
#
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
end
|
696
|
-
else
|
697
|
-
# If the Swift extension has a mark and the first child doesn't
|
698
|
-
# then copy the mark contents down so it still shows up.
|
699
|
-
extensions.each do |ext|
|
700
|
-
child = ext.children.first
|
701
|
-
if child && child.mark.empty?
|
702
|
-
child.mark.copy(ext.mark)
|
703
|
-
end
|
790
|
+
# For each extension to be merged, move any MARK from the extension
|
791
|
+
# declaration down to the extension contents so it still shows up.
|
792
|
+
def self.move_merged_extension_marks(decls)
|
793
|
+
return unless to_be_merged = decls[1..-1]
|
794
|
+
to_be_merged.each do |ext|
|
795
|
+
child = ext.children.first
|
796
|
+
if child && child.mark.empty?
|
797
|
+
child.mark.copy(ext.mark)
|
704
798
|
end
|
705
799
|
end
|
706
800
|
end
|
707
801
|
|
802
|
+
# Merge useful information added by extensions into the main
|
803
|
+
# declaration: public protocol conformances and, for top-level extensions,
|
804
|
+
# further conditional extensions of the same type.
|
805
|
+
def self.merge_code_declaration(decls)
|
806
|
+
first = decls.first
|
807
|
+
|
808
|
+
declarations = decls[1..-1].select do |decl|
|
809
|
+
decl.type.swift_extension? &&
|
810
|
+
(decl.other_inherited_types?(@inaccessible_protocols) ||
|
811
|
+
(first.type.swift_extension? && decl.constrained_extension?))
|
812
|
+
end.map(&:declaration)
|
813
|
+
|
814
|
+
unless declarations.empty?
|
815
|
+
first.declaration = declarations.prepend(first.declaration).uniq.join
|
816
|
+
end
|
817
|
+
end
|
818
|
+
|
708
819
|
# Apply filtering based on the "included" and "excluded" flags.
|
709
820
|
def self.filter_files(json)
|
710
821
|
json = filter_included_files(json) if Config.instance.included_files.any?
|
@@ -860,6 +971,7 @@ module Jazzy
|
|
860
971
|
@min_acl = min_acl
|
861
972
|
@skip_undocumented = skip_undocumented
|
862
973
|
@stats = Stats.new
|
974
|
+
@inaccessible_protocols = []
|
863
975
|
sourcekitten_json = filter_files(JSON.parse(sourcekitten_output).flatten)
|
864
976
|
docs = make_source_declarations(sourcekitten_json).concat inject_docs
|
865
977
|
docs = expand_extensions(docs)
|
@@ -870,6 +982,7 @@ module Jazzy
|
|
870
982
|
docs = docs.reject { |doc| doc.type.swift_enum_element? }
|
871
983
|
ungrouped_docs = docs
|
872
984
|
docs = group_docs(docs)
|
985
|
+
merge_consecutive_marks(docs)
|
873
986
|
make_doc_urls(docs)
|
874
987
|
autolink(docs, ungrouped_docs)
|
875
988
|
[docs, @stats]
|
data/lib/jazzy/stats.rb
CHANGED
@@ -152,7 +152,7 @@ header {
|
|
152
152
|
background-color: $bg_color;
|
153
153
|
position: fixed;
|
154
154
|
width: 100%;
|
155
|
-
z-index:
|
155
|
+
z-index: 2;
|
156
156
|
img {
|
157
157
|
padding-right: 6px;
|
158
158
|
vertical-align: -4px;
|
@@ -177,7 +177,7 @@ header {
|
|
177
177
|
padding-top: $breadcrumb_padding_top;
|
178
178
|
position: fixed;
|
179
179
|
width: 100%;
|
180
|
-
z-index:
|
180
|
+
z-index: 2;
|
181
181
|
margin-top: $header_height;
|
182
182
|
#carat {
|
183
183
|
height: 10px;
|
@@ -270,6 +270,17 @@ header {
|
|
270
270
|
margin: -$content_top_offset 0 0;
|
271
271
|
}
|
272
272
|
}
|
273
|
+
.section-name {
|
274
|
+
p {
|
275
|
+
margin-bottom: inherit;
|
276
|
+
line-height: inherit;
|
277
|
+
}
|
278
|
+
code {
|
279
|
+
background-color: inherit;
|
280
|
+
padding: inherit;
|
281
|
+
color: inherit;
|
282
|
+
}
|
283
|
+
}
|
273
284
|
}
|
274
285
|
|
275
286
|
.section {
|
@@ -317,6 +328,29 @@ header {
|
|
317
328
|
}
|
318
329
|
}
|
319
330
|
|
331
|
+
.section-name-container {
|
332
|
+
position: relative;
|
333
|
+
display: inline-block;
|
334
|
+
|
335
|
+
.section-name-link {
|
336
|
+
position: absolute;
|
337
|
+
top: 0;
|
338
|
+
left: 0;
|
339
|
+
bottom: 0;
|
340
|
+
right: 0;
|
341
|
+
margin-bottom: 0;
|
342
|
+
}
|
343
|
+
|
344
|
+
.section-name {
|
345
|
+
position: relative;
|
346
|
+
pointer-events: none;
|
347
|
+
z-index: 1;
|
348
|
+
a {
|
349
|
+
pointer-events: auto;
|
350
|
+
}
|
351
|
+
}
|
352
|
+
}
|
353
|
+
|
320
354
|
.item {
|
321
355
|
padding-top: 8px;
|
322
356
|
width: 100%;
|
@@ -3,9 +3,10 @@
|
|
3
3
|
<div class="task-name-container">
|
4
4
|
<a name="/{{uid}}"></a>
|
5
5
|
<a name="//apple_ref/{{language_stub}}/Section/{{name}}" class="dashAnchor"></a>
|
6
|
-
<
|
7
|
-
<
|
8
|
-
|
6
|
+
<div class="section-name-container">
|
7
|
+
<a class="section-name-link" href="#/{{uid}}"></a>
|
8
|
+
<h3 class="section-name">{{{name_html}}}</h3>
|
9
|
+
</div>
|
9
10
|
</div>
|
10
11
|
{{/name}}
|
11
12
|
<ul>
|
@@ -201,13 +201,15 @@ code {
|
|
201
201
|
font-family: $code_font;
|
202
202
|
}
|
203
203
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
204
|
+
.item-container, .top-matter {
|
205
|
+
p, li {
|
206
|
+
> code {
|
207
|
+
background: $code_bg_color;
|
208
|
+
padding: .2em;
|
209
|
+
&:before, &:after {
|
210
|
+
letter-spacing: -.2em;
|
211
|
+
content: "\00a0";
|
212
|
+
}
|
211
213
|
}
|
212
214
|
}
|
213
215
|
}
|
@@ -367,6 +369,10 @@ pre code {
|
|
367
369
|
.section-name {
|
368
370
|
color: #666;
|
369
371
|
display: block;
|
372
|
+
|
373
|
+
p {
|
374
|
+
margin-bottom: inherit;
|
375
|
+
}
|
370
376
|
}
|
371
377
|
|
372
378
|
.declaration .highlight {
|
@@ -394,6 +400,28 @@ pre code {
|
|
394
400
|
}
|
395
401
|
}
|
396
402
|
|
403
|
+
.section-name-container {
|
404
|
+
position: relative;
|
405
|
+
|
406
|
+
.section-name-link {
|
407
|
+
position: absolute;
|
408
|
+
top: 0;
|
409
|
+
left: 0;
|
410
|
+
bottom: 0;
|
411
|
+
right: 0;
|
412
|
+
margin-bottom: 0;
|
413
|
+
}
|
414
|
+
|
415
|
+
.section-name {
|
416
|
+
position: relative;
|
417
|
+
pointer-events: none;
|
418
|
+
z-index: 1;
|
419
|
+
a {
|
420
|
+
pointer-events: auto;
|
421
|
+
}
|
422
|
+
}
|
423
|
+
}
|
424
|
+
|
397
425
|
.item-container {
|
398
426
|
padding: 0;
|
399
427
|
}
|
@@ -3,9 +3,10 @@
|
|
3
3
|
<div class="task-name-container">
|
4
4
|
<a name="/{{uid}}"></a>
|
5
5
|
<a name="//apple_ref/{{language_stub}}/Section/{{name}}" class="dashAnchor"></a>
|
6
|
-
<
|
7
|
-
<
|
8
|
-
|
6
|
+
<div class="section-name-container">
|
7
|
+
<a class="section-name-link" href="#/{{uid}}"></a>
|
8
|
+
<h3 class="section-name">{{{name_html}}}</h3>
|
9
|
+
</div>
|
9
10
|
</div>
|
10
11
|
{{/name}}
|
11
12
|
<ul class="item-container">
|
@@ -182,7 +182,7 @@ header {
|
|
182
182
|
background-color: $bg_color;
|
183
183
|
position: fixed;
|
184
184
|
width: 100%;
|
185
|
-
z-index:
|
185
|
+
z-index: 3;
|
186
186
|
img {
|
187
187
|
padding-right: 6px;
|
188
188
|
vertical-align: -4px;
|
@@ -204,7 +204,7 @@ header {
|
|
204
204
|
#breadcrumbs-container {
|
205
205
|
background-color: $bg_color;
|
206
206
|
position: fixed;
|
207
|
-
z-index:
|
207
|
+
z-index: 2;
|
208
208
|
width: 100%;
|
209
209
|
}
|
210
210
|
|
@@ -310,6 +310,16 @@ header {
|
|
310
310
|
margin: -$content_top_offset 0 0;
|
311
311
|
}
|
312
312
|
}
|
313
|
+
|
314
|
+
.section-name {
|
315
|
+
p {
|
316
|
+
margin-bottom: inherit;
|
317
|
+
line-height: inherit;
|
318
|
+
}
|
319
|
+
code {
|
320
|
+
color: inherit;
|
321
|
+
}
|
322
|
+
}
|
313
323
|
}
|
314
324
|
|
315
325
|
.highlight {
|
@@ -356,6 +366,29 @@ header {
|
|
356
366
|
}
|
357
367
|
}
|
358
368
|
|
369
|
+
.section-name-container {
|
370
|
+
position: relative;
|
371
|
+
display: inline-block;
|
372
|
+
|
373
|
+
.section-name-link {
|
374
|
+
position: absolute;
|
375
|
+
top: 0;
|
376
|
+
left: 0;
|
377
|
+
bottom: 0;
|
378
|
+
right: 0;
|
379
|
+
margin-bottom: 0;
|
380
|
+
}
|
381
|
+
|
382
|
+
.section-name {
|
383
|
+
position: relative;
|
384
|
+
pointer-events: none;
|
385
|
+
z-index: 1;
|
386
|
+
a {
|
387
|
+
pointer-events: auto;
|
388
|
+
}
|
389
|
+
}
|
390
|
+
}
|
391
|
+
|
359
392
|
.item {
|
360
393
|
padding-top: 8px;
|
361
394
|
width: 100%;
|
@@ -3,9 +3,10 @@
|
|
3
3
|
<div class="task-name-container">
|
4
4
|
<a name="/{{uid}}"></a>
|
5
5
|
<a name="//apple_ref/{{language_stub}}/Section/{{name}}" class="dashAnchor"></a>
|
6
|
-
<
|
7
|
-
<
|
8
|
-
|
6
|
+
<div class="section-name-container">
|
7
|
+
<a class="section-name-link" href="#/{{uid}}"></a>
|
8
|
+
<h3 class="section-name">{{{name_html}}}</h3>
|
9
|
+
</div>
|
9
10
|
</div>
|
10
11
|
{{/name}}
|
11
12
|
<ul>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jazzy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JP Simard
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-12-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: cocoapods
|