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 = YAML.load_file('_redirects.yml')['redirects'] rredirects = {} redirects.each do |id,value| dst = value['dst'] rredirects[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| #Find appropriate alternative page even with redirections that are not fully deployed in translations altid = id if redirects.has_key?(id) and redirects[id].has_key?('except') and !redirects[id]['except'].has_key?(altlang) altid = redirects[id]['dst'] end if rredirects.has_key?(id) 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 #Add posts site.posts.each do |post| sitemap.puts '' sitemap.puts ' http://bitcoin.org'+post.url.gsub('.html','')+'' sitemap.puts '' end #Close sitemap sitemap.puts '' end site.static_files << SitemapFile.new(site, site.source, '', 'sitemap.xml') end end end