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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 861b1b580036bacff2ddf67c3080e21ec36adfe550944fb637ee07ce6afa5b58
4
- data.tar.gz: 62380a8fbc94fdb4646055999b1deaf339a561bf3fbdfb8f858b0b8e993573fb
3
+ metadata.gz: 9faa067220a9b3603654fbcf2fc240fd66b9e143ad197700e5773c9c1876e5d0
4
+ data.tar.gz: fd3b93e960ed6dc0f7e2e7cc09a6ec7ee3d1742a5e377c801fe2d054927d0f2a
5
5
  SHA512:
6
- metadata.gz: fa76884a4da7bdca8ec6d389140a8c7f0b193563bba676abe81ea683b6932444abcfe1fb619c0e6186450f38eb81cced6067c154c275854fd73bc81b932c4455
7
- data.tar.gz: 4e2ffa8675e1a6d5066f472d3b021d1d8c20a11104c1802b0dd451c45d92120b410aea44c8bf8b6af6a42b0d9d3bb287cb4469382e8c66d7e03448cff650c0da
6
+ metadata.gz: ca52556545cfaf6d09be217fe824e1e07f7d7621b4a8ca06d4e9c62dc85df95561f5c00468cf302d978bb2fd5b61548d14ac860ed746d91d2a25fa5e9d1cccee
7
+ data.tar.gz: cba704245f83e5eeed86b21a20fd26a7713312b76e4ce5ef44e60dfc1b55020c2af6d8c0de4bd258a927f3131d313312964ecc7a55d94a83dcf53beeeeb48ff7
@@ -32,27 +32,27 @@ module Jekyll
32
32
  def initialize(config)
33
33
  @config ||= config
34
34
  self.old_config_warn()
35
- Jekyll.logger.debug "Excluded jekyll types: ", option(EXCLUDE_KEY) unless disabled?
35
+ Jekyll.logger.debug("Jekyll-Wikilinks: Excluded jekyll types: #{option(EXCLUDE_KEY)}") unless disabled?
36
36
  end
37
37
 
38
38
  # util
39
39
 
40
40
  def css_name(name_key)
41
41
  return option_css_name(name_key) if option_css_name(name_key)
42
- return "typed" if name_key == TYPED_KEY
42
+ return "typed" if name_key == TYPED_KEY
43
43
  # valid
44
- return "wiki-link" if name_key == WIKI_KEY
44
+ return "wiki-link" if name_key == WIKI_KEY
45
45
  # invalid
46
- return "invalid-wiki-link" if name_key == INV_WIKI_KEY
46
+ return "invalid-wiki-link" if name_key == INV_WIKI_KEY
47
47
  # return "invalid-web-link" if name_key == INV_WEB_KEY
48
48
  # embeds
49
- return "embed-wrapper" if name_key == EMBED_WRAPPER_KEY
50
- return "embed-title" if name_key == EMBED_TITLE_KEY
51
- return "embed-content" if name_key == EMBED_CONTENT_KEY
52
- return "embed-wiki-link" if name_key == EMBED_LINK_KEY
49
+ return "embed-wrapper" if name_key == EMBED_WRAPPER_KEY
50
+ return "embed-title" if name_key == EMBED_TITLE_KEY
51
+ return "embed-content" if name_key == EMBED_CONTENT_KEY
52
+ return "embed-wiki-link" if name_key == EMBED_LINK_KEY
53
53
  # img
54
- return "embed-image-wrapper" if name_key == EMBED_IMG_WRAPPER_KEY
55
- return "embed-image" if name_key == EMBED_IMG_KEY
54
+ return "embed-image-wrapper" if name_key == EMBED_IMG_WRAPPER_KEY
55
+ return "embed-image" if name_key == EMBED_IMG_KEY
56
56
  end
57
57
 
58
58
  def disabled?
@@ -68,6 +68,10 @@ module Jekyll
68
68
  return option(EXCLUDE_KEY).include?(type.to_s)
69
69
  end
70
70
 
71
+ def excluded_css_names
72
+ return self.option_css(EXCLUDE_KEY)
73
+ end
74
+
71
75
  # options
72
76
 
73
77
  def option(key)
@@ -94,13 +98,13 @@ module Jekyll
94
98
 
95
99
  def old_config_warn()
96
100
  if @config.include?("wikilinks_collection")
97
- Jekyll.logger.warn "As of 0.0.3, 'wikilinks_collection' is no longer used for configs. jekyll-wikilinks will scan all markdown files by default. Check README for details."
101
+ Jekyll.logger.warn("Jekyll-Wikilinks: As of 0.0.3, 'wikilinks_collection' is no longer used for configs. jekyll-wikilinks will scan all markdown files by default. Check README for details.")
98
102
  end
99
103
  if option_exist?("assets_rel_path")
100
- Jekyll.logger.warn "As of 0.0.5, 'assets_rel_path' is now 'path'."
104
+ Jekyll.logger.warn("Jekyll-Wikilinks: As of 0.0.5, 'assets_rel_path' is now 'path'.")
101
105
  end
102
106
  if @config.include?("d3_graph_data")
103
- Jekyll.logger.warn "As of 0.0.6, 'd3_graph_data' and graph functionality have been moved to the 'jekyll-graph' plugin."
107
+ Jekyll.logger.warn("Jekyll-Wikilinks: As of 0.0.6, 'd3_graph_data' and graph functionality have been moved to the 'jekyll-graph' plugin.")
104
108
  end
105
109
  end
106
110
  end
@@ -7,8 +7,22 @@ module Jekyll
7
7
  #
8
8
  # this class is responsible for answering any questions
9
9
  # related to jekyll markdown documents
10
- # that are meant to be processed by the wikilinks plugin
10
+ # that are meant to be processed by the wikilinks plugin.
11
11
  #
12
+ # the following methods are specifically to address two things:
13
+ # 1. ruby's 'find' / 'detect' function does not throw errors if
14
+ # there are multiple matches. fail fast, i want to know if there
15
+ # are duplicates.
16
+ # (not using sets because i don't want to clobber existing documents)
17
+ # 2. handle all jekyll documents in one place. i don't want to
18
+ # have to filter all documents for target markdown documents
19
+ # every time i need to check if a file exists.
20
+ #
21
+ # there is probably a better way to do this...i would prefer to have
22
+ # a plugin-wide function that just wraps all of this and can be called
23
+ # from anywhere in the plugin...but ruby is not a functional language...
24
+ # gotta have classes...
25
+ #
12
26
  class DocManager
13
27
  CONVERTER_CLASS = Jekyll::Converters::Markdown
14
28
 
@@ -22,7 +36,7 @@ module Jekyll
22
36
  docs += site.docs_to_write.filter { |d| !$wiki_conf.exclude?(d.type) }
23
37
  @md_docs = docs.filter { |doc| markdown_converter.matches(doc.extname) }
24
38
  if @md_docs.nil? || @md_docs.empty?
25
- Jekyll.logger.debug("No documents to process.")
39
+ Jekyll.logger.warn("Jekyll-Wikilinks: No documents to process.")
26
40
  end
27
41
 
28
42
  @static_files ||= site.static_files
@@ -35,43 +49,53 @@ module Jekyll
35
49
  end
36
50
 
37
51
  def get_doc_by_fname(filename)
38
- return nil if filename.nil? || @md_docs.size == 0
52
+ Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'filename'") if filename.nil? || filename.empty?
39
53
  docs = @md_docs.select{ |d| File.basename(d.basename, File.extname(d.basename)) == filename }
40
- return nil if docs.nil? || docs.size > 1
54
+ return nil if docs.nil? || docs.empty? || docs.size > 1
41
55
  return docs[0]
42
56
  end
43
57
 
44
58
  def get_doc_by_url(url)
45
- return nil if url.nil? || @md_docs.size == 0
59
+ Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'url'") if url.nil? || url.empty?
46
60
  docs = @md_docs.select{ |d| d.url == url }
47
- return nil if docs.nil? || docs.size > 1
61
+ return nil if docs.nil? || docs.empty? || docs.size > 1
48
62
  return docs[0]
49
63
  end
50
64
 
51
65
  def get_doc_content(filename)
52
- return nil if filename.nil? || @md_docs.size == 0
53
- docs = @md_docs.select{ |d| File.basename(d.basename, File.extname(d.basename)) == filename }
54
- return docs[0].content if docs.size == 1
55
- return nil
66
+ doc = self.get_doc_by_fname(filename)
67
+ return nil if docs.nil?
68
+ return doc.content
56
69
  end
57
70
 
58
71
  def get_image_by_fname(filename)
59
- return nil if filename.nil? || @static_files.size == 0 || !SUPPORTED_IMG_FORMATS.any?{ |ext| ext == File.extname(filename).downcase }
72
+ Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'filename'") if filename.nil? || filename.empty?
73
+ return nil if @static_files.size == 0 || !SUPPORTED_IMG_FORMATS.any?{ |ext| ext == File.extname(filename).downcase }
60
74
  docs = @static_files.select{ |d| File.basename(d.relative_path) == filename }
61
- return nil if docs.nil? || docs.size > 1
75
+ return nil if docs.nil? || docs.empty? || docs.size > 1
62
76
  return docs[0]
63
77
  end
64
78
 
65
- def self.doc_has_header?(doc, header)
66
- return nil if header.nil?
79
+ # validators
80
+
81
+ def file_exists?(filename)
82
+ 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
87
+ end
88
+
89
+ def doc_has_header?(doc, header)
90
+ Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'header'") if header.nil? || header.empty?
67
91
  # leading + trailing whitespace is ignored when matching headers
68
- header_results = doc.content.scan(REGEX_ATX_HEADER).flatten.map { |htxt| htxt.strip }
69
- setext_header_results = doc.content.scan(REGEX_SETEXT_HEADER).flatten.map { |htxt| htxt.strip }
70
- return header_results.include?(header.strip) || setext_header_results.include?(header.strip)
92
+ header_results = doc.content.scan(REGEX_ATX_HEADER).flatten.map { |htxt| htxt.downcase.strip }
93
+ setext_header_results = doc.content.scan(REGEX_SETEXT_HEADER).flatten.map { |htxt| htxt.downcase.strip }
94
+ return header_results.include?(header.downcase.strip) || setext_header_results.include?(header.downcase.strip)
71
95
  end
72
96
 
73
- def self.doc_has_block_id?(doc, block_id)
74
- return nil if block_id.nil?
97
+ def doc_has_block_id?(doc, block_id)
98
+ Jekyll.logger.error("Jekyll-Wikilinks: Must provide a 'block_id'") if block_id.nil? || block_id.empty?
75
99
  # leading + trailing whitespace is ignored when matching blocks
76
100
  block_id_results = doc.content.scan(REGEX_BLOCK).flatten.map { |bid| bid.strip }
77
101
  return block_id_results.include?(block_id)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require "jekyll"
3
3
 
4
- # appending to built-in jekyll site object to pass data to jekyll-d3
4
+ # appending to built-in jekyll site object to pass data to jekyll-graph
5
5
 
6
6
  module Jekyll
7
7
 
@@ -5,66 +5,68 @@ module Jekyll
5
5
 
6
6
  module TypeFilters
7
7
  # 'links' accepts untyped links, typed links, and attributes; fore and back.
8
+ # why: these filters are useful when you want to list backlinks of certain type(s) and don't want type mismatches to display as "missing"
8
9
 
9
- # usage: {% assign note_links = page.links | doc_type = "notes" %}
10
- # TODO: if you simply filter links against specific jekyll types, this filter is completely unecessary...
11
- # // looping through backlinks:
12
- # {% assign note_links = site.notes | where: "url", backlink.url | first %}
10
+ # usage: {% assign note_links = page.links | doc_type: "notes" %}
13
11
  def doc_type(links, doc_type)
14
- Jekyll.logger.error("'links' should not be nil") if links.nil?
15
- return "No doc type given" if doc_type.empty?
12
+ Jekyll.logger.error("Jekyll-Wikilinks: 'links' invalid") if links.nil?
13
+ Jekyll.logger.error("Jekyll-Wikilinks: 'doc_type' invalid") if doc_type.nil? || doc_type.empty?
16
14
  return [] if links.empty?
17
15
 
18
16
  site = @context.registers[:site]
17
+
18
+ links_of_type = []
19
19
  links.each do |l|
20
20
  # links
21
21
  if l.keys.include?('url')
22
- doc = site.documents.select{ |d| d.url == l['url'] && d.type.to_s == doc_type.to_s }
23
- if !doc.nil? && doc.size != 1
24
- links.delete(l)
22
+ docs = site.documents.select{ |d| d.url == l['url'] && d.type.to_s == doc_type.to_s }
23
+ if !docs.nil? && docs.size == 1
24
+ links_of_type << l
25
25
  end
26
26
  # attributes
27
27
  elsif l.keys.include?('urls')
28
28
  l['urls'].each do |lurl|
29
- doc = site.documents.select{ |d| d.url == lurl && d.type.to_s == doc_type.to_s }
30
- if !doc.nil? && doc.size != 1
31
- links['urls'].delete(lurl)
29
+ docs = site.documents.select{ |d| d.url == lurl && d.type.to_s == doc_type.to_s }
30
+ if !docs.nil? && docs.size == 1
31
+ links_of_type << l
32
32
  end
33
33
  end
34
34
  else
35
- Jekyll.logge.error("In 'doc_type' filter, 'links' do not have 'url' or 'urls'")
35
+ Jekyll.logger.error("Jekyll-Wikilinks: In 'doc_type' filter, 'links' do not have 'url' or 'urls'")
36
36
  end
37
37
  end
38
- return links.uniq
38
+ return links_of_type.uniq
39
39
  end
40
40
 
41
- # usage: {% assign author_links = page.links | rel_type = "author" %}
41
+ # usage: {% assign author_links = page.links | rel_type: "author" %}
42
42
  def rel_type(links, link_type)
43
- Jekyll.logger.error("'links' should not be nil") if links.nil?
44
- return "No link type given" if link_type.empty?
43
+ Jekyll.logger.error("Jekyll-Wikilinks: 'links' invalid") if links.nil?
44
+ Jekyll.logger.error("Jekyll-Wikilinks: 'link_type' invalid") if link_type.nil?
45
45
  return [] if links.empty?
46
46
 
47
47
  site = @context.registers[:site]
48
+
49
+ links_of_type = []
48
50
  links.each do |l|
49
51
  if l.keys.include?('url')
50
52
  if l['type'].to_s == link_type.to_s
51
53
  docs = site.documents.select{ |d| d.url == l['url'] }
52
54
  if !doc.nil? && doc.size != 1
53
- links.delete(l)
55
+ links_of_type << l
54
56
  end
55
57
  end
56
58
  elsif l.keys.include?('urls')
57
59
  l['urls'].each do |lurl|
58
60
  docs = site.documents.select{ |d| d.url == lurl }
59
61
  if !doc.nil? && doc.size != 1
60
- links['urls'].delete(lurl)
62
+ links_of_type << lurl
61
63
  end
62
64
  end
63
65
  else
64
- Jekyll.logge.error("In 'rel_type' filter, 'links' do not have 'url' or 'urls'")
66
+ Jekyll.logge.error("Jekyll-Wikilinks: In 'rel_type' filter, 'links' do not have 'url' or 'urls'")
65
67
  end
66
68
  end
67
- return links.uniq
69
+ return links_of_type.uniq
68
70
  end
69
71
 
70
72
  end
@@ -6,7 +6,6 @@ require_relative "../patch/doc_manager"
6
6
  require_relative "../patch/site"
7
7
  require_relative "../util/link_index"
8
8
  require_relative "../util/parser"
9
- require_relative "converter"
10
9
 
11
10
  module Jekyll
12
11
  module WikiLinks
@@ -24,13 +23,14 @@ module Jekyll
24
23
  @site.link_index = LinkIndex.new(@site)
25
24
 
26
25
  @site.doc_mngr.all.each do |doc|
27
- @parser.parse(doc.content)
28
- @site.link_index.populate_forward(doc, @parser.wikilink_blocks, @parser.wikilink_inlines, @site.doc_mngr.all)
26
+ filename = File.basename(doc.basename, File.extname(doc.basename))
27
+ @parser.parse(filename, doc.content)
28
+ @site.link_index.populate(doc, @parser.wikilink_blocks, @parser.wikilink_inlines)
29
29
  end
30
30
  # wait until all docs are processed before assigning backward facing metadata,
31
31
  # this ensures all attributed/backlinks are collected for assignment
32
32
  @site.doc_mngr.all.each do |doc|
33
- @site.link_index.populate_backward(doc, @site.doc_mngr.all)
33
+ # populate frontmatter metadata from (wiki)link index
34
34
  @site.link_index.assign_metadata(doc)
35
35
  end
36
36
  end
@@ -10,7 +10,7 @@ module Jekyll
10
10
  @baseurl = site.baseurl
11
11
  @index = {}
12
12
  site.doc_mngr.all.each do |doc|
13
- @index[doc.url] = LinksInfo.new()
13
+ @index[doc.url] = DocLinks.new()
14
14
  end
15
15
  end
16
16
 
@@ -22,80 +22,57 @@ module Jekyll
22
22
  doc.data['missing'] = @index[doc.url].missing.uniq
23
23
  end
24
24
 
25
- def populate_forward(doc, wikilink_blocks, wikilink_inlines, md_docs)
26
- # attributes - blocks
27
- wikilink_blocks.each do |tlbl|
28
- urls = []
29
- tlbl.list_items.each do |bullet_type, filename|
30
- attr_doc = md_docs.detect { |d| File.basename(d.basename, File.extname(d.basename)) == filename }
31
- if !attr_doc.nil?
32
- urls << attr_doc.url
25
+ def populate(doc, wikilink_blocks, wikilink_inlines)
26
+ # blocks
27
+ wikilink_blocks.each do |wlbl|
28
+ if wlbl.is_valid?
29
+ # attributes
30
+ target_attr = @index[doc.url].attributes.detect { |atr| atr['type'] == wlbl.link_type }
31
+ ## create
32
+ if target_attr.nil?
33
+ @index[doc.url].attributes << wlbl.linked_fm_data
34
+ ## append
35
+ else
36
+ target_attr['urls'] += wlbl.urls
33
37
  end
34
- end
35
- if !urls.nil? && !urls.empty?
36
- @index[doc.url].attributes << {
37
- 'type' => tlbl.link_type,
38
- 'urls' => urls,
39
- }
40
- else
41
- Jekyll.logger.warn("No documents found for urls: #{urls}")
42
- end
43
- end
44
- # forelinks - inlines
45
- wikilink_inlines.each do |wlil|
46
- link_doc = md_docs.detect { |d| File.basename(d.basename, File.extname(d.basename)) == wlil.filename }
47
- if !link_doc.nil?
48
- @index[doc.url].forelinks << {
49
- 'type' => wlil.link_type,
50
- 'url' => link_doc.url,
51
- }
52
- end
53
- end
54
- # ...process missing links
55
- doc.content.scan(REGEX_INVALID_WIKI_LINK).each do |m|
56
- ltext = m[0]
57
- @index[doc.url].missing << ltext
58
- end
59
- end
60
-
61
- def populate_backward(doc, md_docs)
62
- md_docs.each do |doc_to_link|
63
- # attributed
64
- @index[doc_to_link.url].attributes.each do |al|
65
- urls = al['urls'].map { |url| self.remove_baseurl(url) }
66
- if urls.include?(doc.url)
67
- target_attr = @index[doc.url].attributed.detect { |atr| atr['type'] == al['type']}
68
- # add
69
- if !target_attr.nil?
70
- target_attr['urls'] << doc_to_link.url
71
- # create new
38
+ # attributed
39
+ wlbl.linked_docs.each do |linked_doc|
40
+ target_attr = @index[linked_doc.url].attributed.detect { |atr| atr['type'] == wlbl.link_type }
41
+ ## create
42
+ if target_attr.nil?
43
+ @index[linked_doc.url].attributed << wlbl.context_fm_data
44
+ ## append
72
45
  else
73
- urls = @index[doc.url].attributed.detect { |a| a['type'] == al['type'] }
74
- @index[doc.url].attributed << {
75
- 'type' => al['type'],
76
- 'urls' => [ doc_to_link.url ],
77
- }
46
+ target_attr['urls'] << doc.url
78
47
  end
79
48
  end
49
+ else
50
+ wlbl.filenames.each do |fn|
51
+ @index[doc.url].missing << fn
52
+ end
80
53
  end
81
- # backlinks
82
- @index[doc_to_link.url].forelinks.each do |l|
83
- if self.remove_baseurl(l['url']) == doc.url
84
- @index[doc.url].backlinks << {
85
- 'type' => l['type'],
86
- 'url' => doc_to_link.url,
87
- }
54
+ end
55
+ # inlines
56
+ wikilink_inlines.each do |wlil|
57
+ if !wlil.is_img?
58
+ if wlil.is_valid?
59
+ # forelink
60
+ @index[doc.url].forelinks << wlil.linked_fm_data
61
+ # backlink
62
+ @index[wlil.linked_doc.url].backlinks << wlil.context_fm_data
63
+ else
64
+ @index[doc.url].missing << wlil.filename
88
65
  end
89
66
  end
90
67
  end
91
68
  end
92
69
 
93
- def remove_baseurl(url)
94
- return url.gsub(@baseurl, '') if !@baseurl.nil?
95
- return url
96
- end
70
+ # def remove_baseurl(url)
71
+ # return url.gsub(@baseurl, '') if !@baseurl.nil?
72
+ # return url
73
+ # end
97
74
 
98
- class LinksInfo
75
+ class DocLinks
99
76
  attr_accessor :attributes, :attributed, :backlinks, :forelinks, :missing
100
77
 
101
78
  def initialize
@@ -103,7 +80,7 @@ module Jekyll
103
80
  @attributes = [] # block typed forelinks; { 'type' => str, 'urls' => [ str ] }
104
81
  @backlinks = [] # inline typed and basic backlinks; { 'type' => str, 'url' => str }
105
82
  @forelinks = [] # inline typed and basic forelinks; { 'type' => str, 'url' => str }
106
- @missing = [] # missing forelinks; [ str ]
83
+ @missing = [] # missing forelinks + attributes; ( built from (missing) filenames )
107
84
  end
108
85
  end
109
86
  end