class JekyllWikiLinks::Parser

more of a “parser” than a parser

Attributes

doc_manager[RW]
markdown_converter[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