jekyll-wikilinks 0.0.9 → 0.0.12
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/jekyll-wikilinks/patch/doc_manager.rb +16 -5
- data/lib/jekyll-wikilinks/util/link_index.rb +29 -19
- data/lib/jekyll-wikilinks/util/parser.rb +20 -8
- data/lib/jekyll-wikilinks/util/regex.rb +2 -2
- data/lib/jekyll-wikilinks/util/wikilink.rb +56 -22
- data/lib/jekyll-wikilinks/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19fe7bb2a769e61e5d1d554bdbfd2553d7e8359800d06ed58fb5a77e1ed39e60
|
4
|
+
data.tar.gz: cc5a57fd28b83455523a2e5a67f1f5e9f3a6a2d335e6bc72b55650fc05aa836b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e24fd21d6c63de04a1e929f0c3cdb5e040643ff2cd1d1cafa4f8f6caf8f067ff96121ee276876f3f43b5f6b63825fe05bc0b2f7dddfd6ceff3f0b92024a8ab0
|
7
|
+
data.tar.gz: 2883023cd22018b3d3b8bc76d5960b98c3e906021488cf3928914b9a16568b69b45e08782a909568a8ab851b806ec182ff89e3be7f14b7d491d6a8e34e209d6e
|
@@ -4,6 +4,7 @@ require_relative "../util/regex"
|
|
4
4
|
module Jekyll
|
5
5
|
module WikiLinks
|
6
6
|
|
7
|
+
# todo: move these methods to the 'WikiLink' classes...?
|
7
8
|
#
|
8
9
|
# this class is responsible for answering any questions
|
9
10
|
# related to jekyll markdown documents
|
@@ -55,6 +56,13 @@ module Jekyll
|
|
55
56
|
return docs[0]
|
56
57
|
end
|
57
58
|
|
59
|
+
def get_doc_by_fpath(file_path)
|
60
|
+
Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'file_path'") if file_path.nil? || file_path.empty?
|
61
|
+
docs = @md_docs.select{ |d| d.relative_path == (file_path + ".md") }
|
62
|
+
return nil if docs.nil? || docs.empty? || docs.size > 1
|
63
|
+
return docs[0]
|
64
|
+
end
|
65
|
+
|
58
66
|
def get_doc_by_url(url)
|
59
67
|
Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'url'") if url.nil? || url.empty?
|
60
68
|
docs = @md_docs.select{ |d| d.url == url }
|
@@ -78,12 +86,15 @@ module Jekyll
|
|
78
86
|
|
79
87
|
# validators
|
80
88
|
|
81
|
-
def file_exists?(filename)
|
89
|
+
def file_exists?(filename, file_path=nil)
|
82
90
|
Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'filename'") if filename.nil? || filename.empty?
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
91
|
+
if file_path.nil?
|
92
|
+
return false if get_doc_by_fname(filename).nil? && get_image_by_fname(filename).nil?
|
93
|
+
return true
|
94
|
+
else
|
95
|
+
return false if get_doc_by_fpath(file_path).nil?
|
96
|
+
return true
|
97
|
+
end
|
87
98
|
end
|
88
99
|
|
89
100
|
def doc_has_header?(doc, header)
|
@@ -23,46 +23,56 @@ module Jekyll
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def populate(doc, wikilink_blocks, wikilink_inlines)
|
26
|
-
#
|
26
|
+
# #
|
27
|
+
# blocks #
|
28
|
+
# #
|
27
29
|
wikilink_blocks.each do |wlbl|
|
28
30
|
if wlbl.is_valid?
|
31
|
+
#
|
29
32
|
# attributes
|
33
|
+
#
|
30
34
|
target_attr = @index[doc.url].attributes.detect { |atr| atr['type'] == wlbl.link_type }
|
31
|
-
|
35
|
+
# create
|
32
36
|
if target_attr.nil?
|
33
37
|
@index[doc.url].attributes << wlbl.linked_fm_data
|
34
|
-
|
38
|
+
# append
|
35
39
|
else
|
36
|
-
target_attr['urls'] += wlbl.urls
|
40
|
+
target_attr['urls'] += wlbl.urls
|
37
41
|
end
|
42
|
+
## append missing docs
|
43
|
+
@index[doc.url].missing += wlbl.missing_doc_filenames
|
44
|
+
#
|
38
45
|
# attributed
|
46
|
+
#
|
39
47
|
wlbl.linked_docs.each do |linked_doc|
|
40
48
|
target_attr = @index[linked_doc.url].attributed.detect { |atr| atr['type'] == wlbl.link_type }
|
41
|
-
|
49
|
+
# create
|
42
50
|
if target_attr.nil?
|
43
51
|
@index[linked_doc.url].attributed << wlbl.context_fm_data
|
44
|
-
|
52
|
+
# append
|
45
53
|
else
|
46
54
|
target_attr['urls'] << doc.url
|
47
55
|
end
|
48
56
|
end
|
49
57
|
else
|
50
|
-
|
51
|
-
|
52
|
-
|
58
|
+
#
|
59
|
+
# invalid || empty
|
60
|
+
#
|
61
|
+
@index[doc.url].missing += wlbl.missing_doc_filenames
|
53
62
|
end
|
54
63
|
end
|
55
|
-
#
|
64
|
+
# #
|
65
|
+
# inlines #
|
66
|
+
# #
|
56
67
|
wikilink_inlines.each do |wlil|
|
57
|
-
if
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
68
|
+
return if wlil.is_img?
|
69
|
+
if wlil.is_valid?
|
70
|
+
# forelink
|
71
|
+
@index[doc.url].forelinks << wlil.linked_fm_data
|
72
|
+
# backlink
|
73
|
+
@index[wlil.linked_doc.url].backlinks << wlil.context_fm_data
|
74
|
+
else
|
75
|
+
@index[doc.url].missing << wlil.filename
|
66
76
|
end
|
67
77
|
end
|
68
78
|
end
|
@@ -76,6 +76,8 @@ module Jekyll
|
|
76
76
|
end
|
77
77
|
# replace text
|
78
78
|
return if @wikilink_inlines.nil?
|
79
|
+
# process typed wikilinks first so we don't accidentally
|
80
|
+
# overwrite them when handling untyped wikilinks
|
79
81
|
self.sort_typed_first
|
80
82
|
@wikilink_inlines.each do |wikilink|
|
81
83
|
doc_content.gsub!(
|
@@ -125,24 +127,34 @@ module Jekyll
|
|
125
127
|
# markdown file processing
|
126
128
|
linked_doc = wikilink.linked_doc
|
127
129
|
link_type_txt = wikilink.is_typed? ? " #{$wiki_conf.css_name("typed")} #{wikilink.link_type}" : ""
|
128
|
-
|
129
|
-
inner_txt = wikilink.label_txt if wikilink.labelled?
|
130
130
|
lnk_doc_rel_url = relative_url(linked_doc.url)
|
131
|
-
|
132
|
-
|
133
|
-
|
131
|
+
if wikilink.labelled?
|
132
|
+
inner_txt = wikilink.label_txt
|
133
|
+
elsif linked_doc.data.keys.include?('title')
|
134
|
+
inner_txt = linked_doc.data['title'].downcase
|
135
|
+
# in case there is no 'title' frontmatter attribute
|
136
|
+
# (i'm seeing deprecation warnings, but there might
|
137
|
+
# be bugs caused by not using this...)
|
138
|
+
elsif linked_doc.respond_to?(:title)
|
139
|
+
inner_txt = linked_doc.title.downcase
|
140
|
+
# pages don't have automatically generated titles
|
141
|
+
else
|
142
|
+
inner_txt = Jekyll::Utils.slugify(linked_doc.basename)
|
143
|
+
end
|
144
|
+
# level-specific
|
145
|
+
if (wikilink.level == "file_path" || wikilink.level == "filename")
|
134
146
|
return build_html_embed(
|
135
|
-
linked_doc
|
147
|
+
linked_doc.title,
|
136
148
|
linked_doc.content,
|
137
149
|
lnk_doc_rel_url
|
138
150
|
) if wikilink.embedded?
|
139
151
|
elsif (wikilink.level == "header")
|
140
152
|
# from: https://github.com/jekyll/jekyll/blob/6855200ebda6c0e33f487da69e4e02ec3d8286b7/Rakefile#L74
|
141
153
|
lnk_doc_rel_url += "\#" + Jekyll::Utils.slugify(wikilink.header_txt)
|
142
|
-
inner_txt
|
154
|
+
inner_txt += " > #{wikilink.header_txt.downcase}" if !wikilink.labelled?
|
143
155
|
elsif (wikilink.level == "block")
|
144
156
|
lnk_doc_rel_url += "\#" + wikilink.block_id
|
145
|
-
inner_txt
|
157
|
+
inner_txt += " > ^#{wikilink.block_id}" if !wikilink.labelled?
|
146
158
|
else
|
147
159
|
Jekyll.logger.error("Jekyll-Wikilinks: Invalid wikilink level")
|
148
160
|
end
|
@@ -12,7 +12,7 @@ module Jekyll
|
|
12
12
|
SUPPORTED_IMG_FORMATS = Set.new(['.png', '.jpg', '.gif', '.psd', '.svg'])
|
13
13
|
|
14
14
|
# wikilink constants
|
15
|
-
|
15
|
+
REGEX_LINK_LEFT = /\[\[/
|
16
16
|
REGEX_LINK_RIGHT = /\]\]/
|
17
17
|
REGEX_LINK_EMBED = /(?<embed>\!)/
|
18
18
|
REGEX_LINK_TYPE = /\s*::\s*/
|
@@ -22,7 +22,7 @@ module Jekyll
|
|
22
22
|
|
23
23
|
# wikitext usable char requirements
|
24
24
|
REGEX_LINK_TYPE_CHARS = /[^\n\s\!\#\^\|\]]+/i
|
25
|
-
REGEX_FILENAME_CHARS = /[
|
25
|
+
REGEX_FILENAME_CHARS = /[^\\:\#\^\|\[\]]+/i
|
26
26
|
REGEX_HEADER_CHARS = /[^\!\#\^\|\[\]]+/i
|
27
27
|
REGEX_BLOCK_ID_CHARS = /[^\\\/:\!\#\^\|\[\]^\n]+/i
|
28
28
|
REGEX_LABEL_CHARS = /(.+?)(?=\]{2}[^\]])/i
|
@@ -7,7 +7,7 @@ module Jekyll
|
|
7
7
|
# wikilink classes know everything about the original markdown syntax and its semantic meaning
|
8
8
|
|
9
9
|
class WikiLinkBlock
|
10
|
-
|
10
|
+
attr_reader :link_type, :filenames
|
11
11
|
|
12
12
|
# parameters ordered by appearance in regex
|
13
13
|
def initialize(doc_mngr, context_filename, link_type, bullet_type=nil)
|
@@ -68,7 +68,7 @@ module Jekyll
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def urls
|
71
|
-
# return @filenames.map { |f| @doc_mngr.get_doc_by_fname(f) }
|
71
|
+
# return @filenames.map { |f| @doc_mngr.get_doc_by_fname(f).url }.compact()
|
72
72
|
urls = []
|
73
73
|
@filenames.each do |f|
|
74
74
|
doc = @doc_mngr.get_doc_by_fname(f)
|
@@ -87,9 +87,10 @@ module Jekyll
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def linked_fm_data
|
90
|
+
valid_urls = self.urls.select{ |url| @doc_mngr.get_doc_by_url(url) }
|
90
91
|
return {
|
91
92
|
'type' => @link_type,
|
92
|
-
'urls' =>
|
93
|
+
'urls' => valid_urls,
|
93
94
|
}
|
94
95
|
end
|
95
96
|
|
@@ -106,6 +107,15 @@ module Jekyll
|
|
106
107
|
return docs
|
107
108
|
end
|
108
109
|
|
110
|
+
def missing_doc_filenames
|
111
|
+
missing_doc_fnames = []
|
112
|
+
@filenames.each do |f|
|
113
|
+
doc = @doc_mngr.get_doc_by_fname(f)
|
114
|
+
missing_doc_fnames << f if doc.nil?
|
115
|
+
end
|
116
|
+
return missing_doc_fnames
|
117
|
+
end
|
118
|
+
|
109
119
|
# descriptor methods
|
110
120
|
|
111
121
|
def has_filenames?
|
@@ -119,29 +129,37 @@ module Jekyll
|
|
119
129
|
# validation methods
|
120
130
|
|
121
131
|
def is_valid?
|
122
|
-
|
123
|
-
return false if !has_filenames?
|
124
|
-
@filenames.each do |f|
|
125
|
-
return false if !@doc_mngr.file_exists?(f)
|
126
|
-
end
|
132
|
+
all_filenames_missing = linked_docs.empty?
|
133
|
+
return false if !is_typed? || !has_filenames? || all_filenames_missing
|
127
134
|
return true
|
128
135
|
end
|
129
136
|
end
|
130
137
|
|
131
138
|
class WikiLinkInline
|
132
|
-
|
139
|
+
attr_reader :link_type, :filename, :header_txt, :block_id
|
133
140
|
|
141
|
+
FILE_PATH = "file_path"
|
134
142
|
FILENAME = "filename"
|
135
143
|
HEADER_TXT = "header_txt"
|
136
144
|
BLOCK_ID = "block_id"
|
137
145
|
|
138
146
|
# parameters ordered by appearance in regex
|
139
|
-
def initialize(doc_mngr, context_filename, embed, link_type,
|
147
|
+
def initialize(doc_mngr, context_filename, embed, link_type, file_string, header_txt, block_id, label_txt)
|
148
|
+
if file_string.include?('/') && file_string[0] == '/'
|
149
|
+
@path_type = "absolute"
|
150
|
+
@file_path ||= file_string[1...] # remove leading '/' to match `jekyll_collection_doc.relative_path`
|
151
|
+
@filename ||= file_string.split('/').last
|
152
|
+
elsif file_string.include?('/') && file_string[0] != '/'
|
153
|
+
Jekyll.logger.error("Jekyll-Wikilinks: Relative file paths are not yet supported, please use absolute file paths that start with '/' for #{file_string}")
|
154
|
+
# todo:
|
155
|
+
# @path_type = "relative"
|
156
|
+
else
|
157
|
+
@filename ||= file_string
|
158
|
+
end
|
140
159
|
@doc_mngr ||= doc_mngr
|
141
160
|
@context_filename ||= context_filename
|
142
161
|
@embed ||= embed
|
143
162
|
@link_type ||= link_type
|
144
|
-
@filename ||= filename
|
145
163
|
@header_txt ||= header_txt
|
146
164
|
@block_id ||= block_id
|
147
165
|
@label_txt ||= label_txt
|
@@ -157,35 +175,45 @@ module Jekyll
|
|
157
175
|
def md_regex
|
158
176
|
regex_embed = embedded? ? REGEX_LINK_EMBED : %r{}
|
159
177
|
regex_link_type = is_typed? ? %r{#{@link_type}#{REGEX_LINK_TYPE}} : %r{}
|
160
|
-
|
178
|
+
if !@file_path.nil?
|
179
|
+
file_string = described?(FILE_PATH) ? @file_path : ""
|
180
|
+
file_string = '/' + file_string if @path_type == "absolute"
|
181
|
+
else
|
182
|
+
file_string = described?(FILENAME) ? @filename : ""
|
183
|
+
end
|
161
184
|
if described?(HEADER_TXT)
|
162
185
|
header = %r{#{REGEX_LINK_HEADER}#{@header_txt}}
|
163
186
|
block = %r{}
|
164
187
|
elsif described?(BLOCK_ID)
|
165
188
|
header = %r{}
|
166
189
|
block = %r{#{REGEX_LINK_BLOCK}#{@block_id}}
|
167
|
-
elsif !described?(FILENAME)
|
190
|
+
elsif !described?(FILENAME) && !described?(FILE_PATH)
|
168
191
|
Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_regex error")
|
169
192
|
end
|
170
193
|
label_ = labelled? ? %r{#{REGEX_LINK_LABEL}#{label_txt}} : %r{}
|
171
|
-
return %r{#{regex_embed}#{regex_link_type}#{REGEX_LINK_LEFT}#{
|
194
|
+
return %r{#{regex_embed}#{regex_link_type}#{REGEX_LINK_LEFT}#{file_string}#{header}#{block}#{label_}#{REGEX_LINK_RIGHT}}
|
172
195
|
end
|
173
196
|
|
174
197
|
def md_str
|
175
198
|
embed = embedded? ? "!" : ""
|
176
199
|
link_type = is_typed? ? "#{@link_type}::" : ""
|
177
|
-
|
200
|
+
if !@file_path.nil?
|
201
|
+
file_string = described?(FILE_PATH) ? @file_path : ""
|
202
|
+
file_string = '/' + file_string if @path_type == "absolute"
|
203
|
+
else
|
204
|
+
file_string = described?(FILENAME) ? @filename : ""
|
205
|
+
end
|
178
206
|
if described?(HEADER_TXT)
|
179
207
|
header = "\##{@header_txt}"
|
180
208
|
block = ""
|
181
209
|
elsif described?(BLOCK_ID)
|
182
210
|
header = ""
|
183
211
|
block = "\#\^#{@block_id}"
|
184
|
-
elsif !described?(FILENAME)
|
212
|
+
elsif !described?(FILENAME) && !described?(FILE_PATH)
|
185
213
|
Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_str error")
|
186
214
|
end
|
187
215
|
label_ = labelled? ? "\|#{@label_txt}" : ""
|
188
|
-
return "#{embed}#{link_type}\[\[#{
|
216
|
+
return "#{embed}#{link_type}\[\[#{file_string}#{header}#{block}#{label_}\]\]"
|
189
217
|
end
|
190
218
|
|
191
219
|
# 'fm' -> frontmatter
|
@@ -209,7 +237,11 @@ module Jekyll
|
|
209
237
|
end
|
210
238
|
|
211
239
|
def linked_doc
|
212
|
-
|
240
|
+
# by file path
|
241
|
+
return @doc_mngr.get_doc_by_fpath(@file_path) if !@file_path.nil?
|
242
|
+
# by filename
|
243
|
+
return @doc_mngr.get_doc_by_fname(@filename) if @file_path.nil?
|
244
|
+
return nil
|
213
245
|
end
|
214
246
|
|
215
247
|
def linked_img
|
@@ -251,6 +283,7 @@ module Jekyll
|
|
251
283
|
|
252
284
|
# this method helps to make the 'WikiLinkInline.level' code read like a clean truth table.
|
253
285
|
def described?(chunk)
|
286
|
+
return (!@file_path.nil? && !@file_path.empty?) if chunk == FILE_PATH
|
254
287
|
return (!@filename.nil? && !@filename.empty?) if chunk == FILENAME
|
255
288
|
return (!@header_txt.nil? && !@header_txt.empty?) if chunk == HEADER_TXT
|
256
289
|
return (!@block_id.nil? && !@block_id.empty?) if chunk == BLOCK_ID
|
@@ -258,16 +291,17 @@ module Jekyll
|
|
258
291
|
end
|
259
292
|
|
260
293
|
def level
|
261
|
-
return "
|
262
|
-
return "
|
263
|
-
return "
|
294
|
+
return "file_path" if described?(FILE_PATH) && described?(FILENAME) && !described?(HEADER_TXT) && !described?(BLOCK_ID)
|
295
|
+
return "filename" if !described?(FILE_PATH) && described?(FILENAME) && !described?(HEADER_TXT) && !described?(BLOCK_ID)
|
296
|
+
return "header" if (described?(FILE_PATH) || described?(FILENAME)) && described?(HEADER_TXT) && !described?(BLOCK_ID)
|
297
|
+
return "block" if (described?(FILE_PATH) || described?(FILENAME)) && !described?(HEADER_TXT) && described?(BLOCK_ID)
|
264
298
|
return "invalid"
|
265
299
|
end
|
266
300
|
|
267
301
|
# validation methods
|
268
302
|
|
269
303
|
def is_valid?
|
270
|
-
return false if !@doc_mngr.file_exists?(@filename)
|
304
|
+
return false if !@doc_mngr.file_exists?(@filename, @file_path)
|
271
305
|
return false if (self.level == "header") && !@doc_mngr.doc_has_header?(self.linked_doc, @header_txt)
|
272
306
|
return false if (self.level == "block") && !@doc_mngr.doc_has_block_id?(self.linked_doc, @block_id)
|
273
307
|
return true
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-wikilinks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- manunamz
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: 1.13.3
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
40
|
+
version: 1.13.3
|
41
41
|
description:
|
42
42
|
email:
|
43
43
|
- manunamz@pm.me
|