| ChangeLog 最新ページ / カテゴリ最新ページ / 1 2 次ページ / page 1 (2) |
単一行化[2004-05-10-2]の際に余分に改行が除去されてしまっていたのを修正。
sub okikae {
:
#print "1[$_]\n";
## 2004-05-10 bills : 単一行モード
## 2004-05-24 bills : 単一行化終端判定の先読み指示の括り出し(不要な改行の丸めを抑止)
## begin
s!^ (.+?)(?=\s*(^$|\z| ))!make_single_line($1)!gsme if ($single_line_mode);
## end
s!$!<br>!gsm;
s!<br>$!!;
#print "2[$_]\n";
:
}
先日来のチャレンジ[2004-05-13]空しく、TrackBack支援環境の作成をあきらめました。|||heading|||
とりあえず「トラックバックのスタンドアローン実装(リンク先はmiyagawaさんによる日本語版)」内に、そもそもPingerがあることに(よく考えたら当たり前)軽い挫折感を覚えつつ、それに手を入れてTrackBack POSTフォームにインラインフレーム(iframe)を設け、そこにトラバース元の日付・アイテムインデックス情報から割り出した日付ページを表示しました。
そしてiframe内のドキュメントから抽出したタイトルや本文等のTrackBack情報をJavaScriptで抽出し、フォームに転記しようと先日の書きかけBookmarkletを移植しつつ作業をすすめました。
ところがBookmarkletの時とは違って思うようにHTML構造がトラバースできない…どうやらiframeが絡むとうまくいかない模様。DOMをあきらめIEのDHTMLオブジェクトに手を出したりと粘ったのですがうまくいかず、そふぃあさんのサイトのフラグメント参照解説を見て、IEのDHTMLフレームコレクション参照→DOM参照でたどれるという情報にそんなもんわかるかっと今更ながらIEに悪態をつきつつ、なんとかiframe配下のオブジェクトまで辿りつきました。
その後やり方が悪いのでしょうが、うまくトラバースできず、結局あきらめました。素直にiframe内に表示した記事からコピペしてTrackBackすることに。
いやもうバッドノウハウ全開ですな。
参考にした資料
- ウェブログ入門 - BloggerとMovable Typeではじめる
- JavaScriptデスクトップリファレンス
- JavaScript::Bookmarklet
- トラックバック技術仕様書
- Document Object Model (DOM) Level 2 Core Specification Version 1.0
- Document Object Model (DOM) Level 2 HTML Specification Version 1.0
- Standard ECMA-262 ECMAScript Language Specification 3rd Edition
- HTML and DHTML Reference (MSDN)
- フラグメント参照
見出しモード[2004-05-10]がchalowのリンクマークアップ(ブラケット2個)の処理と干渉し、アイテム内にリンクが存在すると変な風にレンダリングされてしまうため、とりあえず他の文字(|:縦棒)に変更しました。
根本的に見直さないとだめですね。
TrackBack bookmarkletを作ろうとしました。
bookmarkletどころかJavaScript(ECMAScript)自体ほとんど初めてなので、しょっぱなから苦労しつつ、DOMでなんとかHTMLの要素を抜き出せるようになってきたところ…bookmarkletの長さ制限にぶつかってしまいました。
切り詰めても収まりそうになく、あきらめてCGIにリダイレクトして、HTML内のJavaScriptから別フレームに読み込んだトラックバック対象エントリを参照するように方針転換することにしました。
ぐぐっていると、IE6ではbookmarkletの最大長は508bytesという情報を見たのですが、自分の環境では255bytesで切られます。セキュリティパッチとかで最近は短くなったんでしょうか?
いいかげん「びるず雑記 by chalow」じゃなくて「びるず雑記 for chalow」のようになってきましたが、手段が目的と化するのはいつものことなので、気にしないことにします。
とりあえず単一行モード[2004-05-10-2]のマークアップは'__'にしなくても' '(いわゆる全角空白)で済むので、変更。
コメントやトラックバックをアイテム毎にしたりいじっているうちにデフォルト状態ではHTMLコメント<!-- -->の形でauthor等が漏洩(おおげさ)してしまうようなのでcl.confからそれらを外す。
トラックバックがひとつも無い状態では「トラックバック()」となんかマヌーな感じなので0を表示するスクリプトを強制出力。
スクリプトが既に存在する場合には上書きしないようにしています。
運用環境と生成環境を別にしている場合は、ファイル転送時に日付比較をするなど注意する必要があります。もっとも上書きしてしまってもトラックバックエントリ(<TrackBackID>.storというファイル)は残っているので手間はかかりますが復元可能です。|||heading|||
自分のカスタマイズではアイテム毎にトラックバックを置いたのでアイテム毎にスクリプトが実行され、表示がもっさりしてしまいました。
トラックバック(0)強制出力
### HTML 生成のためのループ
foreach my $ymd (sort keys %all_entries) {
:
my $this_item = $t->output();
## 2004-05-11 bills : 0トラックバック生成
## begin
make_trackback($item_id);
## end
:
## 2004-05-11 bills : 0トラックバック生成
## begin
sub make_trackback {
my ($tb_id) = @_;
my $target_path = "$outputdir/$trackback_generate_path/$tb_id.js";
unless (-e $target_path) {
my $content = qq{document.write('0');\n};
output_to_file($target_path, \$content);
}
}
## end
(別途$trackback_generate_pathをコンフィグ対象変数として定義。値は'tb/tb_data'など)
0.24にカスタマイズした単一行モード[2004-05-08-2]を移行。
ついでに単一行クラスタ間に空行が無くてもいいように修正。|||heading|||
プラグイン化はちょっとプラグインの記法と異なるので保留。
制御構造の記法やコメント記法は試行錯誤中のため先日と変化しています。
sub okikae {
:
## 2004-05-10 bills : 単一行モード
## begin
s!^ (.+?)(^$|\z|(?=\s* ))!make_single_line($1)!gsme if ($single_line_mode);
## end
s!$!<br>!gsm;
s!<br>$!!;
#print "2[$_]\n";
:
}
## 2004-05-10 bills : 単一行モード
## begin
sub make_single_line {
my ($line) = @_;
$line =~ s!\n!!gsm;
return " ${line}";
}
## end
(別途$single_line_modeをコンフィグ対象変数として定義)
0.24にカスタマイズした見出しモード[2004-05-08-3]を移行。
ざっとソース眺めたときに該当部分があまり変わって無いように見えたので、「へへーん」と思ったら...|||heading|||ちょっと悩みました(^^;
表層のアドホックな対処なので、もっとデータソースに近い部分に手を入れればいいような、またはHTML::Templateの方で対処したほうがいいような気がしますが、深追いは次の機会にとっておくことに。
またカテゴリ毎の出力(write_category_page())への対応が抜けているため制御文字列\[\[\[heading\]\]\]が無様に残ってしまいます。
制御構造の記法やコメント記法は試行錯誤中のため先日と変化しています。
sub write_day_page {
:
$t->param(next => $day_after);
## 2004-05-10 bills : 見出しモード
## begin
## $t->param(content => $month_page{$ym}{$ymd}{str});
$t->param(content => remove_heading($month_page{$ym}{$ymd}{str}));
## end
my $ostr = $t->output();
:
sub write_month_page {
:
## 2004-05-10 bills : 見出しモード
## begin
## my @contlist = map } @cont;
my @contlist = map @cont;
## end
### ページの組み上げ
:
sub write_index_page {
:
# $top_n_str .= $month_page{$ym}{$ymd}{str};
## 2004-05-10 bills : 見出しモード
## begin
## push @top_n_entries, {content => $month_page{$ym}{$ymd}{str}};
push @top_n_entries, {content => make_heading($month_page{$ym}{$ymd}{str}, $ymd)};
## end
}
my ($ymd, $ym, $d) = ($recent[0] =~ /^((\d{4}-\d\d)-(\d\d))$/);
# 日付リンク一覧
:
## 2004-05-10 bills : 見出しモード
## begin
sub make_heading {
my ($str, $ymd) = @_;
if ($heading_mode) {
my $url = datestr2url($ymd);
$str =~ s!\[\[\[heading\]\]\].+?</p>![<a href="${url}">全部読む</a>]</p>!gsm;
}
return $str;
}
sub remove_heading {
my ($str) = @_;
$str =~ s!\[\[\[heading\]\]\]!!gsm if ($heading_mode);
return $str
}
## end
