jekyll-wikilinks 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,278 @@
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) }
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
+ return {
91
+ 'type' => @link_type,
92
+ 'urls' => self.urls,
93
+ }
94
+ end
95
+
96
+ def context_doc
97
+ return @doc_mngr.get_doc_by_fname(@context_filename)
98
+ end
99
+
100
+ def linked_docs
101
+ docs = []
102
+ @filenames.each do |f|
103
+ doc = @doc_mngr.get_doc_by_fname(f)
104
+ docs << doc if !doc.nil?
105
+ end
106
+ return docs
107
+ end
108
+
109
+ # descriptor methods
110
+
111
+ def has_filenames?
112
+ return !@filenames.nil? && !@filenames.empty?
113
+ end
114
+
115
+ def is_typed?
116
+ return !@link_type.nil? && !@link_type.empty?
117
+ end
118
+
119
+ # validation methods
120
+
121
+ def is_valid?
122
+ return false if !is_typed?
123
+ return false if !has_filenames?
124
+ @filenames.each do |f|
125
+ return false if !@doc_mngr.file_exists?(f)
126
+ end
127
+ return true
128
+ end
129
+ end
130
+
131
+ class WikiLinkInline
132
+ attr_accessor :context_filename, :embed, :link_type, :filename, :header_txt, :block_id, :label_txt
133
+
134
+ FILENAME = "filename"
135
+ HEADER_TXT = "header_txt"
136
+ BLOCK_ID = "block_id"
137
+
138
+ # parameters ordered by appearance in regex
139
+ def initialize(doc_mngr, context_filename, embed, link_type, filename, header_txt, block_id, label_txt)
140
+ @doc_mngr ||= doc_mngr
141
+ @context_filename ||= context_filename
142
+ @embed ||= embed
143
+ @link_type ||= link_type
144
+ @filename ||= filename
145
+ @header_txt ||= header_txt
146
+ @block_id ||= block_id
147
+ @label_txt ||= label_txt
148
+ end
149
+
150
+ # escape square brackets if they appear in label text
151
+ def label_txt
152
+ return @label_txt.sub("[", "\\[").sub("]", "\\]")
153
+ end
154
+
155
+ # data
156
+
157
+ def md_regex
158
+ regex_embed = embedded? ? REGEX_LINK_EMBED : %r{}
159
+ regex_link_type = is_typed? ? %r{#{@link_type}#{REGEX_LINK_TYPE}} : %r{}
160
+ filename = described?(FILENAME) ? @filename : ""
161
+ if described?(HEADER_TXT)
162
+ header = %r{#{REGEX_LINK_HEADER}#{@header_txt}}
163
+ block = %r{}
164
+ elsif described?(BLOCK_ID)
165
+ header = %r{}
166
+ block = %r{#{REGEX_LINK_BLOCK}#{@block_id}}
167
+ elsif !described?(FILENAME)
168
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_regex error")
169
+ end
170
+ label_ = labelled? ? %r{#{REGEX_LINK_LABEL}#{label_txt}} : %r{}
171
+ return %r{#{regex_embed}#{regex_link_type}#{REGEX_LINK_LEFT}#{filename}#{header}#{block}#{label_}#{REGEX_LINK_RIGHT}}
172
+ end
173
+
174
+ def md_str
175
+ embed = embedded? ? "!" : ""
176
+ link_type = is_typed? ? "#{@link_type}::" : ""
177
+ filename = described?(FILENAME) ? @filename : ""
178
+ if described?(HEADER_TXT)
179
+ header = "\##{@header_txt}"
180
+ block = ""
181
+ elsif described?(BLOCK_ID)
182
+ header = ""
183
+ block = "\#\^#{@block_id}"
184
+ elsif !described?(FILENAME)
185
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_str error")
186
+ end
187
+ label_ = labelled? ? "\|#{@label_txt}" : ""
188
+ return "#{embed}#{link_type}\[\[#{filename}#{header}#{block}#{label_}\]\]"
189
+ end
190
+
191
+ # 'fm' -> frontmatter
192
+
193
+ def context_fm_data
194
+ return {
195
+ 'type' => @link_type,
196
+ 'url' => self.context_doc.url,
197
+ }
198
+ end
199
+
200
+ def linked_fm_data
201
+ return {
202
+ 'type' => @link_type,
203
+ 'url' => self.linked_doc.url,
204
+ }
205
+ end
206
+
207
+ def context_doc
208
+ return @doc_mngr.get_doc_by_fname(@context_filename)
209
+ end
210
+
211
+ def linked_doc
212
+ return @doc_mngr.get_doc_by_fname(@filename)
213
+ end
214
+
215
+ def linked_img
216
+ return @doc_mngr.get_image_by_fname(@filename) if self.is_img?
217
+ return nil
218
+ end
219
+
220
+ # descriptor methods
221
+
222
+ # def describe
223
+ # return {
224
+ # 'level' => level,
225
+ # 'labelled' => labelled?,
226
+ # 'embedded' => embedded?,
227
+ # 'typed_link' => is_typed?,
228
+ # }
229
+ # end
230
+
231
+ def labelled?
232
+ return !@label_txt.nil? && !@label_txt.empty?
233
+ end
234
+
235
+ def is_typed?
236
+ return !@link_type.nil? && !@link_type.empty?
237
+ end
238
+
239
+ def embedded?
240
+ return !@embed.nil? && @embed == "!"
241
+ end
242
+
243
+ def is_img?
244
+ # github supported image formats: https://docs.github.com/en/github/managing-files-in-a-repository/working-with-non-code-files/rendering-and-diffing-images
245
+ return SUPPORTED_IMG_FORMATS.any?{ |ext| ext == File.extname(@filename).downcase }
246
+ end
247
+
248
+ def is_img_svg?
249
+ return File.extname(@filename).downcase == ".svg"
250
+ end
251
+
252
+ # this method helps to make the 'WikiLinkInline.level' code read like a clean truth table.
253
+ def described?(chunk)
254
+ return (!@filename.nil? && !@filename.empty?) if chunk == FILENAME
255
+ return (!@header_txt.nil? && !@header_txt.empty?) if chunk == HEADER_TXT
256
+ return (!@block_id.nil? && !@block_id.empty?) if chunk == BLOCK_ID
257
+ Jekyll.logger.error("Jekyll-Wikilinks: There is no link level '#{chunk}' in the WikiLink Class")
258
+ end
259
+
260
+ def level
261
+ return "file" if described?(FILENAME) && !described?(HEADER_TXT) && !described?(BLOCK_ID)
262
+ return "header" if described?(FILENAME) && described?(HEADER_TXT) && !described?(BLOCK_ID)
263
+ return "block" if described?(FILENAME) && !described?(HEADER_TXT) && described?(BLOCK_ID)
264
+ return "invalid"
265
+ end
266
+
267
+ # validation methods
268
+
269
+ def is_valid?
270
+ return false if !@doc_mngr.file_exists?(@filename)
271
+ return false if (self.level == "header") && !@doc_mngr.doc_has_header?(self.linked_doc, @header_txt)
272
+ return false if (self.level == "block") && !@doc_mngr.doc_has_block_id?(self.linked_doc, @block_id)
273
+ return true
274
+ end
275
+ end
276
+
277
+ end
278
+ end
@@ -3,7 +3,7 @@
3
3
  module Jekyll
4
4
  module WikiLinks
5
5
 
6
- VERSION = "0.0.7"
6
+ VERSION = "0.0.8"
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.8
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: 2021-11-23 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: