jazzy 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +3 -3
  3. data/CHANGELOG.md +52 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/Gemfile.lock +44 -44
  6. data/README.md +44 -6
  7. data/bin/sourcekitten +0 -0
  8. data/jazzy.gemspec +5 -5
  9. data/lib/jazzy/config.rb +8 -3
  10. data/lib/jazzy/doc_builder.rb +12 -4
  11. data/lib/jazzy/documentation_generator.rb +0 -7
  12. data/lib/jazzy/gem_version.rb +1 -1
  13. data/lib/jazzy/podspec_documenter.rb +19 -2
  14. data/lib/jazzy/source_declaration.rb +15 -4
  15. data/lib/jazzy/source_declaration/type.rb +11 -1
  16. data/lib/jazzy/source_document.rb +18 -2
  17. data/lib/jazzy/sourcekitten.rb +41 -17
  18. data/lib/jazzy/themes/apple/assets/css/jazzy.css.scss +9 -5
  19. data/lib/jazzy/themes/apple/templates/deprecation.mustache +12 -0
  20. data/lib/jazzy/themes/apple/templates/doc.mustache +1 -0
  21. data/lib/jazzy/themes/apple/templates/task.mustache +12 -0
  22. data/lib/jazzy/themes/fullwidth/assets/css/jazzy.css.scss +10 -4
  23. data/lib/jazzy/themes/fullwidth/assets/js/jazzy.search.js +2 -1
  24. data/lib/jazzy/themes/fullwidth/templates/deprecation.mustache +12 -0
  25. data/lib/jazzy/themes/fullwidth/templates/doc.mustache +1 -0
  26. data/lib/jazzy/themes/fullwidth/templates/task.mustache +12 -0
  27. data/lib/jazzy/themes/jony/assets/css/jazzy.css.scss +5 -2
  28. data/lib/jazzy/themes/jony/templates/deprecation.mustache +12 -0
  29. data/lib/jazzy/themes/jony/templates/doc.mustache +1 -0
  30. data/lib/jazzy/themes/jony/templates/task.mustache +12 -0
  31. data/spec/integration_spec.rb +1 -1
  32. metadata +16 -14
  33. data/lib/jazzy/readme_generator.rb +0 -61
@@ -10,7 +10,6 @@ require 'jazzy/documentation_generator'
10
10
  require 'jazzy/search_builder'
11
11
  require 'jazzy/jazzy_markdown'
12
12
  require 'jazzy/podspec_documenter'
13
- require 'jazzy/readme_generator'
14
13
  require 'jazzy/source_declaration'
15
14
  require 'jazzy/source_document'
16
15
  require 'jazzy/source_module'
@@ -95,7 +94,7 @@ module Jazzy
95
94
 
96
95
  def self.each_doc(output_dir, docs, &block)
97
96
  docs.each do |doc|
98
- next unless doc.render?
97
+ next unless doc.render_as_page?
99
98
  # Assuming URL is relative to documentation root:
100
99
  path = output_dir + (doc.url || "#{doc.name}.html")
101
100
  block.call(doc, path)
@@ -332,6 +331,7 @@ module Jazzy
332
331
  # Build mustache item for a top-level doc
333
332
  # @param [Hash] item Parsed doc child item
334
333
  # @param [Config] options Build options
334
+ # rubocop:disable Metrics/MethodLength
335
335
  def self.render_item(item, source_module)
336
336
  # Combine abstract and discussion into abstract
337
337
  abstract = (item.abstract || '') + (item.discussion || '')
@@ -347,11 +347,16 @@ module Jazzy
347
347
  from_protocol_extension: item.from_protocol_extension,
348
348
  return: item.return,
349
349
  parameters: (item.parameters if item.parameters.any?),
350
- url: (item.url if item.children.any?),
350
+ url: (item.url if item.render_as_page?),
351
351
  start_line: item.start_line,
352
352
  end_line: item.end_line,
353
+ direct_link: item.omit_content_from_parent?,
354
+ deprecation_message: item.deprecation_message,
355
+ unavailable_message: item.unavailable_message,
356
+ usage_discouraged: item.usage_discouraged?,
353
357
  }
354
358
  end
359
+ # rubocop:enable Metrics/MethodLength
355
360
 
356
361
  def self.make_task(mark, uid, items)
357
362
  {
@@ -391,7 +396,7 @@ module Jazzy
391
396
  # @param [Array] doc_structure doc structure comprised of section names and
392
397
  # child names and URLs. @see doc_structure_for_docs
393
398
  def self.document(source_module, doc_model, path_to_root)
394
- if doc_model.type.kind == 'document.markdown'
399
+ if doc_model.type.markdown?
395
400
  return document_markdown(source_module, doc_model, path_to_root)
396
401
  end
397
402
 
@@ -418,6 +423,9 @@ module Jazzy
418
423
  doc[:github_url] = source_module.github_url
419
424
  doc[:dash_url] = source_module.dash_url
420
425
  doc[:path_to_root] = path_to_root
426
+ doc[:deprecation_message] = doc_model.deprecation_message
427
+ doc[:unavailable_message] = doc_model.unavailable_message
428
+ doc[:usage_discouraged] = doc_model.usage_discouraged?
421
429
  doc.render.gsub(ELIDED_AUTOLINK_TOKEN, path_to_root)
422
430
  end
423
431
  # rubocop:enable Metrics/MethodLength
@@ -11,15 +11,8 @@ module Jazzy
11
11
  documentation_entries.map do |file_path|
12
12
  SourceDocument.new.tap do |sd|
13
13
  sd.name = File.basename(file_path, '.md')
14
- sd.url = sd.name.downcase.strip
15
- .tr(' ', '-').gsub(/[^\w-]/, '') + '.html'
16
- sd.type = SourceDeclaration::Type.new 'document.markdown'
17
- sd.children = []
18
14
  sd.overview = overview Pathname(file_path)
19
15
  sd.usr = 'documentation.' + sd.name
20
- sd.abstract = ''
21
- sd.return = ''
22
- sd.parameters = []
23
16
  end
24
17
  end
25
18
  end
@@ -1,3 +1,3 @@
1
1
  module Jazzy
2
- VERSION = '0.9.3'.freeze unless defined? Jazzy::VERSION
2
+ VERSION = '0.9.5'.freeze unless defined? Jazzy::VERSION
3
3
  end
@@ -27,8 +27,8 @@ module Jazzy
27
27
 
28
28
  targets.map do |t|
29
29
  args = %W[doc --module-name #{podspec.module_name} -- -target #{t}]
30
- swift_version = (config.swift_version || '4')[0] + '.0'
31
- args << "SWIFT_VERSION=\"#{swift_version}\""
30
+ swift_version = compiler_swift_version(config.swift_version)
31
+ args << "SWIFT_VERSION=#{swift_version}"
32
32
  SourceKitten.run_sourcekitten(args)
33
33
  end
34
34
  end
@@ -97,6 +97,23 @@ module Jazzy
97
97
 
98
98
  private_class_method :github_file_prefix
99
99
 
100
+ # Latest valid value for SWIFT_VERSION.
101
+ LATEST_SWIFT_VERSION = '4.2'.freeze
102
+
103
+ # All valid values for SWIFT_VERSION that are longer
104
+ # than a major version number. Ordered ascending.
105
+ LONG_SWIFT_VERSIONS = ['4.2'].freeze
106
+
107
+ # Go from a full Swift version like 4.2.1 to
108
+ # something valid for SWIFT_VERSION.
109
+ def compiler_swift_version(user_version)
110
+ return LATEST_SWIFT_VERSION unless user_version
111
+
112
+ LONG_SWIFT_VERSIONS.select do |version|
113
+ user_version.start_with?(version)
114
+ end.last || "#{user_version[0]}.0"
115
+ end
116
+
100
117
  # @!group SourceKitten output helper methods
101
118
 
102
119
  def pod_path
@@ -8,12 +8,15 @@ module Jazzy
8
8
  # static type of declared element (e.g. String.Type -> ())
9
9
  attr_accessor :typename
10
10
 
11
- def type?(type_kind)
12
- respond_to?(:type) && type.kind == type_kind
11
+ # Give the item its own page or just inline into parent?
12
+ def render_as_page?
13
+ children.any?
13
14
  end
14
15
 
15
- def render?
16
- type?('document.markdown') || children.count != 0
16
+ # When referencing this item from its parent category,
17
+ # include the content or just link to it directly?
18
+ def omit_content_from_parent?
19
+ false
17
20
  end
18
21
 
19
22
  # Element containing this declaration in the code
@@ -99,6 +102,14 @@ module Jazzy
99
102
  attr_accessor :end_line
100
103
  attr_accessor :nav_order
101
104
  attr_accessor :url_name
105
+ attr_accessor :deprecated
106
+ attr_accessor :deprecation_message
107
+ attr_accessor :unavailable
108
+ attr_accessor :unavailable_message
109
+
110
+ def usage_discouraged?
111
+ unavailable || deprecated
112
+ end
102
113
 
103
114
  def alternative_abstract
104
115
  if file = alternative_abstract_file
@@ -129,6 +129,16 @@ module Jazzy
129
129
  Type.new('Overview')
130
130
  end
131
131
 
132
+ MARKDOWN_KIND = 'document.markdown'.freeze
133
+
134
+ def self.markdown
135
+ Type.new(MARKDOWN_KIND)
136
+ end
137
+
138
+ def markdown?
139
+ kind == MARKDOWN_KIND
140
+ end
141
+
132
142
  def hash
133
143
  kind.hash
134
144
  end
@@ -140,7 +150,7 @@ module Jazzy
140
150
 
141
151
  TYPES = {
142
152
  # Markdown
143
- 'document.markdown' => {
153
+ MARKDOWN_KIND => {
144
154
  jazzy: 'Guide',
145
155
  dash: 'Guide',
146
156
  }.freeze,
@@ -3,19 +3,35 @@ require 'pathname'
3
3
  require 'jazzy/jazzy_markdown'
4
4
 
5
5
  module Jazzy
6
+ # Standalone markdown docs including index.html
6
7
  class SourceDocument < SourceDeclaration
7
8
  attr_accessor :overview
8
9
  attr_accessor :readme_path
9
10
 
11
+ def initialize
12
+ super
13
+ self.children = []
14
+ self.parameters = []
15
+ self.abstract = ''
16
+ self.type = SourceDeclaration::Type.markdown
17
+ self.mark = SourceMark.new
18
+ end
19
+
10
20
  def self.make_index(readme_path)
11
21
  SourceDocument.new.tap do |sd|
12
22
  sd.name = 'index'
13
- sd.children = []
14
- sd.type = SourceDeclaration::Type.new 'document.markdown'
15
23
  sd.readme_path = readme_path
16
24
  end
17
25
  end
18
26
 
27
+ def render_as_page?
28
+ true
29
+ end
30
+
31
+ def omit_content_from_parent?
32
+ true
33
+ end
34
+
19
35
  def config
20
36
  Config.instance
21
37
  end
@@ -322,6 +322,8 @@ module Jazzy
322
322
  Highlighter.highlight(make_swift_declaration(doc, declaration))
323
323
  end
324
324
 
325
+ make_deprecation_info(doc, declaration)
326
+
325
327
  unless doc['key.doc.full_as_xml']
326
328
  return process_undocumented_token(doc, declaration)
327
329
  end
@@ -335,10 +337,23 @@ module Jazzy
335
337
  @stats.add_documented
336
338
  end
337
339
 
340
+ def self.make_deprecation_info(doc, declaration)
341
+ if declaration.deprecated
342
+ declaration.deprecation_message =
343
+ Markdown.render(doc['key.deprecation_message'] || '')
344
+ end
345
+ if declaration.unavailable
346
+ declaration.unavailable_message =
347
+ Markdown.render(doc['key.unavailable_message'] || '')
348
+ end
349
+ end
350
+
338
351
  # Strip tags and convert entities
339
352
  def self.xml_to_text(xml)
340
353
  document = REXML::Document.new(xml)
341
354
  REXML::XPath.match(document.root, '//text()').map(&:value).join
355
+ rescue
356
+ ''
342
357
  end
343
358
 
344
359
  # Regexp to match an @attribute. Complex to handle @available().
@@ -372,10 +387,11 @@ module Jazzy
372
387
  end
373
388
 
374
389
  def self.prefer_parsed_decl?(parsed, annotated)
375
- parsed &&
376
- (annotated.include?(' = default') || # SR-2608
377
- parsed.match('@autoclosure|@escaping') || # SR-6321
378
- parsed.include?("\n"))
390
+ annotated.empty? ||
391
+ parsed &&
392
+ (annotated.include?(' = default') || # SR-2608
393
+ parsed.match('@autoclosure|@escaping') || # SR-6321
394
+ parsed.include?("\n"))
379
395
  end
380
396
 
381
397
  # Replace the fully qualified name of a type with its base name
@@ -479,6 +495,8 @@ module Jazzy
479
495
  declaration.column = doc['key.doc.column']
480
496
  declaration.start_line = doc['key.parsed_scope.start']
481
497
  declaration.end_line = doc['key.parsed_scope.end']
498
+ declaration.deprecated = doc['key.always_deprecated']
499
+ declaration.unavailable = doc['key.always_unavailable']
482
500
 
483
501
  next unless make_doc_info(doc, declaration)
484
502
  make_substructure(doc, declaration)
@@ -739,28 +757,34 @@ module Jazzy
739
757
  end
740
758
  end
741
759
 
760
+ AUTOLINK_TEXT_FIELDS = %w[return
761
+ abstract
762
+ unavailable_message
763
+ deprecation_message].freeze
764
+
765
+ AUTOLINK_HIGHLIGHT_FIELDS = %w[declaration
766
+ other_language_declaration].freeze
767
+
742
768
  def self.autolink(docs, root_decls)
743
769
  @autolink_root_decls = root_decls
744
770
  docs.each do |doc|
745
771
  doc.children = autolink(doc.children, root_decls)
746
772
 
747
- doc.return = autolink_text(doc.return, doc, root_decls) if doc.return
748
- doc.abstract = autolink_text(doc.abstract, doc, root_decls)
749
- (doc.parameters || []).each do |param|
750
- param[:discussion] =
751
- autolink_text(param[:discussion], doc, root_decls)
773
+ AUTOLINK_TEXT_FIELDS.each do |field|
774
+ if text = doc.send(field)
775
+ doc.send(field + '=', autolink_text(text, doc, root_decls))
776
+ end
752
777
  end
753
778
 
754
- if doc.declaration
755
- doc.declaration = autolink_text(
756
- doc.declaration, doc, root_decls, true
757
- )
779
+ AUTOLINK_HIGHLIGHT_FIELDS.each do |field|
780
+ if text = doc.send(field)
781
+ doc.send(field + '=', autolink_text(text, doc, root_decls, true))
782
+ end
758
783
  end
759
784
 
760
- if doc.other_language_declaration
761
- doc.other_language_declaration = autolink_text(
762
- doc.other_language_declaration, doc, root_decls, true
763
- )
785
+ (doc.parameters || []).each do |param|
786
+ param[:discussion] =
787
+ autolink_text(param[:discussion], doc, root_decls)
764
788
  end
765
789
  end
766
790
  end
@@ -240,7 +240,7 @@ header {
240
240
  margin-left: $content_body_left_offset;
241
241
  position: absolute;
242
242
  overflow: hidden;
243
- padding-bottom: 60px;
243
+ padding-bottom: 20px;
244
244
  top: $content_top_offset;
245
245
  width: $content_wrapper_width - $content_body_left_offset;
246
246
  p, a, code, em, ul, table, blockquote {
@@ -333,11 +333,14 @@ header {
333
333
  background-color: transparent;
334
334
  padding: 0;
335
335
  }
336
- .token {
336
+ .token, .direct-link {
337
337
  padding-left: 3px;
338
338
  margin-left: 15px;
339
339
  font-size: 11.9px;
340
340
  }
341
+ .discouraged {
342
+ text-decoration: line-through;
343
+ }
341
344
  .declaration-note {
342
345
  font-size: .85em;
343
346
  color: rgba(128,128,128,1);
@@ -412,7 +415,7 @@ header {
412
415
  }
413
416
  }
414
417
 
415
- .aside-warning {
418
+ .aside-warning, .aside-deprecated, .aside-unavailable {
416
419
  border-left: $aside_warning_border;
417
420
  .aside-title {
418
421
  color: $aside_warning_color;
@@ -446,8 +449,9 @@ header {
446
449
  }
447
450
 
448
451
  #footer {
449
- position: absolute;
450
- bottom: 10px;
452
+ position: relative;
453
+ top: 10px;
454
+ bottom: 0px;
451
455
  margin-left: 25px;
452
456
  p {
453
457
  margin: 0;
@@ -0,0 +1,12 @@
1
+ {{#deprecation_message}}
2
+ <div class="aside aside-deprecated">
3
+ <p class="aside-title">Deprecated</p>
4
+ {{{deprecation_message}}}
5
+ </div>
6
+ {{/deprecation_message}}
7
+ {{#unavailable_message}}
8
+ <div class="aside aside-unavailable">
9
+ <p class="aside-title">Unavailable</p>
10
+ {{{unavailable_message}}}
11
+ </div>
12
+ {{/unavailable_message}}
@@ -28,6 +28,7 @@
28
28
  <section>
29
29
  <section class="section">
30
30
  {{^hide_name}}<h1>{{name}}</h1>{{/hide_name}}
31
+ {{> deprecation}}
31
32
  {{#declaration}}
32
33
  <div class="declaration">
33
34
  <div class="language">
@@ -15,7 +15,17 @@
15
15
  <code>
16
16
  <a name="/{{usr}}"></a>
17
17
  <a name="//apple_ref/{{language_stub}}/{{dash_type}}/{{name}}" class="dashAnchor"></a>
18
+ {{#direct_link}}
19
+ <a class="direct-link" href="{{url}}">{{name}}</a>
20
+ </code>
21
+ {{/direct_link}}
22
+ {{^direct_link}}
23
+ {{^usage_discouraged}}
18
24
  <a class="token" href="#/{{usr}}">{{name}}</a>
25
+ {{/usage_discouraged}}
26
+ {{#usage_discouraged}}
27
+ <a class="token discouraged" href="#/{{usr}}">{{name}}</a>
28
+ {{/usage_discouraged}}
19
29
  </code>
20
30
  {{#default_impl_abstract}}
21
31
  <span class="declaration-note">
@@ -32,6 +42,7 @@
32
42
  <div class="pointer-container"></div>
33
43
  <section class="section">
34
44
  <div class="pointer"></div>
45
+ {{> deprecation}}
35
46
  {{#abstract}}
36
47
  <div class="abstract">
37
48
  {{{abstract}}}
@@ -85,6 +96,7 @@
85
96
  </div>
86
97
  {{/github_token_url}}
87
98
  </section>
99
+ {{/direct_link}}
88
100
  </div>
89
101
  </li>
90
102
  {{/items}}
@@ -154,8 +154,14 @@ a {
154
154
  outline: 0;
155
155
  text-decoration: underline;
156
156
  }
157
- }
158
157
 
158
+ &.discouraged {
159
+ text-decoration: line-through;
160
+ &:hover, &:focus {
161
+ text-decoration: underline line-through;
162
+ }
163
+ }
164
+ }
159
165
 
160
166
  // ----- Tables
161
167
 
@@ -404,7 +410,7 @@ pre code {
404
410
  }
405
411
  }
406
412
 
407
- .token {
413
+ .token, .direct-link {
408
414
  padding-left: 3px;
409
415
  margin-left: 0px;
410
416
  font-size: 1rem;
@@ -479,7 +485,7 @@ pre code {
479
485
  }
480
486
  }
481
487
 
482
- .aside-warning {
488
+ .aside-warning, .aside-deprecated, .aside-unavailable {
483
489
  border-left: $aside_warning_border;
484
490
  .aside-title {
485
491
  color: $aside_warning_color;
@@ -612,4 +618,4 @@ form[role=search] {
612
618
  .tt-suggestion.tt-cursor .doc-parent-name {
613
619
  color: #fff;
614
620
  }
615
- }
621
+ }