at posts/single.html

PukiWiki 用の Google Sitemaps を生成

Google Sitemaps がまた注目されているらしいので、PukiWiki 用の sitemaps.xml を生成するやっつけツールを公開してみる。 コマンドラインで使うものなので、シェルが使える環境なのが前提になる。 cron で定期的に動作させるといいかも。 PukiWiki の wiki ディレクトリを引数として実行すると、 sitemaps.xml を生成する。

$ ./sitemaps.rb /var/pukiwiki/wiki > sitemaps.xml

ソースは以下のとおり。 PukiWiki を静的リンクで動作させている場合は、 base_url_head の「index.php?」を取り除いて base_url_foot に「.html」を追加して使う。 high_list や mid_list に記述したページは若干 priority が高くなる。 目次用のページを記述するといいかも。

#!/usr/bin/env ruby
require 'uri'

# ----- setting -----
base_url_head = 'http://example.com/index.php?'
base_url_foot = ''
high_list     = %w{FrontPage MenuBar}
mid_list      = %w{|RecentChanges}
ignore_list   = %r{^(:)|(PukiWiki)}
# -------------------

if ARGV.size != 1
  STDERR.puts "usage: sitemaps.rb wiki_dir"
  exit 1
end

base_dir = ARGV.shift
now = Time.now.to_i
puts %q|<?xml version="1.0" encoding="UTF-8"?>|
puts %q|<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">|
Dir.glob("#{base_dir}/*txt") {|file|
  data = {}
  file =~ %r|/(\w+)\.txt|
  data[:name] = $1.to_a.pack('H*0')
  next if data[:name] =~ ignore_list
  data[:lastmod] = File.mtime(file)
  data[:loc] = "#{base_url_head}#{URI.escape(data[:name])}#{base_url_foot}"
  diff = now - data[:lastmod].to_i
  if(diff < 60 * 60)
    data[:changefreq] = 'hourly'
  elsif(diff < 60 * 60 * 24)
    data[:changefreq] = 'daily'
  elsif(diff < 60 * 60 * 24 * 7)
    data[:changefreq] = 'weekly'
  else
    data[:changefreq] = 'monthly'
  end

  if(high_list.index(data[:name]))
    data[:priority] = 0.8
  elsif(mid_list.index(data[:name]))
    data[:priority] = 0.7
  else
    data[:priority] = '0.5'
  end

  puts %q|<url>|
  puts %Q|<loc>#{data[:loc]}</loc>|
  puts %Q|<lastmod>#{data[:lastmod].utc.strftime('%Y-%m-%dT%H:%M:%S+00:00')}</lastmod>|
  puts %Q|<changefreq>#{data[:changefreq]}</changefreq>|
  puts %Q|<priority>#{data[:priority]}</priority>|
  puts %q|</url>|
}
puts %q|</urlset>|

PukiWiki-official の欲しいプラグイン/207 をみるとGoogle Sitemaps プラグインというものもある。 こちらは recent.dat から sitemaps.xml を生成するようだ。

関連する日記