class Jekyll::Tags::SnippetIncludeTag

A custom tag {% snippet %} which behaves almost identically to {% include %} Except that it will render the included file as a proper GTN Box

Public Instance Methods

get_config(context) click to toggle source
# File _plugins/snippet.rb, line 25
def get_config(context)
  context.registers[:site].config['icon-tag']
end
get_icon(icon) click to toggle source
# File _plugins/snippet.rb, line 17
def get_icon(icon)
  if icon.start_with?('fa')
    %(<i class="#{icon}" aria-hidden="true"></i><span class="visually-hidden">#{@text}</span>)
  elsif icon.start_with?('ai')
    %(<i class="ai #{icon}" aria-hidden="true"></i><span class="visually-hidden">#{@text}</span>)
  end
end
markdownify(text) click to toggle source
# File _plugins/snippet.rb, line 11
def markdownify(text)
  @site.find_converter_instance(
    Jekyll::Converters::Markdown
  ).convert(text.to_s)
end
render(context) click to toggle source
# File _plugins/snippet.rb, line 29
def render(context)
  @site ||= context.registers[:site]

  file = render_variable(context) || @file
  validate_file_name(file)

  # This doesn't feel right, we should've been able to figure it out in
  # render_variable(context) but it's not clear why that doesn't work.
  begin
    @site.inclusions[file] ||= locate_include_file(file)
  rescue StandardError
    @site.inclusions[file] ||= locate_include_file(context[file])
  end

  inclusion = @site.inclusions[file]

  add_include_to_dependency(inclusion, context) if @site.config['incremental']

  context.stack do
    context['include'] = parse_params(context) if @params
    x = inclusion.render(context).to_s
    p = context['include']

    box_start = ''
    box_end = ''
    if x.slice(0, 3) == '---'
      metadata = YAML.safe_load(x)

      # allow overriding box type with include parameter ("none" to render without a box)
      box_type = if !p.nil? && p['box_type']
                   p['box_type']
                 else
                   metadata['box_type']
                 end

      if context.registers[:page]&.key?('lang')
        lang = context.registers[:page].fetch('lang', 'en')
        lang = 'en' if lang.nil?
      end
      lang = 'en' if (lang != 'en') && (lang != 'es')
      if (box_type != 'none') && !box_type.nil?
        _box_id, box_title = Gtn::Boxify.generate_title(box_type, metadata['title'], lang,
                                                        context.registers[:page]['path'])
        box_start = "> #{box_title}"
        box_end = "\n{: .#{box_type}}"
      end
    end
    y = x.gsub(/\A---(.|\n)*?---/, '')
    # if y =~ /contribute/
    # puts "=== step 1   ===\n#{y}\n\n"
    # end
    z = markdownify(y)
    # if z =~ /contribute/
    # puts "=== step 2   ===\n#{z}\n\n"
    # end
    if box_start != ''
      z = z.gsub(/\R/, "\n> ")
      # puts box_start+y+box_end
    end

    # if z =~ /contribute/
    # puts "=== step 3   ===\n#{z}\n\n"
    # puts "=== MARKDOWN ===\n#{box_start+z+box_end}\n\n"
    # puts "=== RENDERED ===\n#{markdownify(box_start+z+box_end)}\n\n"
    # end

    final_box_text = markdownify(box_start + z + box_end)
                     # Replace newlines inside of a PRE with <br>, so they don't get eaten during next one.
                     .gsub(%r{<(pre)[^>]*>(.*?)</\1>}m) { |m| m.gsub(/\n/, '<br>') }
                     # Strip out spaces or the boxes break, replace
                     # them with single spaces so e.g. newlines get collapsed into a space
                     # and don't merge words together that shouldn't be merged.
                     .gsub(/\R+/, ' ')
                     .gsub('<h3', '<h3 data-toc-skip')
    "<!--SNIPPET-->#{final_box_text}<!--END_SNIPPET-->"
  end
end