class JekyllWikiLinks::Parser
more of a “parser” than a parser
Attributes
doc_manager[RW]
markdown_converter[RW]
typed_link_blocks[RW]
wikilinks[RW]
Public Class Methods
new(context, markdown_converter, doc_manager)
click to toggle source
# File lib/jekyll-wikilinks/parser.rb, line 28 def initialize(context, markdown_converter, doc_manager) @context ||= context @doc_manager ||= doc_manager @markdown_converter ||= markdown_converter @wikilinks, @typed_link_blocks = [], [] end
Public Instance Methods
build_html(wikilink)
click to toggle source
# File lib/jekyll-wikilinks/parser.rb, line 96 def build_html(wikilink) if wikilink.is_img? linked_doc = @doc_manager.get_image_by_bname(wikilink.filename) if wikilink.embedded? && wikilink.is_img? return build_html_img_embed(linked_doc) end end linked_doc = @doc_manager.get_doc_by_fname(wikilink.filename) if !linked_doc.nil? link_type = wikilink.typed? ? " link-type #{wikilink.link_type}" : "" # label wikilink_inner_txt = wikilink.clean_label_txt if wikilink.labelled? lnk_doc_rel_url = relative_url(linked_doc.url) if linked_doc&.url # TODO not sure about downcase fname_inner_txt = linked_doc['title'].downcase if wikilink_inner_txt.nil? link_lvl = wikilink.describe['level'] if (link_lvl == "file") wikilink_inner_txt = "#{fname_inner_txt}" if wikilink_inner_txt.nil? return build_html_embed( linked_doc['title'], @doc_manager.get_doc_content(wikilink.filename), lnk_doc_rel_url ) if wikilink.embedded? elsif (link_lvl == "header" && DocManager.doc_has_header?(linked_doc, wikilink.header_txt)) # from: https://github.com/jekyll/jekyll/blob/6855200ebda6c0e33f487da69e4e02ec3d8286b7/Rakefile#L74 lnk_doc_rel_url += "\#" + Jekyll::Utils.slugify(wikilink.header_txt) wikilink_inner_txt = "#{fname_inner_txt} > #{wikilink.header_txt}" if wikilink_inner_txt.nil? elsif (link_lvl == "block" && DocManager.doc_has_block_id?(linked_doc, wikilink.block_id)) lnk_doc_rel_url += "\#" + wikilink.block_id.downcase wikilink_inner_txt = "#{fname_inner_txt} > ^#{wikilink.block_id}" if wikilink_inner_txt.nil? else return '<span title="Content not found." class="invalid-wiki-link">' + wikilink.md_link_str + '</span>' end return '<a class="wiki-link' + link_type + '" href="' + lnk_doc_rel_url + '">' + wikilink_inner_txt + '</a>' else return '<span title="Content not found." class="invalid-wiki-link">' + wikilink.md_link_str + '</span>' end end
build_html_embed(title, content, url)
click to toggle source
# File lib/jekyll-wikilinks/parser.rb, line 77 def build_html_embed(title, content, url) # multi-line for readability return [ "<div class=\"wiki-link-embed\">", "<div class=\"wiki-link-embed-title\">", "#{title}", "</div>", "<div class=\"wiki-link-embed-content\">", "#{@markdown_converter.convert(content)}", "</div>", "<a class=\"wiki-link-embed-link\" href=\"#{url}\"></a>", "</div>", ].join("\n").gsub!("\n", "") end
build_html_img_embed(img_file)
click to toggle source
# File lib/jekyll-wikilinks/parser.rb, line 92 def build_html_img_embed(img_file) "<p><span class=\"wiki-link-embed-image\"><img class=\"wiki-link-img\" src=\"#{relative_url(img_file.relative_path)}\"/></span></p>" end
parse(doc_content)
click to toggle source
# File lib/jekyll-wikilinks/parser.rb, line 35 def parse(doc_content) @typed_link_blocks, @wikilinks = [], [] # process blocks typed_link_block_matches = doc_content.scan(REGEX_TYPED_LINK_BLOCK) if !typed_link_block_matches.nil? && typed_link_block_matches.size != 0 typed_link_block_matches.each do |wl_match| typed_link_block_wikilink = WikiLink.new( nil, wl_match[0], wl_match[1], nil, nil, nil, ) doc_content.gsub!(typed_link_block_wikilink.md_link_str, "") @typed_link_blocks << typed_link_block_wikilink end end # process inlines wikilink_matches = doc_content.scan(REGEX_WIKI_LINKS) if !wikilink_matches.nil? && wikilink_matches.size != 0 wikilink_matches.each do |wl_match| @wikilinks << WikiLink.new( wl_match[0], wl_match[1], wl_match[2], wl_match[3], wl_match[4], wl_match[5], ) end end # replace text return if @wikilinks.nil? @wikilinks.each do |wikilink| doc_content.sub!( wikilink.md_link_regex, self.build_html(wikilink) ) end end