jekyll-wikilinks 0.0.10 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9067c4d2ad9673d39b79195cb9bd4ef955e5cccac52702bfdd731c9d0aade4b7
4
- data.tar.gz: 9b5a31b067e375100933d101b9bab94b8a1d19e17327ab0306cea6ea83543b18
3
+ metadata.gz: c2acbae9be49d78fdcbbe55411349c1321ac86cd8222ccd44657d04bbbd446ea
4
+ data.tar.gz: 28811da20a489fbd36c8566aea26b493e5a26b11e1e020f52d88b69d17d30e08
5
5
  SHA512:
6
- metadata.gz: e3ff8a744de37ca82b01bed3ebeff321c43fa442a923fe9c1a19da6affbc0a54e6bc6f0a9901b86b66b223fe55a7f8277d7594e740d040faa80bfb71cc64e215
7
- data.tar.gz: b04df5871d0c527e4d86c3e560205da232b2b1fe48bfe23919c0b400d6888ed373e6b5fffa6a6da687b89620096ef09223e0a691ec1e1dd8c00a533223f124e6
6
+ metadata.gz: 914ed17d2a796330f190f7e97edb14f7dc328445c2e0a044ddc35532d927bca469baabb90a179455e39d04c368188bdeb328e1a7ce8a1be7d2f01a3356594ebc
7
+ data.tar.gz: 8bdd89667f8beba351bfd7233245135222d1cb3a432b9ff4b3df2c471252b5f9b09e2cc95cb75f57607e6d47ca73559f7c964b8b1f977a8a5ecd3b734b9d751a
@@ -4,6 +4,7 @@ require_relative "../util/regex"
4
4
  module Jekyll
5
5
  module WikiLinks
6
6
 
7
+ # todo: move these methods to the 'WikiLink' classes...?
7
8
  #
8
9
  # this class is responsible for answering any questions
9
10
  # related to jekyll markdown documents
@@ -55,6 +56,13 @@ module Jekyll
55
56
  return docs[0]
56
57
  end
57
58
 
59
+ def get_doc_by_fpath(file_path)
60
+ Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'file_path'") if file_path.nil? || file_path.empty?
61
+ docs = @md_docs.select{ |d| d.relative_path == (file_path + ".md") }
62
+ return nil if docs.nil? || docs.empty? || docs.size > 1
63
+ return docs[0]
64
+ end
65
+
58
66
  def get_doc_by_url(url)
59
67
  Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'url'") if url.nil? || url.empty?
60
68
  docs = @md_docs.select{ |d| d.url == url }
@@ -78,12 +86,15 @@ module Jekyll
78
86
 
79
87
  # validators
80
88
 
81
- def file_exists?(filename)
89
+ def file_exists?(filename, file_path=nil)
82
90
  Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'filename'") if filename.nil? || filename.empty?
83
- docs = @md_docs.select{ |d| File.basename(d.basename, File.extname(d.basename)) == filename }
84
- docs += @static_files.select{ |d| File.basename(d.relative_path) == filename }
85
- return false if docs.nil? || docs.empty? || docs.size > 1
86
- return true
91
+ if file_path.nil?
92
+ return false if get_doc_by_fname(filename).nil? && get_image_by_fname(filename).nil?
93
+ return true
94
+ else
95
+ return false if get_doc_by_fpath(file_path).nil?
96
+ return true
97
+ end
87
98
  end
88
99
 
89
100
  def doc_has_header?(doc, header)
@@ -76,6 +76,8 @@ module Jekyll
76
76
  end
77
77
  # replace text
78
78
  return if @wikilink_inlines.nil?
79
+ # process typed wikilinks first so we don't accidentally
80
+ # overwrite them when handling untyped wikilinks
79
81
  self.sort_typed_first
80
82
  @wikilink_inlines.each do |wikilink|
