jekyll-wikilinks 0.0.6 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,285 @@
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, :filename, :header_txt, :block_id, :label_txt
140
+
141
+ FILENAME = "filename"
142
+ HEADER_TXT = "header_txt"
143
+ BLOCK_ID = "block_id"
144
+
145
+ # parameters ordered by appearance in regex
146
+ def initialize(doc_mngr, context_filename, embed, link_type, filename, header_txt, block_id, label_txt)
147
+ @doc_mngr ||= doc_mngr
148
+ @context_filename ||= context_filename
149
+ @embed ||= embed
150
+ @link_type ||= link_type
151
+ @filename ||= filename
152
+ @header_txt ||= header_txt
153
+ @block_id ||= block_id
154
+ @label_txt ||= label_txt
155
+ end
156
+
157
+ # escape square brackets if they appear in label text
158
+ def label_txt
159
+ return @label_txt.sub("[", "\\[").sub("]", "\\]")
160
+ end
161
+
162
+ # data
163
+
164
+ def md_regex
165
+ regex_embed = embedded? ? REGEX_LINK_EMBED : %r{}
166
+ regex_link_type = is_typed? ? %r{#{@link_type}#{REGEX_LINK_TYPE}} : %r{}
167
+ filename = described?(FILENAME) ? @filename : ""
168
+ if described?(HEADER_TXT)
169
+ header = %r{#{REGEX_LINK_HEADER}#{@header_txt}}
170
+ block = %r{}
171
+ elsif described?(BLOCK_ID)
172
+ header = %r{}
173
+ block = %r{#{REGEX_LINK_BLOCK}#{@block_id}}
174
+ elsif !described?(FILENAME)
175
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_regex error")
176
+ end
177
+ label_ = labelled? ? %r{#{REGEX_LINK_LABEL}#{label_txt}} : %r{}
178
+ return %r{#{regex_embed}#{regex_link_type}#{REGEX_LINK_LEFT}#{filename}#{header}#{block}#{label_}#{REGEX_LINK_RIGHT}}
179
+ end
180
+
181
+ def md_str
182
+ embed = embedded? ? "!" : ""
183
+ link_type = is_typed? ? "#{@link_type}::" : ""
184
+ filename = described?(FILENAME) ? @filename : ""
185
+ if described?(HEADER_TXT)
186
+ header = "\##{@header_txt}"
187
+ block = ""
188
+ elsif described?(BLOCK_ID)
189
+ header = ""
190
+ block = "\#\^#{@block_id}"
191
+ elsif !described?(FILENAME)
192
+ Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_str error")
193
+ end
194
+ label_ = labelled? ? "\|#{@label_txt}" : ""
195
+ return "#{embed}#{link_type}\[\[#{filename}#{header}#{block}#{label_}\]\]"
196
+ end
197
+
198
+ # 'fm' -> frontmatter
199
+
200
+ def context_fm_data
201
+ return {
202
+ 'type' => @link_type,
203
+ 'url' => self.context_doc.url,
204
+ }
205
+ end
206
+
207
+ def linked_fm_data
208
+ return {
209
+ 'type' => @link_type,
210
+ 'url' => self.linked_doc.url,
211
+ }
212
+ end
213
+
214
+ def context_doc
215
+ return @doc_mngr.get_doc_by_fname(@context_filename)
216
+ end
217
+
218
+ def linked_doc
219
+ return @doc_mngr.get_doc_by_fname(@filename)
220
+ end
221
+
222
+ def linked_img
223
+ return @doc_mngr.get_image_by_fname(@filename) if self.is_img?
224
+ return nil
225
+ end
226
+
227
+ # descriptor methods
228
+
229
+ # def describe
230
+ # return {
231
+ # 'level' => level,
232
+ # 'labelled' => labelled?,
233
+ # 'embedded' => embedded?,
234
+ # 'typed_link' => is_typed?,
235
+ # }
236
+ # end
237
+
238
+ def labelled?
239
+ return !@label_txt.nil? && !@label_txt.empty?
240
+ end
241
+
242
+ def is_typed?
243
+ return !@link_type.nil? && !@link_type.empty?
244
+ end
245
+
246
+ def embedded?
247
+ return !@embed.nil? && @embed == "!"
248
+ end
249
+
250
+ def is_img?
251
+ # github supported image formats: https://docs.github.com/en/github/managing-files-in-a-repository/working-with-non-code-files/rendering-and-diffing-images
252
+ return SUPPORTED_IMG_FORMATS.any?{ |ext| ext == File.extname(@filename).downcase }
253
+ end
254
+
255
+ def is_img_svg?
256
+ return File.extname(@filename).downcase == ".svg"
257
+ end
258
+
259
+ # this method helps to make the 'WikiLinkInline.level' code read like a clean truth table.
260
+ def described?(chunk)
261
+ return (!@filename.nil? && !@filename.empty?) if chunk == FILENAME
262
+ return (!@header_txt.nil? && !@header_txt.empty?) if chunk == HEADER_TXT
263
+ return (!@block_id.nil? && !@block_id.empty?) if chunk == BLOCK_ID
264
+ Jekyll.logger.error("Jekyll-Wikilinks: There is no link level '#{chunk}' in the WikiLink Class")
265
+ end
266
+
267
+ def level
268
+ return "file" if described?(FILENAME) && !described?(HEADER_TXT) && !described?(BLOCK_ID)
269
+ return "header" if described?(FILENAME) && described?(HEADER_TXT) && !described?(BLOCK_ID)
270
+ return "block" if described?(FILENAME) && !described?(HEADER_TXT) && described?(BLOCK_ID)
271
+ return "invalid"
272
+ end
273
+
274
+ # validation methods
275
+
276
+ def is_valid?
277
+ return false if !@doc_mngr.file_exists?(@filename)
278
+ return false if (self.level == "header") && !@doc_mngr.doc_has_header?(self.linked_doc, @header_txt)
279
+ return false if (self.level == "block") && !@doc_mngr.doc_has_block_id?(self.linked_doc, @block_id)
280
+ return true
281
+ end
282
+ end
283
+
284
+ end
285
+ end
@@ -3,7 +3,7 @@
3
3
  module Jekyll
4
4
  module WikiLinks
5
5
 
6
- VERSION = "0.0.6"
7
-
6
+ VERSION = "0.0.10"
7
+
8
8
  end
9
- end
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.6
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - manunamz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-17 00:00:00.000000000 Z
11
+ date: 2022-01-24 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:
@@ -79,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
80
  - !ruby/object:Gem::Version
80
81
  version: '0'
81
82
  requirements: []
82
- rubygems_version: 3.2.17
83
+ rubygems_version: 3.2.27
83
84
  signing_key:
84
85
  specification_version: 4
85
86
  summary: Add jekyll support for [[wikilinks]] (in markdown files).