jekyll-site-tree 0.0.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 +7 -0
- data/lib/jekyll-site-tree.rb +153 -0
- data/lib/utils/version.rb +5 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f2ccb902abceef0ee4301c9294bdcf6b5f74d3a4dc2007ff5540aa56bd0702bf
|
4
|
+
data.tar.gz: cd6548e901ca669f9b0a476033c8bef354702bb9d017e9e80f3c89ad882fe612
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ecb13b35782ce2aa96a91e9afcef6c7ece0118811eeac6f79d27fee3815616588ac34ecc9ff0c17d890e264c67b83525490e10e4006671db30378356f148926f
|
7
|
+
data.tar.gz: 0f2dba3b28b7fbb5fc01bee25a26465a7e8bce1d67a2aad6fbec854ca9455707e5cbe10aae0824b3909e0312fc199588e9f02533f0351ab45839d946b8026af2
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require 'jekyll'
|
2
|
+
require 'natural_sort'
|
3
|
+
|
4
|
+
module Jekyll
|
5
|
+
class SiteTreeGenerator < Jekyll::Generator
|
6
|
+
def generate(site)
|
7
|
+
@site = site
|
8
|
+
|
9
|
+
unless site_tree_file
|
10
|
+
Jekyll.logger.warn("SiteTree:", "skipped because no 'site-tree' file specified in config")
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
page = @site.pages.find { |page| page.dir.slice(1, page.dir.length) + page.name == site_tree_file }
|
15
|
+
|
16
|
+
if page.nil?
|
17
|
+
Jekyll.logger.error("SiteTree:", "unable to find 'site-tree' file: " + site_tree_file)
|
18
|
+
return
|
19
|
+
end
|
20
|
+
|
21
|
+
Jekyll.logger.info("SiteTree:", "building site tree")
|
22
|
+
# page.data['site_tree_permalinks'] = permalinks
|
23
|
+
page.data['site_tree'] = site_tree
|
24
|
+
end
|
25
|
+
|
26
|
+
def permalinks
|
27
|
+
pages = @site.pages
|
28
|
+
pages += @site.static_files
|
29
|
+
pages += @site.collections.map do |tuple|
|
30
|
+
name, collection = tuple
|
31
|
+
(collection.write?) ? collection.docs : []
|
32
|
+
end.flatten
|
33
|
+
|
34
|
+
pages.map { |pg| pg.url }.select do |page|
|
35
|
+
!excludes.any? { |rx| rx.match? page }
|
36
|
+
end.uniq.sort(&NaturalSort)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def config
|
42
|
+
@site.config["site_tree"] || Hash.new
|
43
|
+
end
|
44
|
+
|
45
|
+
def site_tree_file
|
46
|
+
config["file"]
|
47
|
+
end
|
48
|
+
|
49
|
+
def include_extension?
|
50
|
+
!!config["extension"]
|
51
|
+
end
|
52
|
+
|
53
|
+
def excludes
|
54
|
+
if @excludes.nil?
|
55
|
+
@excludes = (config["exclude"] || []).map do |exclude|
|
56
|
+
# if exclude begins with a slash, the expression references
|
57
|
+
# an absolute path, otherwise any match is considered valid
|
58
|
+
Regexp.new(exclude[0] == '/' ? '^' + exclude : exclude)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
@excludes
|
62
|
+
end
|
63
|
+
|
64
|
+
def substitutions
|
65
|
+
if @substitutions.nil?
|
66
|
+
@substitutions = (config["substitute"] || []).each do |subs|
|
67
|
+
subs["expr"] = Regexp.new(subs["expr"])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
@substitutions
|
71
|
+
end
|
72
|
+
|
73
|
+
def permalink_tuples
|
74
|
+
subs = substitutions
|
75
|
+
|
76
|
+
permalinks.map do |link|
|
77
|
+
sub = subs.find { |sub| sub["expr"].match?(link) }
|
78
|
+
new = (sub.nil?) ? link : link.gsub(sub["expr"], sub["name"])
|
79
|
+
|
80
|
+
unless include_extension?
|
81
|
+
new = File.join(File.dirname(new), File.basename(new, '.*'))
|
82
|
+
end
|
83
|
+
|
84
|
+
{ :path => new, :link => link }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# kind of an ugly solution, nests each path in the sites permalinks
|
89
|
+
# into a series of hashes (each hash connects to the next hash) which
|
90
|
+
# constructs a sort of tree. The path & link for the current entry is
|
91
|
+
# found through the :path & :link fields.
|
92
|
+
def permalink_tree
|
93
|
+
tree = Hash.new
|
94
|
+
|
95
|
+
permalink_tuples.each do |tuple|
|
96
|
+
branch = tree
|
97
|
+
branch_path = tuple[:path].split('/')
|
98
|
+
|
99
|
+
branch_path.slice(1, branch_path.length-2).each do |path|
|
100
|
+
branch = (branch[path] ||= Hash.new)
|
101
|
+
end
|
102
|
+
|
103
|
+
branch[branch_path.last] = tuple
|
104
|
+
end
|
105
|
+
|
106
|
+
tree
|
107
|
+
end
|
108
|
+
|
109
|
+
# converts a permalink_tree into an XML structure
|
110
|
+
def site_tree
|
111
|
+
def recursive_construct_tree(name, tree)
|
112
|
+
result = '<li>'
|
113
|
+
|
114
|
+
current_path = tree.delete(:path)
|
115
|
+
current_link = tree.delete(:link)
|
116
|
+
|
117
|
+
if current_path
|
118
|
+
result += "<a href=\"%s\">%s</a>" % [
|
119
|
+
current_link, name].map { |s| html_coder.encode(s) }
|
120
|
+
end
|
121
|
+
|
122
|
+
unless tree.empty?
|
123
|
+
if tree.length == 1 && !current_path then
|
124
|
+
child_name = tree.keys[0]
|
125
|
+
|
126
|
+
return recursive_construct_tree(
|
127
|
+
name + '/' + child_name, tree[child_name])
|
128
|
+
else
|
129
|
+
result += html_coder.encode(name) if !current_path
|
130
|
+
|
131
|
+
result += '<ul>'
|
132
|
+
tree.each do |name, subtree|
|
133
|
+
result += recursive_construct_tree(name, subtree)
|
134
|
+
end
|
135
|
+
result += '</ul>'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
result += '</li>'
|
140
|
+
end
|
141
|
+
|
142
|
+
result = '<ul>'
|
143
|
+
permalink_tree.each do |name, tree|
|
144
|
+
result += recursive_construct_tree(name, tree)
|
145
|
+
end
|
146
|
+
result += '</ul>'
|
147
|
+
end
|
148
|
+
|
149
|
+
def html_coder
|
150
|
+
@@html_coder ||= HTMLEntities.new
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jekyll-site-tree
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- mohkale
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-11-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: jekyll
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: natural_sort
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: |
|
56
|
+
A jekyll generator which creates a site-tree consisting of all the files in the output (built) path of a jekyll website.
|
57
|
+
|
58
|
+
For a site with a structure like:
|
59
|
+
- /foo.md
|
60
|
+
- /bar.html
|
61
|
+
- /posts/2019/15/10/hello-world.md
|
62
|
+
- /posts/2019/15/10/lo-and-behold.md
|
63
|
+
- /assets/styles/main.scss
|
64
|
+
|
65
|
+
You'll recieve an XML unordered list like:
|
66
|
+
- foo
|
67
|
+
- bar
|
68
|
+
- posts/2019/15/10
|
69
|
+
- hello-world
|
70
|
+
- lo-and-behold
|
71
|
+
- assets/styles
|
72
|
+
- main
|
73
|
+
email: mohkalsin@gmail.com
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- lib/jekyll-site-tree.rb
|
79
|
+
- lib/utils/version.rb
|
80
|
+
homepage:
|
81
|
+
licenses:
|
82
|
+
- GPL-3.0
|
83
|
+
metadata: {}
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubygems_version: 3.0.6
|
100
|
+
signing_key:
|
101
|
+
specification_version: 4
|
102
|
+
summary: create a site tree from a jekyll page
|
103
|
+
test_files: []
|