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 20, 2019
1 parent 5d40711 commit a4a6678
Showing 1 changed file with 30 additions and 20 deletions.
50 changes: 30 additions & 20 deletions lib/jekyll/filters/url_filters.rb
Expand Up @@ -9,17 +9,8 @@ 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] ||= compute_absolute_url(input)
end

# Produces a URL relative to the domain root based on site.baseurl
Expand All @@ -29,15 +20,8 @@ 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] ||= compute_relative_url(input)
end

# Strips trailing `/index.html` from URLs to create pretty permalinks
Expand All @@ -53,6 +37,32 @@ def strip_index(input)

private

def compute_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
end

def compute_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
end

def sanitized_baseurl
site = @context.registers[:site]
site.config["baseurl"].to_s.chomp("/")
Expand Down

0 comments on commit a4a6678

Please sign in to comment.