Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 58 additions & 28 deletions _includes/version_selector.html
Original file line number Diff line number Diff line change
@@ -1,28 +1,58 @@
{% if page.version %}
{% assign current_version = page.version %}
{% else %}
{% assign current_version = site.version %}
{% endif %}

{% assign current_version_label = site.versions[current_version] | default: 'undefined' %}

{% if page.all_versions.size > 1 %}
<div class="alt-nav dropdown">
<span class="alt-nav__opener nav-link dropdown-toggle" id="versionDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="alt-nav__opener-text">{{ current_version_label }}</span>
<i class="alt-nav__opener-icon icon-arrow-down"></i>
</span>
<span class="alt-nav__opener-label">Versions</span>
<ul class="alt-nav__drop dropdown-menu" aria-labelledby="versionDropdownMenuLink">
{% for version in page.all_versions %}
{% assign version_label = site.versions[version.version] | default: 'undefined' %}
<li><a href="{{ site.baseurl }}{{ version.url }}">{{ version_label }}</a></li>
{% endfor %}
</ul>
</div>
<div class="alt-nav__overlay"></div>
{% else %}
<div class="alt-nav">
<span class="alt-nav__opener">This document has only one version {{ current_version_label }}</span>
</div>
{% endif %}
def setup_current_page_version(page, config)
return if config['page']['version']

page.url.match(%r{/(?<version>(\d+\.\d+|latest))/})
version = Regexp.last_match(:version)

config['page']['version'] = version
end

def setup_all_page_versions(page, config)
current_path = page.url
normalized_url = current_path.gsub(%r{/(?:\d+\.\d+|latest)/}, '/__VERSION__/')
url_pattern = Regexp.new("\\A" + Regexp.escape(normalized_url).gsub('__VERSION__', '(?:\\d+\\.\\d+|latest)') + "\\Z")

versioned_page_urls = page.site.pages.select do |site_page|
site_page.url.match(url_pattern)
end.map(&:url).uniq

versions = get_versions(versioned_page_urls, page.site.config['versions'])
config['page']['all_versions'] = versions.sort_by { |v| v['version'].to_s }.reverse
end

def get_versions(urls, defined_versions)
version_pattern = %r{/(?<page_version>(\d+\.\d+|latest))/}

urls.map do |url|
match = version_pattern.match(url)
version = match && match[:page_version]
next unless version && defined_versions.key?(version)

{
'version' => version,
'url' => url
}
end.compact
end

def can_be_versioned(page)
product = page['product']
role = page['role']
versioned_categories = page.site.config['versioned_categories']

return false if versioned_categories.dig(product, role).nil?

page.url.match(%r{\A/docs/#{product}/#{role}/(?<category>[\w-]+)/})
page_category = Regexp.last_match(:category)

versioned_categories[product][role].include?(page_category)
end

Jekyll::Hooks.register :pages, :pre_render do |page, config|
next page unless File.extname(page.path).match?(/md|html/)
next page unless page.url.start_with?('/docs/')
next page unless can_be_versioned(page)

setup_current_page_version(page, config)
setup_all_page_versions(page, config)
end
Loading