jekyll-awesome-nav 0.1.0 → 0.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01fa08c8a44630c6314fb330db8db6de0977bc66adb8e2c48dd5f127ede6ff8d
4
- data.tar.gz: 29964bc8684fc64593bb76b9385ec19706b578aef5ee780155be2f518c50873b
3
+ metadata.gz: 92223e2c3e03f661381ed950b514da942c9ce18ddc97b5a51e1ffd3536971efa
4
+ data.tar.gz: a12d8cc9e0500e4deb65803b8ad1bd94cfa88f291b452f21edceb9fd16016c32
5
5
  SHA512:
6
- metadata.gz: d191dc308b3c7b7b2431417f12c4cdfe59b7acb4c2461364beec68a481909b81dad07724405ee2a2a1644203b6bf13705e86f60af8e98b0895363b3a202a5cb1
7
- data.tar.gz: ef4ed52b48b7595d0994ff1f19ba64d70d4e81998ea1ded6b14b395f165a11a0ea5efe43bff3de73ebd8c7e35a48a5e06e7ec1054ff2407becfc838e7ceae6ae
6
+ metadata.gz: e9fdc037fed9c4fa24186e83047cb98a6ed0bd36e313163d9cc6b8ae87b02bfe07225e6bd1180c502ab437c0764242c78de8ae5bcef5558d29ad2ede34951f88
7
+ data.tar.gz: 0f973ac341990dc4dfebb041621e8e90e8ab3650d3ea701a4e87bcf8e94a276d360a44af9699306d768cb64810ef1fa74a9a67f8bbcb7716894d82894664b2f2
@@ -1,5 +1,5 @@
1
1
  # Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
2
- _commit: aac269f
2
+ _commit: 467877a
3
3
  _src_path: gh:athackst/ci
4
4
  automerge_mode: poll
5
5
  bump_script_path: ''
@@ -15,35 +15,52 @@ module Jekyll
15
15
  pages = PageSet.new(site, config)
16
16
  return if pages.empty?
17
17
 
18
+ result = build_navigation_result(site, config, pages)
19
+ assign_page_navigation(pages, result)
20
+ assign_site_navigation(site, result)
21
+ end
22
+
23
+ private
24
+
25
+ def build_navigation_result(site, config, pages)
18
26
  tree = TreeBuilder.new(pages: pages, root_dir: config.root_dir).build
19
27
  nav_map = NavFileLoader.new(site: site, config: config).load
