27. サイト移転5: Joyful Note改造の続き

(2021.3.22)


●参考にしたスプリクトやウェブサイトはページ下部にリンク。

 さて、CGI掲示板がひと息ついたので、それ以外のページ移転作業に入る。この機会にHTML4からHTML5へ書き換えようと思う。
 ・・・果てた。確かにHTML5の方がコードがシンプルでわかりやすい。しかし廃止された要素とかもあり、200ページ以上をページごとにチェックしながら直していくのは疲れた。過去の人物写真はなるべく小さくトリミングもしたし。まあそんなでも2020年12月30日に、ようやくウェブサイト全体を新天地のXREA(エクスリア)へと移転した。暮れの忙しい時期に何やってんだと思わない事もなかったが。(移転後もHTML5への書き換えは細々と続け、すべて終わったのは2021年2月だった)

 サイト移転が済んだからには、残っている課題、RSS出力の作業を再開する。

8. RSS配信については、KENTさんのTopics BoardがRSS付きである事に気付き、それを参考に。ただTopics Boardにレス機能は無いため、Joyful Noteに組み込むとレス記事(返信記事)を投稿した際には上手くいかないので、新規投稿の場合にのみRSS出力とした。
 RSS配信用のindex.xmlファイルを新規で作って、joyful.cgiと同じ階層に置く。中身は白紙で良い、パーミッションは606。
 init.cgiに、RSSの指定を入れる。
# -------- RSSフィード用:追加
# RSSを生成する(0=no 1=yes):追加
$cf{rss_make} = 1;

#RSSの表示件数(好みの件数で)
$cf{rss_max} = 3;

# 掲示板説明文(RSS用に定義)
$cf{description} = '掲示板の新着情報';

# 掲示板のURLパス(フルパスで定義)
$cf{topiurl} = 'ここに掲示板のURLを入力';

# RSSのURLパス(フルパスで定義)
# 例 $cf{rssurl} = 'http://www.example.com/bbs/index.xml';
$cf{rssurl} = 'ここに入力';

# RSSのサーバパス(joyful.cgiから見た位置)
$cf{rssfile} = './index.xml';
# --------- /RSSフィード用 

regist.cgiの適当なところに以下を加える。
#-----------------------------------------------------------
#  RSS2.0 作成
#-----------------------------------------------------------
sub make_rss {
    my @data = @_;
    
    # RSS
    my $rss = <<EOM;
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
        <title>$cf{bbs_title}</title>
        <link>$cf{topiurl}</link>
        <description>$cf{description}</description>
        <language>ja</language>
        <generator>$cf{version}</generator>
EOM
    
    my $kazu = $cf{rss_max};
    my $r;
    
    for (@data[1..$kazu]) {
        my ($no,$reno,$date,$name,$eml,$sub,$com,$url,$host,$pw,$col,$ext,$w,$h,$chk) = split(/<>/);
        
        # 文字カット: description
        my $char = strcutbytes_utf8($com,150);
        
        $rss .= qq|\t\t<item>\n|;
        $rss .= qq|\t\t\t<title>$sub</title>\n|;
        $rss .= qq|\t\t\t<link>$cf{rssurl}\#$no</link>\n|;
        $rss .= qq|\t\t\t<description>$char</description>\n|;
        $rss .= qq|\t\t\t<pubDate>$date</pubDate>\n|;
        $rss .= qq|\t\t</item>\n|;
        
        $r;
        last if ($r >= $cf{rss_max});
    }
    $rss .= "\t</channel>\n</rss>\n";
    
    # RSS書込
    open(RSS,"> $cf{rssfile}") or error("write err: $cf{rssfile}");
    print RSS $rss;
    close(RSS);
}
またRSS出力の際にコメント文字数を一定の長さにするため、TOPICS BOARDのadmin.cgiの842行目あたりの# 文字カット for UTF-8 のサブルーチンもそのまま追加する。

投稿記事受付内、188行目あたり# 更新の項 close(DAT); の後に
make_rss(@data) if ($cf{rss_make} == 1); 
を追加。
RSSのアイコンを表示させたいのなら、それ用のアイコンをcmnフォルダに入れ、joyful.cgiで、記事表示部の111行目あたり#テンプレート読み込みの項に以下を追加。
	if ($cf{rss_make} == 1) {
	$tmpl =~ s|<!-- rss -->|<a href="$cf{rssurl}"><img src="$cf{cmnurl}/rss.png" class="icon"></a>|;
	}
 そしてテンプレートのbbs.htmlの上部に<!-- rss -->と書き加えておけば、RSS出力先のindex.xmlへリンクの付いたアイコンが表示される。

 まあこれで新規投稿時にはRSS配信ができるようになった。
 で、仕上がった掲示板を見ていると、ふと思う。投稿の際に入力する暗証キー(ようはパスワード)、入力しても黒丸マークがでるだけで文字は見えない。入力ミスだってあるだろうし、入力した文字を表示できるようにしたら便利じゃないのかな?

9. 暗証キーを表示させる。
調べるとjavascript(ジャバスプリクト)でできるらしい。参考ページは見つかるが、それをどう掲示板に組み込めばいいんだ? javascript・・私にはPerlよりも馴染みが無い。
参考ページを見ながら、新規投稿の方はそう悩まずにできた。テンプレートとbbs.jsに書き加えればいいのか。
掲示板トップ画面および、トピック画面からの新規投稿の暗証キーを表示させるのは、cmn/bbs.jsに以下を追加。
function pushHide() {
		var txtPass = document.getElementById("textPass");
		var btnPass = document.getElementById("buttonP");
		txtPass.style.paddingtop='10px';
		btnPass.style.paddingtop='10px';
		if (txtPass.type === "text") {
		txtPass.type = "password";
		btnPass.value = "暗証キーを表示";
		} else {
		txtPass.type = "text";
		btnPass.value = " 非表示にする  ";
		}
		}
で、bbs.htmlやtopic.htmlの新規投稿部分の暗証キーの
<input type="password" name="pwd" class="reg-num" maxlength="8">
の部分を以下に変える。
<input type="password" id="textPass" name="pwd" class="pass">
<input type="button" id="buttonP" value="暗証キーを表示" onclick="pushHide();"><br>

 しかし、掲載された親記事やレス記事の修正・削除の時に悩む。ウンウンうなって試してみるが、上手く行かない。ここは息子にヘルプしてもらう。前回、私がエラーで唸っていた頃「私はPerlは知らないからなぁ」と横で眺めていた息子だが、javascriptなら助け舟を出せる。ねー、ここをこうしたんいんだけど。
 んー、と私の示した参考記事を眺め、私の失敗したjsコードを見ながら「これはこの2行はいらないよ。この1行で・・など言いながらjsコードを修正してくれた。
jsファイルに追加。
function getId(ele){
	var bota = ele.id;
	var ban="ban"+bota.substr(4);
	var txtPass = document.getElementById(ban);
	var btnPass = document.getElementById(bota);
	if (txtPass.type === "text") {
		txtPass.type = "password";
		btnPass.value = "キーを表示";
	} else {
		txtPass.type = "text";
		btnPass.value = "キーを非表示";
	}
}
bbs.htmlのループ部分、前回で追加したところ、
<input type="hidden" name="no" value="!num!">
暗証キー <input type="password" name="pwd" size="4" maxlength="8">
<input type="submit" value="送信">
これを以下に変える。res.htmlについても同じ。
<input type="password" id="ban!num!" class="bango" name="pwd"><br>
<input type="button" id="bota!num!" class="botan" value="キーを表示" onclick="getId(this);">
 できた! 息子よ、ありがとー! 彼が大学生の時はWEB課題で簡単なCSSでつまづいていた時に私が教えたけど、今や私が教わる立場である。
キー入力欄のサイズについてはCSSで指定してほしい。

 そんなこんなで、なんとか改造終了。テストのためのローカル環境の掲示板のアクセスカウンターは900を超えてた。つまり私の試行回数。ちょっといじっては確認し、エラーしては直し、を繰り返すとそんな回数になってしまうわけだ。

そんなこんなで仕上がった はこちら
 スパムよけのため、aタグの直リンクでなくjavascriptリンクにしている。

 しかしこれで終わりにならなかった。十数年ぶりにスパム投稿が来た。
(まだ続くのか)

2021.3.23追記:気づいた。過去ログの親記事は文字色が黒だが、レス記事は指定文字色になってる。オリジナルを確認すると、
#過去ログ画面 の713行目あたり$restmpl;(レス記事)
$tmp =~ s/!comment!/<span style="color:$col[$col]">$com<\/span>/g;
723行目あたり$loop;(親記事) $tmp =~ s/!comment!/$com/g;
となっていた。レス記事のみ文字色が指定されている形。
私は今までのログを合体させているので、以前の掲示板からの色味変更なども考え、$restmpl;の箇所を$loop;と同じにしてレス記事の色を抜いた。
逆に親記事にも文字色を残したいなら、ループ部分をレスループと同じようにすればいい。

ありがたく参考にさせていただいた
 Kent Web さんの
 Joyful Note
 Topics Board

【JavaScript】ボタンクリックでパスワードを表示・非表示を切り替える

 JavaScriptでidを取得する方法

 WEBサイト・ブログの為のHTMLソースコード変換