mirror of
https://github.com/godotengine/godot-website.git
synced 2025-12-31 09:48:43 +03:00
The list of individual versions is no longer displayed twice every time the website is (re)built. Instead, only the number of versions that were generated is displayed.
133 lines
3.8 KiB
Ruby
133 lines
3.8 KiB
Ruby
module MirrorlistGeneratorPlugin
|
|
class MirrorlistGenerator < Jekyll::Generator
|
|
safe true
|
|
|
|
def generate(site)
|
|
puts "Generating mirrorlist pages..."
|
|
|
|
versions = 0
|
|
|
|
site.data["versions"].each do |version|
|
|
version_name = version["name"]
|
|
versions += 1
|
|
|
|
# Generate files for the current main flavor (stable or latest pre-release).
|
|
site.pages << MirrorlistPage.new(site, version, false)
|
|
site.pages << MirrorlistPage.new(site, version, true)
|
|
|
|
# Iterate through previous releases and generate files for them as well.
|
|
if version.key?("releases")
|
|
version["releases"].each do |release|
|
|
version_name = release.key?("release_version") ? release["release_version"] : version["name"]
|
|
|
|
prerelease = {
|
|
'name' => version_name,
|
|
'flavor' => release["name"]
|
|
}
|
|
site.pages << MirrorlistPage.new(site, prerelease, false)
|
|
site.pages << MirrorlistPage.new(site, prerelease, true)
|
|
end
|
|
end
|
|
end
|
|
|
|
puts "Finished generating the mirrorlist (#{versions} versions generated)."
|
|
end
|
|
end
|
|
|
|
class MirrorlistPage < Jekyll::Page
|
|
def initialize(site, version, mono)
|
|
# Configure static information and path.
|
|
@site = site
|
|
@base = site.source
|
|
@dir = 'mirrorlist'
|
|
|
|
# Generate the version identificator.
|
|
version_name = version["name"]
|
|
version_flavor = version["flavor"]
|
|
|
|
version_id = "#{version_name}.#{version_flavor}"
|
|
if version_name == "3.0" # Hack for the only version before the naming scheme has been changed.
|
|
version_id = "#{version_name}-#{version_flavor}"
|
|
end
|
|
if mono
|
|
version_id = "#{version_id}.mono"
|
|
end
|
|
|
|
version_bits = version_name.split(".")
|
|
version_majmin = "#{version_bits[0]}.#{version_bits[1]}"
|
|
|
|
# Configure the permalink information.
|
|
@basename = version_id
|
|
@ext = '.json'
|
|
@name = "#{version_id}.json"
|
|
|
|
# Generate the list of mirrors.
|
|
mirrors = []
|
|
|
|
mirrorlist_configs = site.data["mirrorlist_configs"]
|
|
mirrorlist_hosts = mirrorlist_configs["hosts"]
|
|
|
|
version_defaults = mirrorlist_configs["defaults"].find { |config| config["name"] == version_majmin }
|
|
|
|
unless version_defaults.nil?
|
|
mirror_hosts = version_defaults["stable"]
|
|
unless version_flavor == "stable"
|
|
mirror_hosts = version_defaults["preview"]
|
|
end
|
|
|
|
mirror_hosts.each do |host_name|
|
|
mirror_host = mirrorlist_hosts.find { |host| host["name"] == host_name }
|
|
mirror_url = make_download(version, mono, host_name)
|
|
|
|
unless mirror_url == "#"
|
|
mirror = { 'name' => mirror_host["title"], 'url' => mirror_url }
|
|
mirrors.push(mirror)
|
|
end
|
|
end
|
|
else
|
|
mirror_host = mirrorlist_hosts.find { |host| host["name"] == "tuxfamily" }
|
|
mirror_url = make_download(version, mono, "tuxfamily")
|
|
|
|
unless mirror_url == "#"
|
|
mirror = { 'name' => mirror_host["title"], 'url' => mirror_url }
|
|
mirrors.push(mirror)
|
|
end
|
|
end
|
|
|
|
# Initialize data hash to pass objects to the template.
|
|
@data = {
|
|
'version_mirrors' => mirrors
|
|
}
|
|
|
|
# Defaults can be configured via the `_config.yml`, same as with normal
|
|
# collections.
|
|
data.default_proc = proc do |_, key|
|
|
site.frontmatter_defaults.find(relative_path, :mirrorlist, key)
|
|
end
|
|
end
|
|
|
|
# This is a hack to generate the URL from code. I don't know a better way to hook into Liquid and use its
|
|
# registered filters. But it's short and sweet enough for now (or for... ever).
|
|
def make_download(version, mono, host)
|
|
template = Liquid::Template.parse('{{ version | make_download: "templates", mono, host }}')
|
|
|
|
assigns = {
|
|
'version' => version,
|
|
'mono' => mono,
|
|
'host' => host
|
|
}
|
|
# We need to pass the site reference to registers because make_downloads relies on this context being
|
|
# present.
|
|
return template.render(assigns, registers: { site: @site })
|
|
end
|
|
|
|
def url_placeholders
|
|
{
|
|
:path => @dir,
|
|
:basename => basename,
|
|
:output_ext => output_ext,
|
|
}
|
|
end
|
|
end
|
|
end
|