jekyll-rpg 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|