require 'yaml' require 'cgi' module Jekyll class SitemapFile < StaticFile def write(dest) # do nothing end end class SitemapGenerator < Generator def generate(site) #Load translations locs = {} Dir.foreach('_translations') do |file| next if file == '.' or file == '..' lang=file.split('.')[0] locs[lang] = YAML.load_file('_translations/'+file)[lang] end #Load redirections redirects = {} rredirects = {} Dir.foreach('_redirects') do |file| next if file == '.' or file == '..' id = file.split('.')[0] redirects[id] = YAML.load_file("_redirects/" + file) rredirects[redirects[id]['dst']] = id end #Create destination directory if does not exists if !File.directory?(site.dest) Dir.mkdir(site.dest) end File.open(File.join(site.dest, 'sitemap.xml'), 'w+') do |sitemap| #Open sitemap sitemap.puts '' sitemap.puts '' #Add translated pages with their alternative in each languages locs['en']['url'].each do |id,value| locs.each do |lang,value| #Don't add a page if their url is not translated or if they are a redirection next if locs[lang]['url'][id].nil? or locs[lang]['url'][id] == '' next if redirects.has_key?(id) and ( !redirects[id].has_key?('except') or !redirects[id]['except'].has_key?(lang) ) sitemap.puts '' sitemap.puts ' http://bitcoin.org/'+lang+'/'+CGI::escape(locs[lang]['url'][id])+'' locs.each do |altlang,value| altid = id #If there is a redirection from this page, use the destination as alternate url if redirects.has_key?(id) and ( !redirects[id].has_key?('except') or !redirects[id]['except'].has_key?(altlang) ) altid = redirects[id]['dst'] end #If there is a disabled redirection to this page, point to the source as alternate url if rredirects.has_key?(id) and redirects[rredirects[id]].has_key?('except') and redirects[rredirects[id]]['except'].has_key?(altlang) altid = rredirects[id] end next if locs[altlang]['url'][altid].nil? or locs[altlang]['url'][altid] == '' or altlang == lang sitemap.puts ' ' end sitemap.puts '' end end #Add static non-translated pages Dir.foreach('.') do |file1| if /^[a-z]{2}(_[A-Z]{2})?$/.match(file1) and File.directory?(file1) Dir.foreach(file1) do |file2| next if !/\.html$/.match(file2) #Ignore static redirect pages data = File.read(file1+'/'+file2) next if !data.index('window.location.href=').nil? sitemap.puts '' sitemap.puts ' http://bitcoin.org/'+file1+'/'+file2.gsub('.html','')+'' sitemap.puts '' end end next if !/\.html$/.match(file1) next if file1 == 'index.html' #Ignore static redirect pages and google webmaster tools data = File.read(file1) next if !data.index('window.location.href=').nil? or !data.index('google-site-verification:').nil? sitemap.puts '' sitemap.puts ' http://bitcoin.org/'+file1.gsub('.html','')+'' sitemap.puts '' end #Add english alerts pages Dir.foreach('_alerts') do |file| next if file == '.' or file == '..' sitemap.puts '' sitemap.puts ' http://bitcoin.org/en/alert/'+file.gsub('.html','')+'' sitemap.puts '' end #Add english releases pages Dir.foreach('_releases') do |file| next if file == '.' or file == '..' file = file.split('-') next if file.length < 4 file.shift() file.shift() file.shift() file = file.join('-') sitemap.puts '' sitemap.puts ' http://bitcoin.org/en/release/'+file.gsub('.md','').gsub('.html','')+'' sitemap.puts '' end #Close sitemap sitemap.puts '' end site.static_files << SitemapFile.new(site, site.source, '', 'sitemap.xml') end end end