jekyll-rpg 0.0.4 → 0.0.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.
- checksums.yaml +4 -4
- data/lib/collection_document.rb +49 -0
- data/lib/edge.rb +20 -0
- data/lib/graph.rb +48 -0
- data/lib/jekyll-rpg.rb +1 -1
- data/lib/reference_table.rb +64 -0
- data/lib/references.rb +39 -168
- metadata +20 -3
- data/lib/collection_page.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16f14fd9c3d40e94808552f1b4a38813cb1f75e97a50ab5f69acbd57026dadb2
|
4
|
+
data.tar.gz: 770ce2e9837de58c045cf32a2b20272f65b237420f3c733ade1081d6aee6d7b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e0dd4929f15a759ead437924a0ed5efc49e336a1cdb14474b5b008e060af0300f693c8280e8e7e9f921c8a40eaad10070b7acac786cbcadc0bc5a86ba198018
|
7
|
+
data.tar.gz: 620e850bb614a48458c7b78326af3d3a45f47c620b597d8a4aef217f9ded8106a2be791cb7278224f0f35d892f79c7b72b0fce1a279fa6fefebdeefcbd8f8aad
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllRPG
|
4
|
+
# Represents a document that may be in a Jekyll collection
|
5
|
+
class CollectionDocument
|
6
|
+
attr_accessor :name, :collection, :slug, :written
|
7
|
+
|
8
|
+
def extract_doc(doc)
|
9
|
+
@name = doc.data['name']
|
10
|
+
@collection = doc.collection.label
|
11
|
+
@slug = doc.data['slug']
|
12
|
+
@written = true
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
# extracts link text, collection and slug
|
17
|
+
# [@name](/@collection/@slug)
|
18
|
+
def extract_markdown(site, link)
|
19
|
+
@collection = link[%r{(?<=/).*(?=/)}]
|
20
|
+
@slug = link[%r{(?<=/)(?:(?!/).)*?(?=\))}]
|
21
|
+
@written = document_exists(site)
|
22
|
+
@name = @written ? find_document(site).data['name'] : link[/(?<=\[).*?(?=\])/]
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
# Checks whether document exists in a site
|
27
|
+
def document_exists(site)
|
28
|
+
!site.collections[@collection].nil? && !find_document(site).nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
# Find a document based on its collection and slug
|
32
|
+
def find_document(site)
|
33
|
+
site.collections[@collection].docs.find { |doc| doc.data['slug'] == @slug }
|
34
|
+
end
|
35
|
+
|
36
|
+
def markdown_link
|
37
|
+
"[#{@name}](/#{@collection}/#{@slug})"
|
38
|
+
end
|
39
|
+
|
40
|
+
def hash
|
41
|
+
{
|
42
|
+
'name' => @name,
|
43
|
+
'collection' => @collection,
|
44
|
+
'slug' => @slug,
|
45
|
+
'link' => markdown_link
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/edge.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllRPG
|
4
|
+
# Edge between two documents
|
5
|
+
class Edge
|
6
|
+
attr_accessor :reference, :referent
|
7
|
+
|
8
|
+
def initialize(referent, reference)
|
9
|
+
@referent = referent
|
10
|
+
@reference = reference
|
11
|
+
end
|
12
|
+
|
13
|
+
def hash
|
14
|
+
{
|
15
|
+
'reference' => reference.hash,
|
16
|
+
'referent' => referent.hash
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/graph.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllRPG
|
4
|
+
# Graph of relationships between CollectionDocuments
|
5
|
+
class Graph
|
6
|
+
attr_accessor :edges
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@edges = []
|
10
|
+
end
|
11
|
+
|
12
|
+
# Get the information for every page the current doc is referenced in
|
13
|
+
# And push links to an array that represents the collections of those pages
|
14
|
+
def document_references(doc)
|
15
|
+
document_hash = {}
|
16
|
+
|
17
|
+
referenced_in(doc).each do |reference|
|
18
|
+
document_hash[reference.collection] = [] unless document_hash.key?(reference.collection)
|
19
|
+
document_hash[reference.collection].push(reference.markdown_link)
|
20
|
+
end
|
21
|
+
|
22
|
+
document_hash.each do |k, v|
|
23
|
+
document_hash[k] = v.uniq
|
24
|
+
end
|
25
|
+
document_hash
|
26
|
+
end
|
27
|
+
|
28
|
+
# Based on the graph, returns edges that a specific document is the referent of
|
29
|
+
def referenced_in(doc)
|
30
|
+
collection = doc.collection.label
|
31
|
+
slug = doc.data['slug']
|
32
|
+
@edges.select do |edge|
|
33
|
+
edge.reference.collection == collection && edge.reference.slug == slug
|
34
|
+
end.map(&:referent)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Based on the graph, returns documents that are referenced, but do not exist yet
|
38
|
+
def unwritten
|
39
|
+
@edges.reject do |edge|
|
40
|
+
edge.reference.written
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def hash
|
45
|
+
@edges.map(&:hash)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/jekyll-rpg.rb
CHANGED
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllRPG
|
4
|
+
# Generates Reference Table
|
5
|
+
class ReferenceTable
|
6
|
+
attr_accessor :html
|
7
|
+
|
8
|
+
def initialize(site, doc)
|
9
|
+
@html = ''
|
10
|
+
@html = refs_table(doc.data['referenced_by']) if refs_table_required(site, doc)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Determines if refs table is required based on document,
|
14
|
+
# then collection, then site
|
15
|
+
def refs_table_required(site, doc)
|
16
|
+
if doc.data.key?('refs')
|
17
|
+
doc.data['refs']
|
18
|
+
elsif site.config['collections'][doc.collection.label].key?('refs')
|
19
|
+
site.config['collections'][doc.collection.label]['refs']
|
20
|
+
elsif site.config.key?('refs')
|
21
|
+
site.config['refs']
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def refs_table(refs)
|
26
|
+
table = <<~TABLE
|
27
|
+
# Referenced By:
|
28
|
+
<table>
|
29
|
+
<thead>
|
30
|
+
<tr>
|
31
|
+
<th>Collection</th>
|
32
|
+
<th>Links</th>
|
33
|
+
</tr>
|
34
|
+
</thead>
|
35
|
+
<tbody>
|
36
|
+
#{refs_rows(refs)}
|
37
|
+
</tbody>
|
38
|
+
</table>
|
39
|
+
TABLE
|
40
|
+
table
|
41
|
+
end
|
42
|
+
|
43
|
+
def refs_rows(refs)
|
44
|
+
row = ''
|
45
|
+
refs.each do |reference|
|
46
|
+
row += <<~ROW
|
47
|
+
<tr>
|
48
|
+
<td markdown="span"><b> #{reference[0].capitalize} </b></td>
|
49
|
+
<td markdown="span"> #{refs_links(reference)} </td>
|
50
|
+
</tr>
|
51
|
+
ROW
|
52
|
+
end
|
53
|
+
row
|
54
|
+
end
|
55
|
+
|
56
|
+
def refs_links(reference)
|
57
|
+
links = ''
|
58
|
+
reference[1].each do |link|
|
59
|
+
links += " - #{link} <br>"
|
60
|
+
end
|
61
|
+
links
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/references.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
3
|
+
require 'collection_document'
|
4
|
+
require 'edge'
|
5
|
+
require 'graph'
|
6
|
+
require 'reference_table'
|
5
7
|
|
6
8
|
module JekyllRPG
|
7
9
|
# References within Jekyll Collections
|
@@ -10,59 +12,53 @@ module JekyllRPG
|
|
10
12
|
|
11
13
|
def initialize(site)
|
12
14
|
@site = site
|
13
|
-
@graph =
|
15
|
+
@graph = Graph.new
|
14
16
|
@broken_links = []
|
15
17
|
@collection_keys = @site.collections.keys - ['posts']
|
16
18
|
|
19
|
+
reference_pass
|
20
|
+
referent_pass
|
21
|
+
|
22
|
+
# Create list of broken links
|
23
|
+
@graph.unwritten.each do |edge|
|
24
|
+
@broken_links.push(edge.hash)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Generating data on how documents reference other documents
|
29
|
+
def reference_pass
|
17
30
|
# Parse references from markdown links
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
)
|
29
|
-
markdown_links(doc).each do |reference|
|
30
|
-
@graph.push(edge(referent, reference))
|
31
|
-
end
|
31
|
+
collection_documents.each do |doc|
|
32
|
+
# Do not publish or reference a page if the site is not in DM Mode
|
33
|
+
# And the page is marked as for dms
|
34
|
+
if doc.data['dm'] && !@site.config['dm_mode']
|
35
|
+
doc.data['published'] = false
|
36
|
+
else
|
37
|
+
referent = CollectionDocument.new.extract_doc(doc)
|
38
|
+
markdown_links(doc).each do |link|
|
39
|
+
reference = CollectionDocument.new.extract_markdown(@site, link)
|
40
|
+
@graph.edges.push(Edge.new(referent, reference))
|
32
41
|
end
|
33
42
|
end
|
34
43
|
end
|
44
|
+
end
|
35
45
|
|
46
|
+
# Generating data on how documents are referenced to
|
47
|
+
def referent_pass
|
36
48
|
# For each collection page, add where it is referenced
|
37
|
-
|
38
|
-
|
39
|
-
|
49
|
+
collection_documents.each do |doc|
|
50
|
+
# Put the reference data on the doc
|
51
|
+
doc.data['referenced_by'] = @graph.document_references(doc)
|
40
52
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
page_refs[reference.collection] = [] unless page_refs.key?(reference.collection)
|
45
|
-
page_refs[reference.collection].push(reference.markdown_link)
|
46
|
-
end
|
47
|
-
|
48
|
-
# Make sure links in collections are unique
|
49
|
-
page_refs.each do |k, v|
|
50
|
-
page_refs[k] = v.uniq
|
51
|
-
end
|
52
|
-
|
53
|
-
# Put the reference data on the doc
|
54
|
-
doc.data['referenced_by'] = page_refs
|
55
|
-
|
56
|
-
# If the references table option is configured, append the table
|
57
|
-
if refs_table_required(doc)
|
58
|
-
doc.content = doc.content + refs_table(doc.data['referenced_by'])
|
59
|
-
end
|
60
|
-
end
|
53
|
+
# If the references table option is configured, append the table
|
54
|
+
table = ReferenceTable.new(@site, doc).html
|
55
|
+
doc.content = doc.content + table
|
61
56
|
end
|
57
|
+
end
|
62
58
|
|
63
|
-
|
64
|
-
|
65
|
-
@
|
59
|
+
def collection_documents
|
60
|
+
@collection_keys.flat_map do |collection|
|
61
|
+
@site.collections[collection].docs
|
66
62
|
end
|
67
63
|
end
|
68
64
|
|
@@ -72,130 +68,5 @@ module JekyllRPG
|
|
72
68
|
def markdown_links(doc)
|
73
69
|
doc.to_s.scan(%r{(?<=[^!])\[.*?\]\(/.*?/.*?\)})
|
74
70
|
end
|
75
|
-
|
76
|
-
# returns link text, collection and slug
|
77
|
-
# [0](/1/2) - as a [0, 1, 2]
|
78
|
-
def link_components(link)
|
79
|
-
[link[/(?<=\[).*?(?=\])/], link[%r{(?<=/).*(?=/)}], link[%r{(?<=/)(?:(?!/).)*?(?=\))}]]
|
80
|
-
end
|
81
|
-
|
82
|
-
# Find a document based on its collection and slug
|
83
|
-
def find_page(collection, slug)
|
84
|
-
@site.collections[collection].docs.find { |doc| doc.data['slug'] == slug }
|
85
|
-
end
|
86
|
-
|
87
|
-
# Returns true if document cannot be found in collection
|
88
|
-
def page_missing(collection, slug)
|
89
|
-
@site.collections[collection].nil? || find_page(collection, slug).nil?
|
90
|
-
end
|
91
|
-
|
92
|
-
# Returns a hash of two CollectionPages representing a graph edge
|
93
|
-
def edge(referent, reference)
|
94
|
-
referenced_name, referenced_collection, referenced_slug = link_components(reference)
|
95
|
-
if page_missing(referenced_collection, referenced_slug)
|
96
|
-
written = false
|
97
|
-
name = referenced_name
|
98
|
-
else
|
99
|
-
written = true
|
100
|
-
name = find_page(referenced_collection, referenced_slug).data['name']
|
101
|
-
end
|
102
|
-
{
|
103
|
-
'referent' => referent,
|
104
|
-
'reference' => CollectionPage.new(
|
105
|
-
name,
|
106
|
-
referenced_collection,
|
107
|
-
referenced_slug,
|
108
|
-
written
|
109
|
-
)
|
110
|
-
}
|
111
|
-
end
|
112
|
-
|
113
|
-
# Based on the graph, returns edges that a specific document is the referent of
|
114
|
-
def referenced_in(collection, slug)
|
115
|
-
@graph.select do |edge|
|
116
|
-
edge['reference'].collection == collection && edge['reference'].slug == slug
|
117
|
-
end.map { |edge| edge['referent'] }
|
118
|
-
end
|
119
|
-
|
120
|
-
# Based on the graph, returns documents that are referenced, but do not exist yet
|
121
|
-
def unwritten_pages
|
122
|
-
@graph.reject do |edge|
|
123
|
-
edge['reference'].written
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
# Determines if refs table is required based on document,
|
128
|
-
# then collection, then site
|
129
|
-
def refs_table_required(doc)
|
130
|
-
if doc.data.key?('refs')
|
131
|
-
doc.data['refs']
|
132
|
-
elsif @site.config['collections'][doc.collection.label].key?('refs')
|
133
|
-
@site.config['collections'][doc.collection.label]['refs']
|
134
|
-
elsif @site.config.key?('refs')
|
135
|
-
@site.config['refs']
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
# Returns an easily accessible hash representing an edge for Jekyll purposes
|
140
|
-
def edge_hash(edge)
|
141
|
-
{
|
142
|
-
'reference_name' => edge['reference'].name,
|
143
|
-
'reference_collection' => edge['reference'].collection,
|
144
|
-
'reference_slug' => edge['reference'].slug,
|
145
|
-
'reference_link' => edge['reference'].markdown_link,
|
146
|
-
'referent_name' => edge['referent'].name,
|
147
|
-
'referent_collection' => edge['referent'].collection,
|
148
|
-
'referent_slug' => edge['referent'].slug,
|
149
|
-
'referent_link' => edge['referent'].markdown_link
|
150
|
-
}
|
151
|
-
end
|
152
|
-
|
153
|
-
# Returns a graph made up of hashed edges
|
154
|
-
def hashed_graph
|
155
|
-
@graph.map { |edge| edge_hash(edge) }
|
156
|
-
end
|
157
|
-
|
158
|
-
# The following three functions return a HTML table
|
159
|
-
# That for a specific document shows the documents that
|
160
|
-
# reference it
|
161
|
-
|
162
|
-
def refs_table(refs)
|
163
|
-
table = <<~TABLE
|
164
|
-
# Referenced By:
|
165
|
-
<table>
|
166
|
-
<thead>
|
167
|
-
<tr>
|
168
|
-
<th>Collection</th>
|
169
|
-
<th>Links</th>
|
170
|
-
</tr>
|
171
|
-
</thead>
|
172
|
-
<tbody>
|
173
|
-
#{refs_rows(refs)}
|
174
|
-
</tbody>
|
175
|
-
</table>
|
176
|
-
TABLE
|
177
|
-
table
|
178
|
-
end
|
179
|
-
|
180
|
-
def refs_rows(refs)
|
181
|
-
row = ''
|
182
|
-
refs.each do |reference|
|
183
|
-
row += <<~ROW
|
184
|
-
<tr>
|
185
|
-
<td markdown="span"><b> #{reference[0].capitalize} </b></td>
|
186
|
-
<td markdown="span"> #{refs_links(reference)} </td>
|
187
|
-
</tr>
|
188
|
-
ROW
|
189
|
-
end
|
190
|
-
row
|
191
|
-
end
|
192
|
-
|
193
|
-
def refs_links(reference)
|
194
|
-
links = ''
|
195
|
-
reference[1].each do |link|
|
196
|
-
links += " - #{link} <br>"
|
197
|
-
end
|
198
|
-
links
|
199
|
-
end
|
200
71
|
end
|
201
72
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-rpg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Lockwood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: factory_bot
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: pry
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,8 +72,11 @@ executables: []
|
|
58
72
|
extensions: []
|
59
73
|
extra_rdoc_files: []
|
60
74
|
files:
|
61
|
-
- lib/
|
75
|
+
- lib/collection_document.rb
|
76
|
+
- lib/edge.rb
|
77
|
+
- lib/graph.rb
|
62
78
|
- lib/jekyll-rpg.rb
|
79
|
+
- lib/reference_table.rb
|
63
80
|
- lib/references.rb
|
64
81
|
homepage: https://github.com/tomlockwood/jekyll-rpg
|
65
82
|
licenses:
|
data/lib/collection_page.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module JekyllRPG
|
4
|
-
# Represents a document that may be in a Jekyll collection
|
5
|
-
class CollectionPage
|
6
|
-
attr_accessor :name, :collection, :slug, :written
|
7
|
-
|
8
|
-
def initialize(name, collection, slug, written)
|
9
|
-
@name = name
|
10
|
-
@collection = collection
|
11
|
-
@slug = slug
|
12
|
-
# boolean
|
13
|
-
@written = written
|
14
|
-
end
|
15
|
-
|
16
|
-
def markdown_link
|
17
|
-
"[#{@name}](/#{@collection}/#{@slug})"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|