jekyll-wikilinks 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,447 @@
1
+ require_relative "regex"
2
+
3
+ module Jekyll
4
+ module WikiLinks
5
+
6
+ # more of a "parser" than a parser
7
+ class Parser
8
+ attr_accessor :doc_manager, :markdown_converter, :wikilink_inlines, :wikilink_blocks
9
+
10
+ # Use Jekyll's native relative_url filter
11
+ include Jekyll::Filters::URLFilters
12
+
13
+ CONVERTER_CLASS = Jekyll::Converters::Markdown
14
+
15
+ def initialize(site)
16
+ @context ||= Jekyll::WikiLinks::Context.new(site)
17
+ @doc_manager ||= site.doc_mngr
18
+ @markdown_converter ||= site.find_converter_instance(CONVERTER_CLASS)
19
+ @wikilink_blocks, @wikilink_inlines = [], [], []
20
+ end
21
+
22
+ # parsing
23
+
24
+ def parse(doc_content)
25
+ @wikilink_blocks, @wikilink_inlines = [], [], []
26
+ if !$wiki_conf.disabled_attributes?
27
+ self.parse_block_singles(doc_content)
28
+ self.parse_block_lists_mkdn(doc_content)
29
+ self.parse_block_lists_comma(doc_content)
30
+ end
31
+ self.parse_inlines(doc_content)
32
+ end
33
+
34
+ def parse_block_singles(doc_content)
35
+ bullet_type = ""
36
+ typed_link_block_matches = doc_content.scan(REGEX_TYPED_LINK_BLOCK)
37
+ if !typed_link_block_matches.nil? && typed_link_block_matches.size != 0
38
+ typed_link_block_matches.each do |wl_match|
39
+ link_type = wl_match[0]
40
+ filename = wl_match[1]
41
+ typed_link_block_wikilink = WikiLinkBlock.new(
42
+ link_type,
43
+ bullet_type,
44
+ filename,
45
+ )
46
+ @wikilink_blocks << typed_link_block_wikilink
47
+ doc_content.gsub!(typed_link_block_wikilink.md_regex, "")
48
+ end
49
+ end
50
+ end
51
+
52
+ def parse_block_lists_comma(doc_content)
53
+ processing_link_type = nil
54
+ processing_wikilink_list = nil
55
+ bullet_type = ","
56
+ typed_link_block_list_item_matches = doc_content.scan(REGEX_TYPED_LINK_BLOCK_LIST_COMMA)
57
+ if !typed_link_block_list_item_matches.nil? && typed_link_block_list_item_matches.size != 0
58
+ # Match 1
59
+ # link-type-txt link-type
60
+ # filename link
61
+ # 3. alink
62
+ # Match 2
63
+ # link-type-txt
64
+ # filename
65
+ # 3. blink
66
+ # Match 3
67
+ # link-type-txt
68
+ # filename
69
+ # 3. clink
70
+ typed_link_block_list_item_matches.each do |wl_match|
71
+ link_type = wl_match[0]
72
+ link_filename_1 = wl_match[1]
73
+ link_filename_2 = wl_match[2]
74
+ if !link_type.nil?
75
+ # process previous wikilink_list
76
+ if !processing_wikilink_list.nil? && processing_wikilink_list.has_items?
77
+ @wikilink_blocks << processing_wikilink_list
78
+ doc_content.gsub!(processing_wikilink_list.md_regex, "")
79
+ end
80
+ processing_link_type = link_type
81
+ processing_wikilink_list = WikiLinkBlock.new(processing_link_type, bullet_type, link_filename_1)
82
+ processing_wikilink_list.add_item(bullet_type, link_filename_2) if !link_filename_2.nil?
83
+ else
84
+ Jekyll.logger.error("'processing_wikilink_list' was nil") if processing_wikilink_list.nil?
85
+ processing_wikilink_list.add_item(bullet_type, link_filename_2)
86
+ end
87
+ end
88
+ # process previous wikilink_list
89
+ if !processing_wikilink_list.nil? && processing_wikilink_list.has_items?
90
+ @wikilink_blocks << processing_wikilink_list
91
+ doc_content.gsub!(processing_wikilink_list.md_regex, "")
92
+ end
93
+ end
94
+ end
95
+
96
+ def parse_block_lists_mkdn(doc_content)
97
+ processing_link_type = nil
98
+ processing_wikilink_list = nil
99
+ bullet_type = nil
100
+ typed_link_block_list_item_matches = doc_content.scan(REGEX_TYPED_LINK_BLOCK_LIST_MKDN)
101
+ if !typed_link_block_list_item_matches.nil? && typed_link_block_list_item_matches.size != 0
102
+ # Match 1
103
+ # link-type-txt more-types
104
+ # bullet
105
+ # filename
106
+ # Match 2
107
+ # link-type-txt
108
+ # bullet *
109
+ # filename alink
110
+ # Match 3
111
+ # link-type-txt
112
+ # bullet *
113
+ # filename blink
114
+ # Match 4
115
+ # link-type-txt more-types
116
+ # bullet
117
+ # filename
118
+ # Match 5
119
+ # link-type-txt
120
+ # bullet +
121
+ # filename alink
122
+ # Match 6
123
+ # link-type-txt
124
+ # bullet +
125
+ # filename blink
126
+ typed_link_block_list_item_matches.each do |wl_match|
127
+ link_type = wl_match[0]
128
+ bullet_type = wl_match[1]
129
+ link_filename = wl_match[2]
130
+ if !link_type.nil?
131
+ # process previous wikilink_list
132
+ if !processing_wikilink_list.nil? && processing_wikilink_list.has_items?
133
+ @wikilink_blocks << processing_wikilink_list
134
+ doc_content.gsub!(processing_wikilink_list.md_regex, "")
135
+ end
136
+ processing_link_type = link_type
137
+ processing_wikilink_list = WikiLinkBlock.new(processing_link_type)
138
+ else
139
+ Jekyll.logger.error("'processing_wikilink_list' was nil") if processing_wikilink_list.nil?
140
+ processing_wikilink_list.add_item(bullet_type, link_filename)
141
+ end
142
+ end
143
+ # process previous wikilink_list
144
+ if !processing_wikilink_list.nil? && processing_wikilink_list.has_items?
145
+ @wikilink_blocks << processing_wikilink_list
146
+ doc_content.gsub!(processing_wikilink_list.md_regex, "")
147
+ end
148
+ end
149
+ end
150
+
151
+ def parse_inlines(doc_content)
152
+ wikilink_matches = doc_content.scan(REGEX_WIKI_LINKS)
153
+ if !wikilink_matches.nil? && wikilink_matches.size != 0
154
+ wikilink_matches.each do |wl_match|
155
+ @wikilink_inlines << WikiLinkInline.new(
156
+ wl_match[0],
157
+ wl_match[1],
158
+ wl_match[2],
159
+ wl_match[3],
160
+ wl_match[4],
161
+ wl_match[5],
162
+ )
163
+ end
164
+ end
165
+ # replace text
166
+ return if @wikilink_inlines.nil?
167
+ @wikilink_inlines.each do |wikilink|
168
+ doc_content.gsub!(
169
+ wikilink.md_link_regex,
170
+ self.build_html(wikilink)
171
+ )
172
+ end
173
+ end
174
+
175
+ # building/converting
176
+
177
+ def build_html_embed(title, content, url)
178
+ # multi-line for readability
179
+ return [
180
+ "<div class=\"#{$wiki_conf.css_name("embed_wrapper")}\">",
181
+ "<div class=\"#{$wiki_conf.css_name("embed_title")}\">",
182
+ "#{title}",
183
+ "</div>",
184
+ "<div class=\"#{$wiki_conf.css_name("embed_content")}\">",
185
+ "#{@markdown_converter.convert(content)}",
186
+ "</div>",
187
+ "<a class=\"#{$wiki_conf.css_name("embed_wiki_link")}\" href=\"#{url}\"></a>",
188
+ "</div>",
189
+ ].join("\n").gsub!("\n", "")
190
+ end
191
+
192
+ def build_html_img_embed(static_doc, is_svg=false)
193
+ svg_content = ""
194
+ if is_svg
195
+ File.open(static_doc.path, "r") do |svg_img|
196
+ svg_content = svg_img.read
197
+ end
198
+ return "<p><span class=\"#{$wiki_conf.css_name("embed_image_wrapper")}\">#{svg_content}</span></p>"
199
+ else
200
+ return "<p><span class=\"#{$wiki_conf.css_name("embed_image_wrapper")}\"><img class=\"#{$wiki_conf.css_name("embed_image")}\" src=\"#{relative_url(static_doc.relative_path)}\"/></span></p>"
201
+ end
202
+ end
203
+
204
+ def build_html(wikilink)
205
+ if wikilink.is_img?
206
+ linked_static_doc = @doc_manager.get_image_by_fname(wikilink.filename)
207
+ if wikilink.embedded? && wikilink.is_img?
208
+ return build_html_img_embed(linked_static_doc, is_svg=wikilink.is_img_svg?)
209
+ end
210
+ end
211
+ linked_doc = @doc_manager.get_doc_by_fname(wikilink.filename)
212
+ if !linked_doc.nil?
213
+ link_type = wikilink.typed? ? " typed #{wikilink.link_type}" : ""
214
+
215
+ # label
216
+ wikilink_inner_txt = wikilink.clean_label_txt if wikilink.labelled?
217
+
218
+ lnk_doc_rel_url = relative_url(linked_doc.url)
219
+ # TODO not sure about downcase
220
+ fname_inner_txt = linked_doc['title'].downcase if wikilink_inner_txt.nil?
221
+
222
+ link_lvl = wikilink.describe['level']
223
+ if (link_lvl == "file")
224
+ wikilink_inner_txt = "#{fname_inner_txt}" if wikilink_inner_txt.nil?
225
+ return build_html_embed(
226
+ linked_doc['title'],
227
+ @doc_manager.get_doc_content(wikilink.filename),
228
+ lnk_doc_rel_url
229
+ ) if wikilink.embedded?
230
+ elsif (link_lvl == "header" && DocManager.doc_has_header?(linked_doc, wikilink.header_txt))
231
+ # from: https://github.com/jekyll/jekyll/blob/6855200ebda6c0e33f487da69e4e02ec3d8286b7/Rakefile#L74
232
+ lnk_doc_rel_url += "\#" + Jekyll::Utils.slugify(wikilink.header_txt)
233
+ wikilink_inner_txt = "#{fname_inner_txt} > #{wikilink.header_txt}" if wikilink_inner_txt.nil?
234
+ elsif (link_lvl == "block" && DocManager.doc_has_block_id?(linked_doc, wikilink.block_id))
235
+ lnk_doc_rel_url += "\#" + wikilink.block_id.downcase
236
+ wikilink_inner_txt = "#{fname_inner_txt} > ^#{wikilink.block_id}" if wikilink_inner_txt.nil?
237
+ else
238
+ return '<span class="' + $wiki_conf.css_name("invalid_wiki") + '">' + wikilink.md_link_str + '</span>'
239
+ end
240
+ return '<a class="' + $wiki_conf.css_name("wiki") + link_type + '" href="' + lnk_doc_rel_url + '">' + wikilink_inner_txt + '</a>'
241
+ else
242
+ return '<span class="' + $wiki_conf.css_name("invalid_wiki") + '">' + wikilink.md_link_str + '</span>'
243
+ end
244
+ end
245
+ end
246
+
247
+ # validation
248
+
249
+ def has_target_attr?(attribute)
250
+ attribute.list_item.each do |li|
251
+ return false if @doc_manager.get_doc_by_fname(li[1]).nil?
252
+ end
253
+ return true
254
+ end
255
+
256
+ def has_target_wl?(wikilink)
257
+ level = wikilink.describe['level']
258
+ linked_doc = @doc_manager.get_doc_by_fname(wikilink.filename)
259
+ return false if linked_doc.nil?
260
+ return false if level == "header" && !DocManager.doc_has_header?(linked_doc, wikilink.header_txt)
261
+ return false if level == "block" && !DocManager.doc_has_block_id?(linked_doc, wikilink.block_id)
262
+ return true
263
+ end
264
+
265
+ # wikilinks
266
+
267
+ class WikiLinkBlock
268
+ attr_accessor :link_type, :list_items
269
+
270
+ # parameters ordered by appearance in regex
271
+ def initialize(link_type, bullet_type=nil, filename=nil)
272
+ @link_type ||= link_type
273
+ @list_items = [] # li[0] = bullet_type; li[1] = filename
274
+ @list_items << [ bullet_type, filename ] if !bullet_type.nil? && !filename.nil?
275
+ end
276
+
277
+ def add_item(bullet_type, filename)
278
+ return if bullet_type.nil? || bullet_type.empty? || filename.nil? || filename.empty?
279
+ @list_items << [ bullet_type, filename ]
280
+ end
281
+
282
+ def md_regex
283
+ if typed? && has_items?
284
+ # single
285
+ if bullet_type?.empty?
286
+ link_type = %r{#{@link_type}#{REGEX_LINK_TYPE}}
287
+ list_item_strs = @list_items.map { |li| /#{REGEX_LINK_LEFT}#{li[1]}#{REGEX_LINK_RIGHT}\n/i }
288
+ md_link_regex = /#{link_type}#{list_item_strs.join("")}/i
289
+ # list (comma)
290
+ elsif bullet_type? == ","
291
+ tmp_list_items = @list_items.dup
292
+ first_item = tmp_list_items.shift()
293
+ link_type = /#{@link_type}#{REGEX_LINK_TYPE}#{REGEX_LINK_LEFT}#{first_item[1]}#{REGEX_LINK_RIGHT}\s*/i
294
+ list_item_strs = tmp_list_items.map { |li| /#{li[0]}\s*#{REGEX_LINK_LEFT}#{li[1]}#{REGEX_LINK_RIGHT}\s*/i }
295
+ md_link_regex = /#{link_type}#{list_item_strs.join('')}/i
296
+ # list (md)
297
+ elsif !bullet_type?.match(REGEX_BULLET).nil?
298
+ link_type = %r{#{@link_type}#{REGEX_LINK_TYPE}\n}
299
+ list_item_strs = @list_items.map { |li| /#{Regexp.escape(li[0])}\s#{REGEX_LINK_LEFT}#{li[1]}#{REGEX_LINK_RIGHT}\n/i }
300
+ md_link_regex = /#{link_type}#{list_item_strs.join("")}/i
301
+ else
302
+ Jekyll.logger.error("bullet_types not uniform or invalid: #{bullet_type?}")
303
+ end
304
+ return md_link_regex
305
+ else
306
+ Jekyll.logger.error("WikiLinkBlockList.md_regex error")
307
+ end
308
+ end
309
+
310
+ def md_str
311
+ if typed? && has_items?
312
+ if bullet_type? == ","
313
+ link_type = "#{@link_type}::"
314
+ list_item_strs = @list_items.map { |li| "\[\[#{li[1]}\]\]#{li[0]}" }
315
+ md_link_str = (link_type + list_item_strs.join('')).delete_suffix(",")
316
+ elsif "+*-".include?(bullet_type?)
317
+ link_type = "#{@link_type}::\n"
318
+ list_item_strs = @list_items.map { |li| li[0] + " \[\[#{li[1]}\]\]\n" }
319
+ md_link_str = link_type + list_item_strs.join('')
320
+ else
321
+ Jekyll.logger.error("Not a valid bullet_type: #{bullet_type?}")
322
+ end
323
+ return md_link_str
324
+ else
325
+ Jekyll.logger.error("WikiLinkBlockList.md_str error")
326
+ end
327
+ end
328
+
329
+ def bullet_type?
330
+ bullets = @list_items.map { |li| li[0] }
331
+ return bullets.uniq.first if bullets.uniq.size == 1
332
+ end
333
+
334
+ def has_items?
335
+ return !@list_items.nil? && !@list_items.empty?
336
+ end
337
+
338
+ def typed?
339
+ return !@link_type.nil? && !@link_type.empty?
340
+ end
341
+ end
342
+
343
+ # the wikilink class knows everything about the original markdown syntax and its semantic meaning
344
+ class WikiLinkInline
345
+ attr_accessor :embed, :link_type, :filename, :header_txt, :block_id, :label_txt
346
+
347
+ FILENAME = "filename"
348
+ HEADER_TXT = "header_txt"
349
+ BLOCK_ID = "block_id"
350
+
351
+ # parameters ordered by appearance in regex
352
+ def initialize(embed, link_type, filename, header_txt, block_id, label_txt)
353
+ @embed ||= embed
354
+ @link_type ||= link_type
355
+ @filename ||= filename
356
+ @header_txt ||= header_txt
357
+ @block_id ||= block_id
358
+ @label_txt ||= label_txt
359
+ end
360
+
361
+ # labels are really flexible, so we need to handle them with a bit more care
362
+ def clean_label_txt
363
+ return @label_txt.sub("[", "\\[").sub("]", "\\]")
364
+ end
365
+
366
+ # TODO: remove this once parsing is migrated to nokogiri...?
367
+ def md_link_str
368
+ embed = embedded? ? "!" : ""
369
+ link_type = typed? ? "#{@link_type}::" : ""
370
+ filename = described?(FILENAME) ? @filename : ""
371
+ if described?(HEADER_TXT)
372
+ header = "\##{@header_txt}"
373
+ block = ""
374
+ elsif described?(BLOCK_ID)
375
+ header = ""
376
+ block = "\#\^#{@block_id}"
377
+ elsif !described?(FILENAME)
378
+ Jekyll.logger.error "Invalid link level in 'md_link_str'. See WikiLink's 'md_link_str' for details"
379
+ end
380
+ label_ = labelled? ? "\|#{@label_txt}" : ""
381
+ return "#{embed}#{link_type}\[\[#{filename}#{header}#{block}#{label_}\]\]"
382
+ end
383
+
384
+ def md_link_regex
385
+ regex_embed = embedded? ? REGEX_LINK_EMBED : %r{}
386
+ regex_link_type = typed? ? %r{#{@link_type}#{REGEX_LINK_TYPE}} : %r{}
387
+ filename = described?(FILENAME) ? @filename : ""
388
+ if described?(HEADER_TXT)
389
+ header = %r{#{REGEX_LINK_HEADER}#{@header_txt}}
390
+ block = %r{}
391
+ elsif described?(BLOCK_ID)
392
+ header = %r{}
393
+ block = %r{#{REGEX_LINK_BLOCK}#{@block_id}}
394
+ elsif !described?(FILENAME)
395
+ Jekyll.logger.error "Invalid link level in regex. See WikiLink's 'md_link_regex' for details"
396
+ end
397
+ label_ = labelled? ? %r{#{REGEX_LINK_LABEL}#{clean_label_txt}} : %r{}
398
+ return %r{#{regex_embed}#{regex_link_type}#{REGEX_LINK_LEFT}#{filename}#{header}#{block}#{label_}#{REGEX_LINK_RIGHT}}
399
+ end
400
+
401
+ def describe
402
+ return {
403
+ 'level' => level,
404
+ 'labelled' => labelled?,
405
+ 'embedded' => embedded?,
406
+ 'typed_link' => typed?,
407
+ }
408
+ end
409
+
410
+ def labelled?
411
+ return !@label_txt.nil? && !@label_txt.empty?
412
+ end
413
+
414
+ def typed?
415
+ return !@link_type.nil? && !@link_type.empty?
416
+ end
417
+
418
+ def embedded?
419
+ return !@embed.nil? && @embed == "!"
420
+ end
421
+
422
+ def is_img?
423
+ # github supported image formats: https://docs.github.com/en/github/managing-files-in-a-repository/working-with-non-code-files/rendering-and-diffing-images
424
+ return SUPPORTED_IMG_FORMATS.any?{ |ext| ext == File.extname(@filename).downcase }
425
+ end
426
+
427
+ def is_img_svg?
428
+ return File.extname(@filename).downcase == ".svg"
429
+ end
430
+
431
+ def described?(chunk)
432
+ return (!@filename.nil? && !@filename.empty?) if chunk == FILENAME
433
+ return (!@header_txt.nil? && !@header_txt.empty?) if chunk == HEADER_TXT
434
+ return (!@block_id.nil? && !@block_id.empty?) if chunk == BLOCK_ID
435
+ Jekyll.logger.error "There is no link level '#{chunk}' in WikiLink Struct"
436
+ end
437
+
438
+ def level
439
+ return "file" if described?(FILENAME) && !described?(HEADER_TXT) && !described?(BLOCK_ID)
440
+ return "header" if described?(FILENAME) && described?(HEADER_TXT) && !described?(BLOCK_ID)
441
+ return "block" if described?(FILENAME) && !described?(HEADER_TXT) && described?(BLOCK_ID)
442
+ return "invalid"
443
+ end
444
+ end
445
+
446
+ end
447
+ end
@@ -0,0 +1,66 @@
1
+ # regex.rb
2
+ # regex constants defining supported file types and valid names for files, variables, or text
3
+ #
4
+
5
+ module Jekyll
6
+ module WikiLinks
7
+ # <regex_variables> only work with 'match' function, not with 'scan' function. :/
8
+ # oh well...they are there for easier debugging...
9
+
10
+ # supported image formats
11
+ # from: https://docs.github.com/en/github/managing-files-in-a-repository/working-with-non-code-files/rendering-and-diffing-images
12
+ SUPPORTED_IMG_FORMATS = Set.new(['.png', '.jpg', '.gif', '.psd', '.svg'])
13
+
14
+ # wikilink constants
15
+ REGEX_LINK_LEFT = /\[\[/
16
+ REGEX_LINK_RIGHT = /\]\]/
17
+ REGEX_LINK_EMBED = /(?<embed>(\!))/
18
+ REGEX_LINK_TYPE = /\s*::\s*/
19
+ REGEX_LINK_HEADER = /\#/
20
+ REGEX_LINK_BLOCK = /\#\^/
21
+ REGEX_LINK_LABEL = /\|/
22
+
23
+ # wikilink usable char requirements
24
+ REGEX_LINK_TYPE_TXT = /(?<link-type-txt>([^\n\s\!\#\^\|\]]+))/i
25
+ REGEX_FILENAME = /(?<filename>([^\\\/:\#\^\|\[\]]+))/i
26
+ REGEX_HEADER_TXT = /(?<header-txt>([^\!\#\^\|\[\]]+))/i
27
+ REGEX_BLOCK_ID_TXT = /(?<block-id>([^\\\/:\!\#\^\|\[\]^\n]+))/i
28
+ REGEX_LABEL_TXT = /(?<label-txt>((.+?)(?=\]\])))/i
29
+
30
+ # target markdown text (headers, lists, and blocks)
31
+ ## kramdown regexes
32
+ ### atx header: https://github.com/gettalong/kramdown/blob/master/lib/kramdown/parser/kramdown/header.rb#L29
33
+ REGEX_ATX_HEADER = /^\#{1,6}[\t ]*([^ \t].*)\n/i
34
+ ### setext header: https://github.com/gettalong/kramdown/blob/master/lib/kramdown/parser/kramdown/header.rb#L17
35
+ REGEX_SETEXT_HEADER = /^ {0,3}([^ \t].*)\n[-=][-=]*[ \t\r\f\v]*\n/i
36
+ ## list item: https://github.com/gettalong/kramdown/blob/master/lib/kramdown/parser/kramdown/list.rb#L49
37
+ REGEX_BULLET = /(?<bullet>[+*-])/i
38
+ # REGEX_LIST_ITEM = /(^ {0,3}[+*-])([\t| ].*?\n)/i
39
+ REGEX_LIST_ITEM = /(^ {0,3}#{REGEX_BULLET})(\s(?:#{REGEX_LINK_LEFT}#{REGEX_FILENAME}#{REGEX_LINK_RIGHT}))/i
40
+ ## new-markdown-style
41
+ REGEX_BLOCK = /.*\s\^#{REGEX_BLOCK_ID_TXT}/i
42
+
43
+ # wikilinks
44
+ ## inline
45
+ REGEX_WIKI_LINKS = %r{ # capture indeces
46
+ (#{REGEX_LINK_EMBED})? # 0
47
+ (#{REGEX_LINK_TYPE_TXT}#{REGEX_LINK_TYPE})? # 1
48
+ #{REGEX_LINK_LEFT}
49
+ #{REGEX_FILENAME} # 2
50
+ (#{REGEX_LINK_HEADER}#{REGEX_HEADER_TXT})? # 3
51
+ (#{REGEX_LINK_BLOCK}#{REGEX_BLOCK_ID_TXT})? # 4
52
+ (#{REGEX_LINK_LABEL}#{REGEX_LABEL_TXT})? # 5
53
+ #{REGEX_LINK_RIGHT}
54
+ }x
55
+ ## block
56
+ REGEX_TYPED_LINK_BLOCK = /#{REGEX_LINK_TYPE_TXT}#{REGEX_LINK_TYPE}#{REGEX_LINK_LEFT}#{REGEX_FILENAME}#{REGEX_LINK_RIGHT}\n/i
57
+ # TODO: keep an eye on this -- using REGEX_FILENAME in two places
58
+ REGEX_TYPED_LINK_BLOCK_LIST_COMMA = /(?:#{REGEX_LINK_TYPE_TXT}#{REGEX_LINK_TYPE}\s*(?:#{REGEX_LINK_LEFT}#{REGEX_FILENAME}#{REGEX_LINK_RIGHT})\s*|\G)\s*(?:,\s*#{REGEX_LINK_LEFT}#{REGEX_FILENAME}#{REGEX_LINK_RIGHT})\s*/i
59
+ REGEX_TYPED_LINK_BLOCK_LIST_MKDN = /#{REGEX_LINK_TYPE_TXT}#{REGEX_LINK_TYPE}\n|\G(?:#{REGEX_LIST_ITEM}\n)/i
60
+
61
+ # parsing for wikilinks in html
62
+ # identify missing links in doc via .invalid-wiki-link class and nested doc-text.
63
+ REGEX_INVALID_WIKI_LINK = /invalid-wiki-link(?:[^\]]+)\[\[(?<wiki-text>([^\]]+))\]\]/i
64
+
65
+ end
66
+ end
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module JekyllWikiLinks
4
- VERSION = "0.0.5"
3
+ module Jekyll
4
+ module WikiLinks
5
+
6
+ VERSION = "0.0.6"
7
+
8
+ end
5
9
  end