jekyll-wikilinks 0.0.5 → 0.0.9
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 +4 -4
- data/lib/jekyll-wikilinks/config.rb +113 -0
- data/lib/jekyll-wikilinks/patch/context.rb +19 -0
- data/lib/jekyll-wikilinks/patch/doc_manager.rb +106 -0
- data/lib/jekyll-wikilinks/patch/site.rb +12 -0
- data/lib/jekyll-wikilinks/plugins/converter.rb +53 -0
- data/lib/jekyll-wikilinks/plugins/filter.rb +81 -0
- data/lib/jekyll-wikilinks/plugins/generator.rb +41 -0
- data/lib/jekyll-wikilinks/util/link_index.rb +89 -0
- data/lib/jekyll-wikilinks/util/parser.rb +169 -0
- data/lib/jekyll-wikilinks/util/regex.rb +72 -0
- data/lib/jekyll-wikilinks/util/wikilink.rb +278 -0
- data/lib/jekyll-wikilinks/version.rb +7 -3
- data/lib/jekyll-wikilinks.rb +22 -183
- metadata +46 -13
- data/lib/jekyll-wikilinks/context.rb +0 -15
- data/lib/jekyll-wikilinks/doc_manager.rb +0 -68
- data/lib/jekyll-wikilinks/filter.rb +0 -39
- data/lib/jekyll-wikilinks/jekyll_patch.rb +0 -24
- data/lib/jekyll-wikilinks/link_index.rb +0 -81
- data/lib/jekyll-wikilinks/naming_const.rb +0 -21
- data/lib/jekyll-wikilinks/parser.rb +0 -237
@@ -1,237 +0,0 @@
|
|
1
|
-
require_relative "naming_const"
|
2
|
-
|
3
|
-
module JekyllWikiLinks
|
4
|
-
REGEX_LINK_EMBED = /(?<embed>(\!))/i # 0 (capture index for WikiLinks class)
|
5
|
-
REGEX_LINK_TYPE = /::/
|
6
|
-
REGEX_LINK_HEADER = /\#/
|
7
|
-
REGEX_LINK_BLOCK = /\#\^/
|
8
|
-
REGEX_LINK_LABEL = /\|/
|
9
|
-
REGEX_WIKI_LINKS = %r{
|
10
|
-
(#{REGEX_LINK_EMBED})?
|
11
|
-
(#{REGEX_LINK_TYPE_TXT}#{REGEX_LINK_TYPE})?
|
12
|
-
\[\[
|
13
|
-
#{REGEX_FILENAME}
|
14
|
-
(#{REGEX_LINK_HEADER}#{REGEX_HEADER_TXT})?
|
15
|
-
(#{REGEX_LINK_BLOCK}#{REGEX_BLOCK_ID_TXT})?
|
16
|
-
(#{REGEX_LINK_LABEL}#{REGEX_LABEL_TXT})?
|
17
|
-
\]\]
|
18
|
-
}x
|
19
|
-
REGEX_TYPED_LINK_BLOCK = /#{REGEX_LINK_TYPE_TXT}#{REGEX_LINK_TYPE}\[\[#{REGEX_FILENAME}\]\]\n/i
|
20
|
-
|
21
|
-
# more of a "parser" than a parser
|
22
|
-
class Parser
|
23
|
-
attr_accessor :doc_manager, :markdown_converter, :wikilinks, :typed_link_blocks
|
24
|
-
|
25
|
-
# Use Jekyll's native relative_url filter
|
26
|
-
include Jekyll::Filters::URLFilters
|
27
|
-
|
28
|
-
def initialize(context, markdown_converter, doc_manager)
|
29
|
-
@context ||= context
|
30
|
-
@doc_manager ||= doc_manager
|
31
|
-
@markdown_converter ||= markdown_converter
|
32
|
-
@wikilinks, @typed_link_blocks = [], []
|
33
|
-
end
|
34
|
-
|
35
|
-
def parse(doc_content)
|
36
|
-
@typed_link_blocks, @wikilinks = [], []
|
37
|
-
# process blocks
|
38
|
-
typed_link_block_matches = doc_content.scan(REGEX_TYPED_LINK_BLOCK)
|
39
|
-
if !typed_link_block_matches.nil? && typed_link_block_matches.size != 0
|
40
|
-
typed_link_block_matches.each do |wl_match|
|
41
|
-
typed_link_block_wikilink = WikiLink.new(
|
42
|
-
nil,
|
43
|
-
wl_match[0],
|
44
|
-
wl_match[1],
|
45
|
-
nil,
|
46
|
-
nil,
|
47
|
-
nil,
|
48
|
-
)
|
49
|
-
doc_content.gsub!(typed_link_block_wikilink.md_link_str, "")
|
50
|
-
@typed_link_blocks << typed_link_block_wikilink
|
51
|
-
end
|
52
|
-
end
|
53
|
-
# process inlines
|
54
|
-
wikilink_matches = doc_content.scan(REGEX_WIKI_LINKS)
|
55
|
-
if !wikilink_matches.nil? && wikilink_matches.size != 0
|
56
|
-
wikilink_matches.each do |wl_match|
|
57
|
-
@wikilinks << WikiLink.new(
|
58
|
-
wl_match[0],
|
59
|
-
wl_match[1],
|
60
|
-
wl_match[2],
|
61
|
-
wl_match[3],
|
62
|
-
wl_match[4],
|
63
|
-
wl_match[5],
|
64
|
-
)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
# replace text
|
68
|
-
return if @wikilinks.nil?
|
69
|
-
@wikilinks.each do |wikilink|
|
70
|
-
doc_content.sub!(
|
71
|
-
wikilink.md_link_regex,
|
72
|
-
self.build_html(wikilink)
|
73
|
-
)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def build_html_embed(title, content, url)
|
78
|
-
# multi-line for readability
|
79
|
-
return [
|
80
|
-
"<div class=\"wiki-link-embed\">",
|
81
|
-
"<div class=\"wiki-link-embed-title\">",
|
82
|
-
"#{title}",
|
83
|
-
"</div>",
|
84
|
-
"<div class=\"wiki-link-embed-content\">",
|
85
|
-
"#{@markdown_converter.convert(content)}",
|
86
|
-
"</div>",
|
87
|
-
"<a class=\"wiki-link-embed-link\" href=\"#{url}\"></a>",
|
88
|
-
"</div>",
|
89
|
-
].join("\n").gsub!("\n", "")
|
90
|
-
end
|
91
|
-
|
92
|
-
def build_html_img_embed(img_file)
|
93
|
-
"<p><span class=\"wiki-link-embed-image\"><img class=\"wiki-link-img\" src=\"#{relative_url(img_file.relative_path)}\"/></span></p>"
|
94
|
-
end
|
95
|
-
|
96
|
-
def build_html(wikilink)
|
97
|
-
if wikilink.is_img?
|
98
|
-
linked_doc = @doc_manager.get_image_by_bname(wikilink.filename)
|
99
|
-
if wikilink.embedded? && wikilink.is_img?
|
100
|
-
return build_html_img_embed(linked_doc)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
linked_doc = @doc_manager.get_doc_by_fname(wikilink.filename)
|
104
|
-
if !linked_doc.nil?
|
105
|
-
link_type = wikilink.typed? ? " link-type #{wikilink.link_type}" : ""
|
106
|
-
|
107
|
-
# label
|
108
|
-
wikilink_inner_txt = wikilink.clean_label_txt if wikilink.labelled?
|
109
|
-
|
110
|
-
lnk_doc_rel_url = relative_url(linked_doc.url) if linked_doc&.url
|
111
|
-
# TODO not sure about downcase
|
112
|
-
fname_inner_txt = linked_doc['title'].downcase if wikilink_inner_txt.nil?
|
113
|
-
|
114
|
-
link_lvl = wikilink.describe['level']
|
115
|
-
if (link_lvl == "file")
|
116
|
-
wikilink_inner_txt = "#{fname_inner_txt}" if wikilink_inner_txt.nil?
|
117
|
-
return build_html_embed(
|
118
|
-
linked_doc['title'],
|
119
|
-
@doc_manager.get_doc_content(wikilink.filename),
|
120
|
-
lnk_doc_rel_url
|
121
|
-
) if wikilink.embedded?
|
122
|
-
elsif (link_lvl == "header" && DocManager.doc_has_header?(linked_doc, wikilink.header_txt))
|
123
|
-
# from: https://github.com/jekyll/jekyll/blob/6855200ebda6c0e33f487da69e4e02ec3d8286b7/Rakefile#L74
|
124
|
-
lnk_doc_rel_url += "\#" + Jekyll::Utils.slugify(wikilink.header_txt)
|
125
|
-
wikilink_inner_txt = "#{fname_inner_txt} > #{wikilink.header_txt}" if wikilink_inner_txt.nil?
|
126
|
-
elsif (link_lvl == "block" && DocManager.doc_has_block_id?(linked_doc, wikilink.block_id))
|
127
|
-
lnk_doc_rel_url += "\#" + wikilink.block_id.downcase
|
128
|
-
wikilink_inner_txt = "#{fname_inner_txt} > ^#{wikilink.block_id}" if wikilink_inner_txt.nil?
|
129
|
-
else
|
130
|
-
return '<span title="Content not found." class="invalid-wiki-link">' + wikilink.md_link_str + '</span>'
|
131
|
-
end
|
132
|
-
return '<a class="wiki-link' + link_type + '" href="' + lnk_doc_rel_url + '">' + wikilink_inner_txt + '</a>'
|
133
|
-
else
|
134
|
-
return '<span title="Content not found." class="invalid-wiki-link">' + wikilink.md_link_str + '</span>'
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
# the wikilink class knows everything about the original markdown syntax and its semantic meaning
|
140
|
-
class WikiLink
|
141
|
-
attr_accessor :embed, :link_type, :filename, :header_txt, :block_id, :label_txt
|
142
|
-
|
143
|
-
FILENAME = "filename"
|
144
|
-
HEADER_TXT = "header_txt"
|
145
|
-
BLOCK_ID = "block_id"
|
146
|
-
|
147
|
-
# parameters ordered by appearance in regex
|
148
|
-
def initialize(embed, link_type, filename, header_txt, block_id, label_txt)
|
149
|
-
# super(embed, link_type, filename, header_txt, block_id, label_txt)
|
150
|
-
@embed ||= embed
|
151
|
-
@link_type ||= link_type
|
152
|
-
@filename ||= filename
|
153
|
-
@header_txt ||= header_txt
|
154
|
-
@block_id ||= block_id
|
155
|
-
@label_txt ||= label_txt
|
156
|
-
end
|
157
|
-
|
158
|
-
# labeles are really flexible, so we need to handle them with a bit more care
|
159
|
-
def clean_label_txt
|
160
|
-
return @label_txt.sub("[", "\\[").sub("]", "\\]")
|
161
|
-
end
|
162
|
-
|
163
|
-
def md_link_str
|
164
|
-
embed = embedded? ? "!" : ""
|
165
|
-
link_type = typed? ? "#{@link_type}::" : ""
|
166
|
-
filename = described?(FILENAME) ? @filename : ""
|
167
|
-
if described?(HEADER_TXT)
|
168
|
-
header = "\##{@header_txt}"
|
169
|
-
block = ""
|
170
|
-
elsif described?(BLOCK_ID)
|
171
|
-
header = ""
|
172
|
-
block = "\#\^#{@block_id}"
|
173
|
-
elsif !described?(FILENAME)
|
174
|
-
Jekyll.logger.error "Invalid link level in 'md_link_str'. See WikiLink's 'md_link_str' for details"
|
175
|
-
end
|
176
|
-
label_ = labelled? ? "\|#{@label_txt}" : ""
|
177
|
-
return "#{embed}#{link_type}\[\[#{filename}#{header}#{block}#{label_}\]\]"
|
178
|
-
end
|
179
|
-
|
180
|
-
def md_link_regex
|
181
|
-
regex_embed = embedded? ? REGEX_LINK_EMBED : %r{}
|
182
|
-
regex_link_type = typed? ? %r{#{@link_type}#{REGEX_LINK_TYPE}} : %r{}
|
183
|
-
filename = described?(FILENAME) ? @filename : ""
|
184
|
-
if described?(HEADER_TXT)
|
185
|
-
header = %r{#{REGEX_LINK_HEADER}#{@header_txt}}
|
186
|
-
block = %r{}
|
187
|
-
elsif described?(BLOCK_ID)
|
188
|
-
header = %r{}
|
189
|
-
block = %r{#{REGEX_LINK_BLOCK}#{@block_id}}
|
190
|
-
elsif !described?(FILENAME)
|
191
|
-
Jekyll.logger.error "Invalid link level in regex. See WikiLink's 'md_link_regex' for details"
|
192
|
-
end
|
193
|
-
label_ = labelled? ? %r{#{REGEX_LINK_LABEL}#{clean_label_txt}} : %r{}
|
194
|
-
return %r{#{regex_embed}#{regex_link_type}\[\[#{filename}#{header}#{block}#{label_}\]\]}
|
195
|
-
end
|
196
|
-
|
197
|
-
def describe
|
198
|
-
return {
|
199
|
-
'level' => level,
|
200
|
-
'labelled' => labelled?,
|
201
|
-
'embedded' => embedded?,
|
202
|
-
'typed_link' => typed?,
|
203
|
-
}
|
204
|
-
end
|
205
|
-
|
206
|
-
def labelled?
|
207
|
-
return !@label_txt.nil? && !@label_txt.empty?
|
208
|
-
end
|
209
|
-
|
210
|
-
def typed?
|
211
|
-
return !@link_type.nil? && !@link_type.empty?
|
212
|
-
end
|
213
|
-
|
214
|
-
def embedded?
|
215
|
-
return !@embed.nil? && @embed == "!"
|
216
|
-
end
|
217
|
-
|
218
|
-
def is_img?
|
219
|
-
# github supported image formats: https://docs.github.com/en/github/managing-files-in-a-repository/working-with-non-code-files/rendering-and-diffing-images
|
220
|
-
return SUPPORTED_IMG_FORMATS.any?{ |ext| ext == File.extname(@filename).downcase }
|
221
|
-
end
|
222
|
-
|
223
|
-
def described?(chunk)
|
224
|
-
return (!@filename.nil? && !@filename.empty?) if chunk == FILENAME
|
225
|
-
return (!@header_txt.nil? && !@header_txt.empty?) if chunk == HEADER_TXT
|
226
|
-
return (!@block_id.nil? && !@block_id.empty?) if chunk == BLOCK_ID
|
227
|
-
Jekyll.logger.error "There is no link level '#{chunk}' in WikiLink Struct"
|
228
|
-
end
|
229
|
-
|
230
|
-
def level
|
231
|
-
return "file" if described?(FILENAME) && !described?(HEADER_TXT) && !described?(BLOCK_ID)
|
232
|
-
return "header" if described?(FILENAME) && described?(HEADER_TXT) && !described?(BLOCK_ID)
|
233
|
-
return "block" if described?(FILENAME) && !described?(HEADER_TXT) && described?(BLOCK_ID)
|
234
|
-
return "invalid"
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|