jekyll-wikilinks 0.0.7 → 0.0.11

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.
@@ -0,0 +1,312 @@
1
+ # wiki data structures
2
+ require_relative "regex"
3
+
4
+ module Jekyll
5
+ module WikiLinks
6
+
7
+ # wikilink classes know everything about the original markdown syntax and its semantic meaning
8
+
9
+ class WikiLinkBlock
10
+ attr_accessor :link_type, :filenames
11
+
12
+ # parameters ordered by appearance in regex
13
+ def initialize(doc_mngr, context_filename, link_type, bullet_type=nil)
14
+ @doc_mngr ||= doc_mngr
15
+ @context_filename ||= context_filename
16
+ @link_type ||= link_type
17
+ @bullet_type ||= bullet_type
18
+ @filenames = []
19
+ end
20
+
21
+ def add_item(filename)
22
+ Jekyll.logger.error("Jekyll-Wikilinks: 'filename' required") if filename.nil? || filename.empty?
23
+ @filenames << filename
24
+ end
25
+
26
+ # data
27
+
28
+ def md_regex
29
+ if !is_typed? || !has_filenames?
30
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkBlock.md_regex error -- type: #{@link_type}, fnames: #{@filenames.inspect}, for: #{@context_filename}")
31
+ end
32
+ # comma (including singles)
33
+ if @bullet_type.nil?
34
+ link_type = /#{@link_type}#{REGEX_LINK_TYPE}/i
35
+ tmp_filenames = @filenames.dup
36
+ first_filename = /\s*#{REGEX_LINK_LEFT}#{tmp_filenames.shift()}#{REGEX_LINK_RIGHT}\s*/i
37
+ filename_strs = tmp_filenames.map { |f| /,\s*#{REGEX_LINK_LEFT}#{f}#{REGEX_LINK_RIGHT}\s*/i }
38
+ md_regex = /#{link_type}#{first_filename}#{filename_strs.join('')}\n/i
39
+ # mkdn
40
+ elsif !@bullet_type.match(REGEX_BULLET).nil?
41
+ link_type = /#{@link_type}#{REGEX_LINK_TYPE}\n/i
42
+ filename_strs = @filenames.map { |f| /\s{0,3}#{Regexp.escape(@bullet_type)}\s#{REGEX_LINK_LEFT}#{f}#{REGEX_LINK_RIGHT}\n/i }
43
+ md_regex = /#{link_type}#{filename_strs.join("")}/i
44
+ else
45
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkBlock.bullet_type error: #{@bullet_type}")
46
+ end
47
+ return md_regex
48
+ end
49
+
50
+ def md_str
51
+ if !is_typed? || !has_filenames?
52
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkBlockList.md_str error -- type: #{@link_type}, fnames: #{@filenames.inspect}, for: #{@context_filename}")
53
+ end
54
+ # comma (including singles)
55
+ if @bullet_type.nil?
56
+ link_type = "#{@link_type}::"
57
+ filename_strs = @filenames.map { |f| "\[\[#{f}\]\]," }
58
+ md_str = (link_type + filename_strs.join('')).delete_suffix(",")
59
+ # mkdn
60
+ elsif !@bullet_type.match(REGEX_BULLET).nil?
61
+ link_type = "#{@link_type}::\n"
62
+ filename_strs = @filenames.map { |f| li[0] + " \[\[#{li[1]}\]\]\n" }
63
+ md_str = link_type + filename_strs.join('')
64
+ else
65
+ Jekyll.logger.error("Jekyll-Wikilinks: 'bullet_type' invalid: #{@bullet_type}")
66
+ end
67
+ return md_str
68
+ end
69
+
70
+ def urls
71
+ # return @filenames.map { |f| @doc_mngr.get_doc_by_fname(f).url }.compact()
72
+ urls = []
73
+ @filenames.each do |f|
74
+ doc = @doc_mngr.get_doc_by_fname(f)
75
+ urls << doc.url if !doc.nil?
76
+ end
77
+ return urls
78
+ end
79
+
80
+ # 'fm' -> frontmatter
81
+
82
+ def context_fm_data
83
+ return {
84
+ 'type' => @link_type,
85
+ 'urls' => [self.context_doc.url],
86
+ }
87
+ end
88
+
89
+ def linked_fm_data
90
+ valid_urls = self.urls.select{ |url| @doc_mngr.get_doc_by_url(url) }
91
+ return {
92
+ 'type' => @link_type,
93
+ 'urls' => valid_urls,
94
+ }
95
+ end
96
+
97
+ def context_doc
98
+ return @doc_mngr.get_doc_by_fname(@context_filename)
99
+ end
100
+
101
+ def linked_docs
102
+ docs = []
103
+ @filenames.each do |f|
104
+ doc = @doc_mngr.get_doc_by_fname(f)
105
+ docs << doc if !doc.nil?
106
+ end
107
+ return docs
108
+ end
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
+
119
+ # descriptor methods
120
+
121
+ def has_filenames?
122
+ return !@filenames.nil? && !@filenames.empty?
123
+ end
124
+
125
+ def is_typed?
126
+ return !@link_type.nil? && !@link_type.empty?
127
+ end
128
+
129
+ # validation methods
130
+
131
+ def is_valid?
132
+ all_filenames_missing = linked_docs.empty?
133
+ return false if !is_typed? || !has_filenames? || all_filenames_missing
134
+ return true
135
+ end
136
+ end
137
+
138
+ class WikiLinkInline
139
+ attr_accessor :context_filename, :embed, :link_type, :file_path, :path_type, :filename, :header_txt, :block_id, :label_txt
140
+
141
+ FILE_PATH = "file_path"
142
+ FILENAME = "filename"
143
+ HEADER_TXT = "header_txt"
144
+ BLOCK_ID = "block_id"
145
+
146
+ # parameters ordered by appearance in regex
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
159
+ @doc_mngr ||= doc_mngr
160
+ @context_filename ||= context_filename
161
+ @embed ||= embed
162
+ @link_type ||= link_type
163
+ @header_txt ||= header_txt
164
+ @block_id ||= block_id
165
+ @label_txt ||= label_txt
166
+ end
167
+
168
+ # escape square brackets if they appear in label text
169
+ def label_txt
170
+ return @label_txt.sub("[", "\\[").sub("]", "\\]")
171
+ end
172
+
173
+ # data
174
+
175
+ def md_regex
176
+ regex_embed = embedded? ? REGEX_LINK_EMBED : %r{}
177
+ regex_link_type = is_typed? ? %r{#{@link_type}#{REGEX_LINK_TYPE}} : %r{}
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
184
+ if described?(HEADER_TXT)
185
+ header = %r{#{REGEX_LINK_HEADER}#{@header_txt}}
186
+ block = %r{}
187
+ elsif described?(BLOCK_ID)
188
+ header = %r{}
189
+ block = %r{#{REGEX_LINK_BLOCK}#{@block_id}}
190
+ elsif !described?(FILENAME) && !described?(FILE_PATH)
191
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_regex error")
192
+ end
193
+ label_ = labelled? ? %r{#{REGEX_LINK_LABEL}#{label_txt}} : %r{}
194
+ return %r{#{regex_embed}#{regex_link_type}#{REGEX_LINK_LEFT}#{file_string}#{header}#{block}#{label_}#{REGEX_LINK_RIGHT}}
195
+ end
196
+
197
+ def md_str
198
+ embed = embedded? ? "!" : ""
199
+ link_type = is_typed? ? "#{@link_type}::" : ""
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
206
+ if described?(HEADER_TXT)
207
+ header = "\##{@header_txt}"
208
+ block = ""
209
+ elsif described?(BLOCK_ID)
210
+ header = ""
211
+ block = "\#\^#{@block_id}"
212
+ elsif !described?(FILENAME) && !described?(FILE_PATH)
213
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_str error")
214
+ end
215
+ label_ = labelled? ? "\|#{@label_txt}" : ""
216
+ return "#{embed}#{link_type}\[\[#{file_string}#{header}#{block}#{label_}\]\]"
217
+ end
218
+
219
+ # 'fm' -> frontmatter
220
+
221
+ def context_fm_data
222
+ return {
223
+ 'type' => @link_type,
224
+ 'url' => self.context_doc.url,
225
+ }
226
+ end
227
+
228
+ def linked_fm_data
229
+ return {
230
+ 'type' => @link_type,
231
+ 'url' => self.linked_doc.url,
232
+ }
233
+ end
234
+
235
+ def context_doc
236
+ return @doc_mngr.get_doc_by_fname(@context_filename)
237
+ end
238
+
239
+ def linked_doc
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
245
+ end
246
+
247
+ def linked_img
248
+ return @doc_mngr.get_image_by_fname(@filename) if self.is_img?
249
+ return nil
250
+ end
251
+
252
+ # descriptor methods
253
+
254
+ # def describe
255
+ # return {
256
+ # 'level' => level,
257
+ # 'labelled' => labelled?,
258
+ # 'embedded' => embedded?,
259
+ # 'typed_link' => is_typed?,
260
+ # }
261
+ # end
262
+
263
+ def labelled?
264
+ return !@label_txt.nil? && !@label_txt.empty?
265
+ end
266
+
267
+ def is_typed?
268
+ return !@link_type.nil? && !@link_type.empty?
269
+ end
270
+
271
+ def embedded?
272
+ return !@embed.nil? && @embed == "!"
273
+ end
274
+
275
+ def is_img?
276
+ # github supported image formats: https://docs.github.com/en/github/managing-files-in-a-repository/working-with-non-code-files/rendering-and-diffing-images
277
+ return SUPPORTED_IMG_FORMATS.any?{ |ext| ext == File.extname(@filename).downcase }
278
+ end
279
+
280
+ def is_img_svg?
281
+ return File.extname(@filename).downcase == ".svg"
282
+ end
283
+
284
+ # this method helps to make the 'WikiLinkInline.level' code read like a clean truth table.
285
+ def described?(chunk)
286
+ return (!@file_path.nil? && !@file_path.empty?) if chunk == FILE_PATH
287
+ return (!@filename.nil? && !@filename.empty?) if chunk == FILENAME
288
+ return (!@header_txt.nil? && !@header_txt.empty?) if chunk == HEADER_TXT
289
+ return (!@block_id.nil? && !@block_id.empty?) if chunk == BLOCK_ID
290
+ Jekyll.logger.error("Jekyll-Wikilinks: There is no link level '#{chunk}' in the WikiLink Class")
291
+ end
292
+
293
+ def level
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)
298
+ return "invalid"
299
+ end
300
+
301
+ # validation methods
302
+
303
+ def is_valid?
304
+ return false if !@doc_mngr.file_exists?(@filename, @file_path)
305
+ return false if (self.level == "header") && !@doc_mngr.doc_has_header?(self.linked_doc, @header_txt)
306
+ return false if (self.level == "block") && !@doc_mngr.doc_has_block_id?(self.linked_doc, @block_id)
307
+ return true
308
+ end
309
+ end
310
+
311
+ end
312
+ end
@@ -3,7 +3,7 @@
3
3
  module Jekyll
4
4
  module WikiLinks
5
5
 
6
- VERSION = "0.0.7"
6
+ VERSION = "0.0.11"
7
7
 
8
8
  end
9
9
  end
@@ -3,8 +3,6 @@ require "jekyll"
3
3
 
4
4
  require_relative "jekyll-wikilinks/version"
5
5
 
6
- # in order of expected execution
7
-
8
6
  # setup config
9
7
  require_relative "jekyll-wikilinks/config"
10
8
  Jekyll::Hooks.register :site, :after_init do |site|
@@ -22,28 +20,11 @@ Jekyll::Hooks.register :site, :post_read do |site|
22
20
  end
23
21
  end
24
22
 
25
- # convert
26
- require_relative "jekyll-wikilinks/plugins/converter"
27
-
28
- # generate
23
+ # parse wikilinks / generate metadata
29
24
  require_relative "jekyll-wikilinks/plugins/generator"
30
25
 
31
- # convert fores
32
- # Jekyll::Hooks.register :documents, :pre_convert do |doc|
33
- # Jekyll:WikiLinks::Parser.parse_blocks(doc)
34
- # @site.link_index.populate_fores(doc, typed_link_blocks, md_docs)
35
- # end
36
-
37
- # convert backs
38
- # Jekyll::Hooks.register :documents, :pre_convert do |doc|
39
- # Jekyll:WikiLinks::Parser.parse_inlines(doc)
40
- # @site.link_index.populate_backs(doc, typed_link_blocks, md_docs)
41
- # end
42
-
43
- # generate metadata
44
- # Jekyll::Hooks.register :documents, :post_convert do |doc|
45
- # Jekyll:WikiLinks::Generator.generate(doc)
46
- # end
26
+ # convert weblinks
27
+ require_relative "jekyll-wikilinks/plugins/converter"
47
28
 
48
29
  # hook up liquid filters
49
30
  require_relative "jekyll-wikilinks/plugins/filter"
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.7
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - manunamz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-01 00:00:00.000000000 Z
11
+ date: 2022-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -56,6 +56,7 @@ files:
56
56
  - lib/jekyll-wikilinks/util/link_index.rb
57
57
  - lib/jekyll-wikilinks/util/parser.rb
58
58
  - lib/jekyll-wikilinks/util/regex.rb
59
+ - lib/jekyll-wikilinks/util/wikilink.rb
59
60
  - lib/jekyll-wikilinks/version.rb
60
61
  homepage: https://github.com/manunamz/jekyll-wikilinks
61
62
  licenses: