2006年08月07日 (月)

テキストのサイトマップファイルを作成してみる

Google サイトマップが使えるようになった記念に、Google Sitemap にサイトコンテンツの URL を教えるためのテキストファイルを生成するシェルスクリプトを作ってみました。
  • セクション「出力例」を追加
  • リンク切れを解消

主旨

iBlog のようにローカルにサイトを構築してそれをアップロードするタイプのツールを使っているときに、そのローカルのサイトを利用して Google Sitemap で使用するテキストのサイトマップファイルを生成します。

特に iDisk にサイトを構築している場合、例えローカルにサイトがなくとも iDisk を「接続」すればローカルにあるかのように扱えるので、.Mac 上のサイトならば使えます。

ダウンロード

sitemap.dmg (62,013 byte)

動作環境

Mac OS X がターゲットですが、bash が使える UNIX 系の OS ならばなんでもよいでしょう。

中で使用しているコマンドには絶対パスを使用しています。もしお使いの環境でパスが異なる場合はシェルスクリプトを直接編集してください。編集箇所は次のとおりです。

  •  1 行目: #!/bin/sh
  • 38 行目: mv=/bin/mv
  • 39 行目: rm=/bin/rm
  • 40 行目: find=/usr/bin/find
  • 41 行目: sed=/usr/bin/sed
  • 42 行目: diff=/usr/bin/diff
  • 43 行目: basename=/usr/bin/basename

使い方

コマンドライン

引数無しで実行すると次のように使い方が表示されます。

sitemap.sh localSiteDir baseURL [sitemap-filename]

それぞれの引数について説明します。

localSiteDir

ローカルにおけるサイトのベースディレクトリです。例えば iBlog の BlogUUID が B348746148 のブログを指定するのでしたら“~/Sites/iblog/B348746148” と指定します。最後に“/”があってもなくても構いません。

baseURL

そのサイトのベース URL です。例えばこのブログでしたら“http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips”と指定します。最後に“/”があってもなくても構いません。

sitemap-filename

生成されるサイトマップファイルのファイル名です。この引数は省略しても構いません。省略すると“sitemap.txt”となります。

動作結果

実行すると localSiteDir の下に sitemap.txt(sitemap-filename) が作成されます。そのまま「公開」や「同期」を行えばアップロードされます。

「公開」や「同期」をするときに同じ内容でもアップロードするのは無駄です。ですから sitemap.sh は生成したサイトマップファイルが既に生成してあるファイルと同じ内容だったら、それを上書きしないようになっています。実行しても sitemap.txt(sitemap-filename) の更新日時が新しくならないとしたら、それは更新するまでもないからです。

使用例
iBlog によるブログ

BlogUUID が B12345678 で公開先のベース URL (トップページの index.html があるところ) が http://homepage.mac.com/myname/iblog の場合は次のようにします。

sitemap.sh ~/Sites/iblog/B12345678 http://homepage.mac.com/myname/iblog
iDisk 上にのみあるサイト

URL が http://homepage.mac.com/myname/gallery の場合、iDisk を Finder でマウントしてから次のようにします。

sitemap.sh /Volumes/myname/Sites/gallery http://homepage.mac.com/myname/gallery

出力例

私のサイトの出力例を幾つか列挙しておきます。

ただし Thingamablog 用には私はこのコマンド自体は使っておらず、このシェルスクリプトのコア部分を組み込んだ Automator によるアプリケーションを使用していて、複数ある RSS もサイトマップに含めています。というよりこのシェルスクリプトはそのアプリケーションのサイトマップ生成部分を取り出してコマンドとして仕上げました。

その気になればサイトマッププロトコルの XML ファイルも作れるのですが、大して情報量を自動で増やせないのでテキストのサイトマップファイルで十分かと思います。XML のサイトマップへのリンクはそのうちリンク切れになります。

ソースコード

シェルスクリプトなのでソースコードというのも変ですが、dmg ファイルを開けないシステムを使用している人のためにソースコードも載せておきます。コピーして自分でシェルスクリプトにしてください。

#!/bin/sh

# Copyright (C) 2006 OKAMURA Yuji, All rights reserved.

#### function definition
function usage () {
	local	progname=`$basename $0`

	cat <<EOF >&2
Usage:
    $progname localSiteDir baseURL [sitemap-filename]
EOF
}

function normalizeDirPath () {
	local dirpath="$1"
	local matched=`expr "$dirpath" : '\(.*\)/$'`

	if [ "$matched" != '' ]; then
		echo "$matched"
	else
		echo "$dirpath"
	fi
}

function regexpStr () {
	local	str="$1"

	echo "$str" | sed 's/\//\\\//g;s/\./\\./g'
}

function onCatchSignal () {
	$rm -f "$TempFile"
	exit 3
}

#### command path definition
mv=/bin/mv
rm=/bin/rm
find=/usr/bin/find
sed=/usr/bin/sed
diff=/usr/bin/diff
basename=/usr/bin/basename

#### main
######## processing arguments
if [ $# -lt 2 -o $# -gt 3 ]; then
	usage
	exit 1
fi

LocalDir=`normalizeDirPath "$1"`
BaseURL=`normalizeDirPath "$2"`
BaseURL=`regexpStr "$BaseURL"`
SitemapFile="$3"
if [ "$SitemapFile" == '' ]; then
	SitemapFile=sitemap.txt
fi
SitemapFile="$LocalDir/$SitemapFile"

######## global parameters
TempFile="/tmp/sitemap_${LOGNAME}_$$.txt"

######## generate sitemap file
trap onCatchSignal SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
(
	cd "$LocalDir" || exit 2
	$find . -type f -name '*.html' -print |\
	$sed "s/^\.\//$BaseURL\//"
) > "$TempFile"

######## update sitemap file
if [ \! -f "$SitemapFile" ]; then
	$mv "$TempFile" "$SitemapFile"
elif $diff "$SitemapFile" "$TempFile">/dev/null; then
	$rm "$TempFile"
else
	$mv "$TempFile" "$SitemapFile"
fi

Posted: 18:57    | Comment | Trackback


以下、類似エントリです。