81
83
  doc_content.gsub!(
@@ -125,24 +127,34 @@ module Jekyll
125
127
  # markdown file processing
126
128
  linked_doc = wikilink.linked_doc
127
129
  link_type_txt = wikilink.is_typed? ? " #{$wiki_conf.css_name("typed")} #{wikilink.link_type}" : ""
128
-
129
- inner_txt = wikilink.label_txt if wikilink.labelled?
130
130
  lnk_doc_rel_url = relative_url(linked_doc.url)
131
-
132
- if (wikilink.level == "file")
133
- inner_txt = "#{linked_doc['title'].downcase}" if inner_txt.nil?
131
+ if wikilink.labelled?
132
+ inner_txt = wikilink.label_txt
133
+ elsif linked_doc.data.keys.include?('title')
134
+ inner_txt = linked_doc.data['title'].downcase
135
+ # in case there is no 'title' frontmatter attribute
136
+ # (i'm seeing deprecation warnings, but there might
137
+ # be bugs caused by not using this...)
138
+ elsif linked_doc.respond_to?(:title)
139
+ inner_txt = linked_doc.title.downcase
140
+ # pages don't have automatically generated titles
141
+ else
142
+ inner_txt = Jekyll::Utils.slugify(linked_doc.basename)
143
+ end
144
+ # level-specific
145
+ if (wikilink.level == "file_path" || wikilink.level == "filename")
134
146
  return build_html_embed(
135
- linked_doc['title'],
147
+ linked_doc.title,
136
148
  linked_doc.content,
137
149
  lnk_doc_rel_url
138
150
  ) if wikilink.embedded?
139
151
  elsif (wikilink.level == "header")
140
152
  # from: https://github.com/jekyll/jekyll/blob/6855200ebda6c0e33f487da69e4e02ec3d8286b7/Rakefile#L74
141
153
  lnk_doc_rel_url += "\#" + Jekyll::Utils.slugify(wikilink.header_txt)
142
- inner_txt = "#{linked_doc['title'].downcase} > #{wikilink.header_txt.downcase}" if inner_txt.nil?
154
+ inner_txt += " > #{wikilink.header_txt.downcase}" if !wikilink.labelled?
143
155
  elsif (wikilink.level == "block")
144
156
  lnk_doc_rel_url += "\#" + wikilink.block_id
145
- inner_txt = "#{linked_doc['title'].downcase} > ^#{wikilink.block_id}" if inner_txt.nil?
157
+ inner_txt += " > ^#{wikilink.block_id}" if !wikilink.labelled?
146
158
  else
147
159
  Jekyll.logger.error("Jekyll-Wikilinks: Invalid wikilink level")
148
160
  end
@@ -22,7 +22,7 @@ module Jekyll
22
22
 
23
23
  # wikitext usable char requirements
24
24
  REGEX_LINK_TYPE_CHARS = /[^\n\s\!\#\^\|\]]+/i
25
- REGEX_FILENAME_CHARS = /[^\\\/:\#\^\|\[\]]+/i
25
+ REGEX_FILENAME_CHARS = /[^\\:\#\^\|\[\]]+/i
26
26
  REGEX_HEADER_CHARS = /[^\!\#\^\|\[\]]+/i
27
27
  REGEX_BLOCK_ID_CHARS = /[^\\\/:\!\#\^\|\[\]^\n]+/i
28
28
  REGEX_LABEL_CHARS = /(.+?)(?=\]{2}[^\]])/i
@@ -136,19 +136,30 @@ module Jekyll
136
136
  end
137
137
 
138
138
  class WikiLinkInline
139
- attr_accessor :context_filename, :embed, :link_type, :filename, :header_txt, :block_id, :label_txt
139
+ attr_accessor :context_filename, :embed, :link_type, :file_path, :path_type, :filename, :header_txt, :block_id, :label_txt
140
140
 
141
+ FILE_PATH = "file_path"
141
142
  FILENAME = "filename"
142
143
  HEADER_TXT = "header_txt"
143
144
  BLOCK_ID = "block_id"
144
145
 
145
146
  # parameters ordered by appearance in regex
146
- def initialize(doc_mngr, context_filename, embed, link_type, filename, header_txt, block_id, label_txt)
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
147
159
  @doc_mngr ||= doc_mngr
148
160
  @context_filename ||= context_filename
149
161
  @embed ||= embed
150
162
  @link_type ||= link_type
151
- @filename ||= filename
152
163
  @header_txt ||= header_txt
153
164
  @block_id ||= block_id
154
165
  @label_txt ||= label_txt
@@ -164,35 +175,45 @@ module Jekyll
164
175
  def md_regex
165
176
  regex_embed = embedded? ? REGEX_LINK_EMBED : %r{}
166
177
  regex_link_type = is_typed? ? %r{#{@link_type}#{REGEX_LINK_TYPE}} : %r{}
167
- filename = described?(FILENAME) ? @filename : ""
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
168
184
  if described?(HEADER_TXT)
169
185
  header = %r{#{REGEX_LINK_HEADER}#{@header_txt}}
170
186
  block = %r{}
171
187
  elsif described?(BLOCK_ID)
172
188
  header = %r{}
173
189
  block = %r{#{REGEX_LINK_BLOCK}#{@block_id}}
174
- elsif !described?(FILENAME)
190
+ elsif !described?(FILENAME) && !described?(FILE_PATH)
175
191
  Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_regex error")
176
192
  end
177
193
  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}}
194
+ return %r{#{regex_embed}#{regex_link_type}#{REGEX_LINK_LEFT}#{file_string}#{header}#{block}#{label_}#{REGEX_LINK_RIGHT}}
179
195
  end
180
196
 
181
197
  def md_str
182
198
  embed = embedded? ? "!" : ""
183
199
  link_type = is_typed? ? "#{@link_type}::" : ""
184
- filename = described?(FILENAME) ? @filename : ""
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
185
206
  if described?(HEADER_TXT)
186
207
  header = "\##{@header_txt}"
187
208
  block = ""
188
209
  elsif described?(BLOCK_ID)
189
210
  header = ""
190
211
  block = "\#\^#{@block_id}"
191
- elsif !described?(FILENAME)
212
+ elsif !described?(FILENAME) && !described?(FILE_PATH)
192
213
  Jekyll.logger.error("Jekyll-Wikilinks: WikiLinkInline.md_str error")
193
214
  end
194
215
  label_ = labelled? ? "\|#{@label_txt}" : ""
195
- return "#{embed}#{link_type}\[\[#{filename}#{header}#{block}#{label_}\]\]"
216
+ return "#{embed}#{link_type}\[\[#{file_string}#{header}#{block}#{label_}\]\]"
196
217
  end
197
218
 
198
219
  # 'fm' -> frontmatter
@@ -216,7 +237,11 @@ module Jekyll
216
237
  end
217
238
 
218
239
  def linked_doc
219
- return @doc_mngr.get_doc_by_fname(@filename)
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
220
245
  end
221
246
 
222
247
  def linked_img
@@ -258,6 +283,7 @@ module Jekyll
258
283
 
259
284
  # this method helps to make the 'WikiLinkInline.level' code read like a clean truth table.
260
285
  def described?(chunk)
286
+ return (!@file_path.nil? && !@file_path.empty?) if chunk == FILE_PATH
261
287
  return (!@filename.nil? && !@filename.empty?) if chunk == FILENAME
262
288
  return (!@header_txt.nil? && !@header_txt.empty?) if chunk == HEADER_TXT
263
289
  return (!@block_id.nil? && !@block_id.empty?) if chunk == BLOCK_ID
@@ -265,16 +291,17 @@ module Jekyll
265
291
  end
266
292
 
267
293
  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)
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)
271
298
  return "invalid"
272
299
  end
273
300
 
274
301
  # validation methods
275
302
 
276
303
  def is_valid?
277
- return false if !@doc_mngr.file_exists?(@filename)
304
+ return false if !@doc_mngr.file_exists?(@filename, @file_path)
278
305
  return false if (self.level == "header") && !@doc_mngr.doc_has_header?(self.linked_doc, @header_txt)
279
306
  return false if (self.level == "block") && !@doc_mngr.doc_has_block_id?(self.linked_doc, @block_id)
280
307
  return true
@@ -3,7 +3,7 @@
3
3
  module Jekyll
4
4
  module WikiLinks
5
5
 
6
- VERSION = "0.0.10"
6
+ VERSION = "0.0.11"
7
7
 
8
8
  end
9
9
  end
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.10
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: 2022-01-24 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