jekyll-wikilinks 0.0.7 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: