| 1 |
#!/usr/bin/ruby |
| 2 |
# 静的リンクが、ベース名に収まっているかを確認するスクリプト |
| 3 |
# Satofumi KAMIMURA |
| 4 |
# |
| 5 |
# 処理概要 |
| 6 |
# - .html に対して以下の処理を行う |
| 7 |
# - a href="(.+)" をリンクとして抜き出す |
| 8 |
# - リンク先のファイルが存在しなければ、エラー表示 |
| 9 |
# - 存在したときに、それがベース名と一致しなければ、エラー表示 |
| 10 |
|
| 11 |
require 'find' |
| 12 |
require 'fileutils' |
| 13 |
|
| 14 |
|
| 15 |
# ベース名の指定がなければ、使い方を表示して終了 |
| 16 |
if ARGV.size < 1 |
| 17 |
print "usage:\n\t" + __FILE__ + "/path/of/base/dir/\n\n" |
| 18 |
exit |
| 19 |
end |
| 20 |
base_dir = ARGV[0] |
| 21 |
|
| 22 |
|
| 23 |
# 拡張子が html のファイル一覧を取得 |
| 24 |
check_links = {} |
| 25 |
Find.find(base_dir) { |fname| |
| 26 |
if File.extname(fname) != '.html' |
| 27 |
next |
| 28 |
end |
| 29 |
# 対象ファイルから、リンク先文字列を抽出 |
| 30 |
File.open(fname) { |io| |
| 31 |
line_count = 0 |
| 32 |
while line = io.gets |
| 33 |
if line =~ /a href="(.+?)"/ |
| 34 |
# '#' 以降を除去。空になった場合は登録しない |
| 35 |
link_name = $1.gsub(/[#&](.*)/, ''); |
| 36 |
if ! link_name.empty? |
| 37 |
check_links[link_name] = fname + ':' + line_count.to_s + ':' |
| 38 |
end |
| 39 |
end |
| 40 |
line_count += 1 |
| 41 |
end |
| 42 |
} |
| 43 |
} |
| 44 |
# !!! base_dir が存在しないときのチェックをするべき |
| 45 |
|
| 46 |
|
| 47 |
# ファイルのパス名がベースディレクトリと同じかを確認 |
| 48 |
check_links.each { |key, value| |
| 49 |
|
| 50 |
# 'http' から始まるリンク先はチェックしない |
| 51 |
if key[0, 4].downcase == 'http' |
| 52 |
next |
| 53 |
end |
| 54 |
check_name = base_dir + key |
| 55 |
|
| 56 |
# ファイルの存在確認 |
| 57 |
if ! FileTest.exist?(check_name) |
| 58 |
print value + ' ' + key + ": No such file\n" |
| 59 |
next |
| 60 |
end |
| 61 |
|
| 62 |
# 絶対パス名が、base_dir を含むかを確認 |
| 63 |
absolute_path = File.expand_path(check_name) |
| 64 |
if absolute_path.match(base_dir) == nil |
| 65 |
print value + ' ' + key + ": No match file on absolute path\n" |
| 66 |
end |
| 67 |
|
| 68 |
#print key, ' ', value, "\n" |
| 69 |
} |
| 70 |
|
| 71 |
|
| 72 |
# ベースディレクトリとの比較に失敗したファイル名を出力 |
| 73 |
# !!! |