jekyll-relative-links-0.6.1/0000755000004100000410000000000013562106566016001 5ustar www-datawww-datajekyll-relative-links-0.6.1/jekyll-relative-links.gemspec0000644000004100000410000000367013562106566023575 0ustar www-datawww-data######################################################### # This file has been automatically generated by gem2tgz # ######################################################### # -*- encoding: utf-8 -*- # stub: jekyll-relative-links 0.6.1 ruby lib Gem::Specification.new do |s| s.name = "jekyll-relative-links".freeze s.version = "0.6.1" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] s.authors = ["Ben Balter".freeze] s.date = "2019-10-23" s.email = ["ben.balter@github.com".freeze] s.files = ["lib/jekyll-relative-links.rb".freeze, "lib/jekyll-relative-links/context.rb".freeze, "lib/jekyll-relative-links/generator.rb".freeze, "lib/jekyll-relative-links/version.rb".freeze] s.homepage = "https://github.com/benbalter/jekyll-relative-links".freeze s.licenses = ["MIT".freeze] s.rubygems_version = "2.5.2.1".freeze s.summary = "A Jekyll plugin to convert relative links to markdown files to their rendered equivalents.".freeze if s.respond_to? :specification_version then s.specification_version = 4 if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then s.add_runtime_dependency(%q.freeze, ["< 5.0", ">= 3.3"]) s.add_development_dependency(%q.freeze, ["~> 3.5"]) s.add_development_dependency(%q.freeze, ["~> 0.71"]) s.add_development_dependency(%q.freeze, ["~> 0.10"]) else s.add_dependency(%q.freeze, ["< 5.0", ">= 3.3"]) s.add_dependency(%q.freeze, ["~> 3.5"]) s.add_dependency(%q.freeze, ["~> 0.71"]) s.add_dependency(%q.freeze, ["~> 0.10"]) end else s.add_dependency(%q.freeze, ["< 5.0", ">= 3.3"]) s.add_dependency(%q.freeze, ["~> 3.5"]) s.add_dependency(%q.freeze, ["~> 0.71"]) s.add_dependency(%q.freeze, ["~> 0.10"]) end end jekyll-relative-links-0.6.1/lib/0000755000004100000410000000000013562106566016547 5ustar www-datawww-datajekyll-relative-links-0.6.1/lib/jekyll-relative-links.rb0000644000004100000410000000026413562106566023317 0ustar www-datawww-data# frozen_string_literal: true require "jekyll" require_relative "jekyll-relative-links/generator" require_relative "jekyll-relative-links/context" module JekyllRelativeLinks end jekyll-relative-links-0.6.1/lib/jekyll-relative-links/0000755000004100000410000000000013562106566022770 5ustar www-datawww-datajekyll-relative-links-0.6.1/lib/jekyll-relative-links/version.rb0000644000004100000410000000012213562106566024775 0ustar www-datawww-data# frozen_string_literal: true module JekyllRelativeLinks VERSION = "0.6.1" end jekyll-relative-links-0.6.1/lib/jekyll-relative-links/context.rb0000644000004100000410000000032213562106566024776 0ustar www-datawww-data# frozen_string_literal: true module JekyllRelativeLinks class Context attr_reader :site def initialize(site) @site = site end def registers { :site => site } end end end jekyll-relative-links-0.6.1/lib/jekyll-relative-links/generator.rb0000644000004100000410000001047513562106566025312 0ustar www-datawww-data# frozen_string_literal: true module JekyllRelativeLinks class Generator < Jekyll::Generator attr_accessor :site, :config # Use Jekyll's native relative_url filter include Jekyll::Filters::URLFilters LINK_TEXT_REGEX = %r!(.*?)!.freeze FRAGMENT_REGEX = %r!(#.+?)?!.freeze INLINE_LINK_REGEX = %r!\[#{LINK_TEXT_REGEX}\]\(([^\)]+?)#{FRAGMENT_REGEX}\)!.freeze REFERENCE_LINK_REGEX = %r!^\s*?\[#{LINK_TEXT_REGEX}\]: (.+?)#{FRAGMENT_REGEX}\s*?$!.freeze LINK_REGEX = %r!(#{INLINE_LINK_REGEX}|#{REFERENCE_LINK_REGEX})!.freeze CONVERTER_CLASS = Jekyll::Converters::Markdown CONFIG_KEY = "relative_links" ENABLED_KEY = "enabled" COLLECTIONS_KEY = "collections" LOG_KEY = "Relative Links:" safe true priority :lowest def initialize(config) @config = config end def generate(site) return if disabled? @site = site @context = context documents = site.pages documents = site.pages + site.docs_to_write if collections? documents.each do |document| next unless markdown_extension?(document.extname) next if document.is_a?(Jekyll::StaticFile) next if excluded?(document) replace_relative_links!(document) end end def replace_relative_links!(document) url_base = File.dirname(document.relative_path) return document if document.content.nil? document.content = document.content.dup.gsub(LINK_REGEX) do |original| link_type, link_text, relative_path, fragment = link_parts(Regexp.last_match) next original unless replaceable_link?(relative_path) path = path_from_root(relative_path, url_base) url = url_for_path(path) next original unless url replacement_text(link_type, link_text, url, fragment) end rescue ArgumentError => e raise e unless e.to_s.start_with?("invalid byte sequence in UTF-8") end private def link_parts(matches) link_type = matches[2] ? :inline : :reference link_text = matches[link_type == :inline ? 2 : 5] relative_path = matches[link_type == :inline ? 3 : 6] fragment = matches[link_type == :inline ? 4 : 7] [link_type, link_text, relative_path, fragment] end def context @context ||= JekyllRelativeLinks::Context.new(site) end def markdown_extension?(extension) markdown_converter.matches(extension) end def markdown_converter @markdown_converter ||= site.find_converter_instance(CONVERTER_CLASS) end def url_for_path(path) target = potential_targets.find { |p| p.relative_path.sub(%r!\A/!, "") == path } relative_url(target.url) if target&.url end def potential_targets @potential_targets ||= site.pages + site.static_files + site.docs_to_write end def path_from_root(relative_path, url_base) relative_path.sub!(%r!\A/!, "") absolute_path = File.expand_path(relative_path, url_base) absolute_path.sub(%r!\A#{Regexp.escape(Dir.pwd)}/!, "") end def replacement_text(type, text, url, fragment = nil) url << fragment if fragment if type == :inline "[#{text}](#{url})" else "\n[#{text}]: #{url}" end end def absolute_url?(string) return unless string Addressable::URI.parse(string).absolute? rescue Addressable::URI::InvalidURIError nil end def fragment?(string) string&.start_with?("#") end def replaceable_link?(string) !fragment?(string) && !absolute_url?(string) end def option(key) config[CONFIG_KEY] && config[CONFIG_KEY][key] end def disabled? option(ENABLED_KEY) == false end def collections? option(COLLECTIONS_KEY) == true end def excluded?(document) return false unless option("exclude") entry_filter = if document.respond_to?(:collection) document.collection.entry_filter else global_entry_filter end entry_filter.glob_include?(option("exclude"), document.relative_path).tap do |excluded| Jekyll.logger.debug(LOG_KEY, "excluded #{document.relative_path}") if excluded end end def global_entry_filter @global_entry_filter ||= Jekyll::EntryFilter.new(site) end end end