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 +4 -4
- data/.copier-answers.ci.yml +1 -1
- data/lib/jekyll/awesome_nav/generator.rb +23 -6
- data/lib/jekyll/awesome_nav/nav_resolver.rb +70 -3
- data/lib/jekyll/awesome_nav/version.rb +1 -1
- 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: 92223e2c3e03f661381ed950b514da942c9ce18ddc97b5a51e1ffd3536971efa
|
|
4
|
+
data.tar.gz: a12d8cc9e0500e4deb65803b8ad1bd94cfa88f291b452f21edceb9fd16016c32
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e9fdc037fed9c4fa24186e83047cb98a6ed0bd36e313163d9cc6b8ae87b02bfe07225e6bd1180c502ab437c0764242c78de8ae5bcef5558d29ad2ede34951f88
|
|
7
|
+
data.tar.gz: 0f973ac341990dc4dfebb041621e8e90e8ab3650d3ea701a4e87bcf8e94a276d360a44af9699306d768cb64810ef1fa74a9a67f8bbcb7716894d82894664b2f2
|
data/.copier-answers.ci.yml
CHANGED
|
@@ -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(
|
|
21
|
-
|
|
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(
|
|
37
|
-
page.data["awesome_nav_next"] = deep_copy(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
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.
|
|
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-
|
|
11
|
+
date: 2026-05-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jekyll
|