20
- resolved_tree = NavResolver.new(root_dir: config.root_dir, nav_map: nav_map).apply(tree, config.root_dir)
21
- result = NavigationResult.new(
28
+ resolved_tree = NavResolver.new(
29
+ root_dir: config.root_dir,
30
+ nav_map: nav_map,
31
+ root_page: pages.root_page
32
+ ).apply(tree, config.root_dir)
33
+
34
+ NavigationResult.new(
22
35
  tree: resolved_tree,
23
36
  root_dir: config.root_dir,
24
37
  root_page: pages.root_page,
25
38
  nav_map: nav_map
26
39
  )
40
+ end
27
41
 
42
+ def assign_page_navigation(pages, result)
28
43
  pages.each do |page|
29
44
  page_dir = Utils.source_dir_for(page)
30
45
  nav_dir = result.nav_dir_for(page_dir)
31
46
  page_url = Utils.normalize_url(page.url)
47
+ page_entry = result.nav_entry_for(page_url)
48
+
32
49
  page.data["awesome_nav"] = deep_copy(result.serialized_tree)
33
50
  page.data["awesome_nav_local"] = deep_copy(result.local_nav_for(nav_dir))
34
51
  page.data["awesome_nav_dir"] = nav_dir
35
52
  page.data["breadcrumbs"] = result.breadcrumbs_for(page)
36
- page.data["awesome_nav_previous"] = deep_copy(result.nav_entry_for(page_url)&.fetch("previous", nil))
37
- page.data["awesome_nav_next"] = deep_copy(result.nav_entry_for(page_url)&.fetch("next", nil))
53
+ page.data["awesome_nav_previous"] = deep_copy(page_entry&.fetch("previous", nil))
54
+ page.data["awesome_nav_next"] = deep_copy(page_entry&.fetch("next", nil))
38
55
  end
56
+ end
39
57
 
58
+ def assign_site_navigation(site, result)
40
59
  site.config["awesome_nav_tree"] = deep_copy(result.serialized_tree)
41
60
  site.config["awesome_nav_local_map"] = deep_copy(result.serialized_local_nav_map)
42
61
  site.config["awesome_nav_files"] = deep_copy(result.serialized_nav_files)
43
62
  end
44
63
 
45
- private
46
-
47
64
  def deep_copy(value)
48
65
  Marshal.load(Marshal.dump(value))
49
66
  end
@@ -2,12 +2,16 @@
2
2
 
3
3
  module Jekyll
4
4
  module AwesomeNav
5
+ # This class centralizes override resolution, matching, and unmatched append
6
+ # behavior, so a narrow class-length suppression keeps the logic together.
7
+ # rubocop:disable Metrics/ClassLength
5
8
  class NavResolver
6
9
  ResolutionContext = Struct.new(:append_unmatched, :sort_options, :ignore_patterns, keyword_init: true)
7
10
 
8
- def initialize(root_dir:, nav_map:)
11
+ def initialize(root_dir:, nav_map:, root_page: nil)
9
12
  @root_dir = root_dir
10
13
  @nav_map = nav_map
14
+ @root_page = root_page
11
15
  @generated_by_dir = {}
12
16
  @generated_by_path = {}
13
17
  end
@@ -149,7 +153,13 @@ module Jekyll
149
153
  return [] unless generated
150
154
  return [] if hidden?(generated)
151
155
 
152
- return [section_page_node(generated, item.title)] if generated.section? && Utils.normalize_dir(generated.dir) == current_dir
156
+ if generated.section? &&
157
+ (Utils.normalize_dir(generated.dir) == current_dir || references_section_index?(item, current_dir, generated))
158
+ node = section_page_node(generated, item.title)
159
+ mark_matched(node, matched)
160
+ mark_section_consumed(generated, matched)
161
+ return [node]
162
+ end
153
163
 
154
164
  node = generated.deep_dup
155
165
  node.title = item.title if item.title
@@ -229,7 +239,10 @@ module Jekyll
229
239
  next if ignored?(item, current_dir, context.ignore_patterns)
230
240
 
231
241
  node = item.deep_dup
232
- with_resolved_children(node, Utils.normalize_dir(node.dir), context)
242
+ pruned = prune_matched_descendants(node, matched, context, current_dir)
243
+ next if pruned.nil?
244
+
245
+ with_resolved_children(pruned, Utils.normalize_dir(pruned.dir), context)
233
246
  end
234
247
  end
235
248
 
@@ -240,6 +253,9 @@ module Jekyll
240
253
 
241
254
  section = @generated_by_dir[candidate]
242
255
  return section if section
256
+
257
+ root = root_page_node_for(candidate)
258
+ return root if root
243
259
  end
244
260
 
245
261
  nil
@@ -337,10 +353,38 @@ module Jekyll
337
353
  matched[node_key(item)]
338
354
  end
339
355
 
356
+ def prune_matched_descendants(item, matched, context, current_dir)
357
+ return nil if matched?(item, matched)
358
+ return item unless item.section?
359
+
360
+ child_dir = Utils.normalize_dir(item.dir)
361
+ pruned_children = item.children.filter_map do |child|
362
+ next if hidden?(child)
363
+ next if ignored?(child, child_dir.empty? ? current_dir : child_dir, context.ignore_patterns)
364
+
365
+ prune_matched_descendants(child.deep_dup, matched, context, child_dir.empty? ? current_dir : child_dir)
366
+ end
367
+
368
+ return nil if pruned_children.empty? && item.url.nil?
369
+
370
+ Node.section(
371
+ dir: item.dir,
372
+ title: item.title,
373
+ url: item.url,
374
+ children: pruned_children,
375
+ path: item.path,
376
+ filename: item.filename
377
+ )
378
+ end
379
+
340
380
  def node_key(item)
341
381
  item.section? ? "dir:#{Utils.normalize_dir(item.dir)}" : "path:#{Utils.normalize_dir(item.path || item.url)}"
342
382
  end
343
383
 
384
+ def mark_section_consumed(item, matched)
385
+ matched["dir:#{Utils.normalize_dir(item.dir)}"] = true
386
+ end
387
+
344
388
  def child_dir_for_item(parent_dir, item)
345
389
  return Utils.normalize_dir(item.dir) if item.dir
346
390
  return nil unless item.url
@@ -365,6 +409,29 @@ module Jekyll
365
409
  segments = path.split("/")
366
410
  File.extname(segments.last).empty? ? segments.join("/") : segments[0...-1].join("/")
367
411
  end
412
+
413
+ def root_page_node_for(candidate)
414
+ return nil unless @root_page
415
+
416
+ normalized = Utils.normalize_dir(candidate)
417
+ root_index_path = Utils.normalize_dir(File.join(@root_dir, "index.md"))
418
+ return nil unless [@root_dir, root_index_path, "index.md"].include?(normalized)
419
+
420
+ Node.page(
421
+ dir: @root_dir,
422
+ title: Utils.page_title(@root_page, File.basename(@root_page.path, File.extname(@root_page.path))),
423
+ url: Utils.normalize_url(@root_page.url),
424
+ path: Utils.source_path_for(@root_page),
425
+ filename: File.basename(Utils.source_path_for(@root_page))
426
+ )
427
+ end
428
+
429
+ def references_section_index?(item, current_dir, generated)
430
+ return false unless generated.path
431
+
432
+ candidates_for(item.target, current_dir).include?(Utils.normalize_dir(generated.path))
433
+ end
368
434
  end
435
+ # rubocop:enable Metrics/ClassLength
369
436
  end
370
437
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Jekyll
4
4
  module AwesomeNav
5
- VERSION = "0.1.0"
5
+ VERSION = "0.1.1"
6
6
 
7
7
  def self.warn_if_unstamped_version(output = $stderr)
8
8
  return unless VERSION == "0.0.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-awesome-nav
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Allison Thackston
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-05-07 00:00:00.000000000 Z
11
+ date: 2026-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll