diff --git a/lib/docs/filters/core/internal_urls.rb b/lib/docs/filters/core/internal_urls.rb index 3486c8a0..23a27f40 100644 --- a/lib/docs/filters/core/internal_urls.rb +++ b/lib/docs/filters/core/internal_urls.rb @@ -1,38 +1,49 @@ -require 'set' - module Docs class InternalUrlsFilter < Filter def call - return doc if skip_links? - internal_urls = Set.new if follow_links? + unless skip_links? + follow_links? ? update_and_follow_links : update_links + end + doc + end + def update_links css('a').each do |link| - next unless url = parse_href(link['href']) - next unless subpath = subpath_to(url) - - normalize_subpath(subpath) - - next if skip_subpath?(subpath) - - normalize_internal_url(url, subpath) - + next unless url = to_internal_url(link['href']) link['href'] = internal_path_to(url) - internal_urls << url.merge!(fragment: nil).to_s if internal_urls + yield url if block_given? end + end - result[:internal_urls] = internal_urls.to_a if internal_urls - doc + def update_and_follow_links + urls = result[:internal_urls] = [] + update_links do |url| + urls << url.merge!(fragment: nil).to_s + end + urls.uniq! end def skip_links? - context[:skip_links].is_a?(Proc) ? context[:skip_links].call(self) : context[:skip_links] + if context[:skip_links].is_a? Proc + context[:skip_links].call self + else + context[:skip_links] + end end def follow_links? !(context[:follow_links] && context[:follow_links].call(self) == false) end - def parse_href(str) + def to_internal_url(str) + return unless (url = parse_url(str)) && (subpath = subpath_to(url)) + normalize_subpath(subpath) + return if skip_subpath?(subpath) + normalize_url(url, subpath) + url + end + + def parse_url(str) str && absolute_url_string?(str) && URL.parse(str) rescue URI::InvalidURIError nil @@ -61,9 +72,9 @@ module Docs false end - def normalize_internal_url(url, path) + def normalize_url(url, subpath) + url.merge! path: base_url.path + subpath url.normalize! - url.merge! path: base_url.path + path end def internal_path_to(url)