テキストのサイトマップファイルを作成してみる
主旨
iBlog のようにローカルにサイトを構築してそれをアップロードするタイプのツールを使っているときに、そのローカルのサイトを利用して Google Sitemap で使用するテキストのサイトマップファイルを生成します。
特に iDisk にサイトを構築している場合、例えローカルにサイトがなくとも iDisk を「接続」すればローカルにあるかのように扱えるので、.Mac 上のサイトならば使えます。
動作環境
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
以下、類似エントリです。