lib/jekyll_outline.rb in jekyll_outline-1.0.2 vs lib/jekyll_outline.rb in jekyll_outline-1.1.0

- old
+ new

@@ -1,112 +1,7 @@ -# @author Copyright 2022 {https://www.mslinn.com Michael Slinn} +require_relative './outline_js' +require_relative './outline_tag' -require 'jekyll_draft' -require 'jekyll_plugin_logger' -require 'jekyll_plugin_support' -require 'yaml' -require_relative 'jekyll_outline/version' - module Outline - PLUGIN_NAME = 'outline'.freeze - - # Interleaves with docs - class Header - attr_accessor :order, :title - - def initialize(yaml) - @order = yaml[0] - @published = true - @title = yaml[1] - end - - def to_s - <<~END_STR - <h3 id="title_#{order}">#{title}</h3> - END_STR - end - end - - class OutlineTag < JekyllSupport::JekyllBlock - include JekyllOutlineVersion - - FIXNUM_MAX = (2**((0.size * 8) - 2)) - 1 - - def render_impl(text) - @collection_name = argument_string.strip - abort 'OutlineTag: collection_name was not specified' unless @collection_name - - headers = make_headers(super) # Process the block content. - collection = headers + obtain_docs(@collection_name) - <<~HEREDOC - <div class="posts"> - #{make_entries(collection).join("\n")} - </div> - HEREDOC - end - - private - - def header?(variable) - variable.instance_of?(Header) - end - - def make_headers(content) - yaml = YAML.safe_load content - yaml.map { |entry| Header.new entry } - end - - def make_entries(collection) - sorted = collection.sort_by(&obtain_order) - pruned = remove_empty_headers(sorted) - pruned.map do |entry| - if entry.instance_of? Header - <<~END_ENTRY - <span></span> <span>#{entry}</span> - END_ENTRY - else - date = entry.data['last_modified_at'] # "%Y-%m-%d" - draft = Jekyll::Draft.draft_html(entry) - <<~END_ENTRY - <span>#{date}</span> <span><a href="#{entry.url}">#{entry.data['title']}</a>#{draft}</span> - END_ENTRY - end - end - end - - # Ignores files called index.html - def obtain_docs(collection_name) - abort "#{@collection_name} is not a valid collection." unless @site.collections.key? @collection_name - @site - .collections[collection_name] - .docs - .reject { |doc| doc.path.end_with? 'index.html' } - end - - # Sort entries without an order property at the end - def obtain_order - proc do |entry| - if entry.respond_to? :data - entry.data.key?('order') ? entry.data['order'] : FIXNUM_MAX - else - entry.order - end - end - end - - def remove_empty_headers(array) - i = 0 - while i < array.length - 1 - if header?(array[i]) && header?(array[i + 1]) - array.delete_at(i) - else - i += 1 - end - end - - array.delete_at(array.length - 1) if header?(array.last) - array - end - - JekyllPluginHelper.register(self, PLUGIN_NAME) - end + include OutlineTag + include OutlineJsTag end