Skip to content

Commit

Permalink
Memoize absolute_url and relative_url filters
Browse files Browse the repository at this point in the history
These two filters are quite slow, as Addressable::URI.parse is quite
slow. Fortunately, they are pure functions and so can be easily
memoized. This one change shaves 8s off the CockroachDB docs build
(github.com/cockroachdb/docs).
  • Loading branch information
benesch committed Aug 19, 2019
1 parent 84e3b92 commit 8ce5a12
Showing 1 changed file with 26 additions and 18 deletions.
44 changes: 26 additions & 18 deletions lib/jekyll/filters/url_filters.rb
Expand Up @@ -10,16 +10,20 @@ module URLFilters
# Returns the absolute URL as a String.
def absolute_url(input)
return if input.nil?

input = input.url if input.respond_to?(:url)
return input if Addressable::URI.parse(input.to_s).absolute?

site = @context.registers[:site]
return relative_url(input) if site.config["url"].nil?

Addressable::URI.parse(
site.config["url"].to_s + relative_url(input)
).normalize.to_s
cache = (@context.registers[:cached_absolute_urls] = {})
cache[input] ||= begin
input = input.url if input.respond_to?(:url)
site = @context.registers[:site]
if Addressable::URI.parse(input.to_s).absolute?
input
elsif site.config["url"].nil?
relative_url(input)
else
Addressable::URI.parse(
site.config["url"].to_s + relative_url(input)
).normalize.to_s
end
end
end

# Produces a URL relative to the domain root based on site.baseurl
Expand All @@ -30,14 +34,18 @@ def absolute_url(input)
# Returns a URL relative to the domain root as a String.
def relative_url(input)
return if input.nil?

input = input.url if input.respond_to?(:url)
return input if Addressable::URI.parse(input.to_s).absolute?

parts = [sanitized_baseurl, input]
Addressable::URI.parse(
parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join
).normalize.to_s
cache = (@context.registers[:cached_relative_urls] ||= {})
cache[input] ||= begin
input = input.url if input.respond_to?(:url)
if Addressable::URI.parse(input.to_s).absolute?
input
else
parts = [sanitized_baseurl, input]
Addressable::URI.parse(
parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join
).normalize.to_s
end
end
end

# Strips trailing `/index.html` from URLs to create pretty permalinks
Expand Down

0 comments on commit 8ce5a12

Please sign in to comment.