2005.02.13

Text-formatter・・・(Movabletype)

通常文章を書くときはテキストフォーマットは「改行を変換する」を選ぶ。
もし、「なし」を選ぶと自分で文章中の改行したいところに<br>を挿入しておかなければならないので大変不便である。
ところが、プログラムソースを貼り付けて示したいときは一行毎に<br>が入って間が抜けた表示になり甚だ具合がわるい。
それで、<pre>と</pre>で囲めば改行を入れないようになると思って、<pre>の自動挿入アイコンも設けたが、どうもうまく機能しない。
テキストのフォーマットは/lib/MT下にあるUtil.pmで行っているが、調べたら空白行毎に切って処理しているので空白行があると<pre>と</pre>で囲まれた領域であるのを忘れてしまうようになっている。
ネットを調べると同じ悩みに行き着いた御仁がいらっしゃるようで、ちゃんと解決法が書かれていた。
$prefagという変数を追加して<pre>がでてきたら</pre>が出てくるまで状態を覚えておこうと言うものです。
早速使わせていただいたが、これでも記述部分にhtmlのタグがでて来るとBrowserが反応してしまうので&gt; &lt;(&は便宜上全幅で書いています)を用いてescapeしてやる必要がありますが、快適です。
以下の赤字部分がUtil.pmの修正部分です。

sub html_text_transform {
my $str = shift;
$str ||= '';
my @paras = split /r?nr?n/, $str;
    my $preflag = 0;     # add var
for my $p (@paras) {
       if($p =~ m@<pre@){   $preflag = 1;  } # add pre check.
if (!$preflag and  $p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table
|ol|dl|ul|menu|dir|p|pre|center|form|fieldset|select|blockquote
|address|div|hr)@) {
$p =~ s!r?n!<br />n!g;
$p = "$preflag<p>$p</p>";
}
if($p =~ m@</pre@){  $preflag = 0;  }
}
join "nn", @paras;
}

2005.02.06

post2blog・・・(Movabletype)

携帯電話を含めてメールからBlogが書き込めるツールとして、post2blogを使わせていただいている。
post2blogの載っているサーバ以外のBlogにも書き込めるという優れものだし、無駄のない素晴らしいコードです。
まず、以下のpackageを入れておく。

(1) packageのdevelからp5-POE-Component-Server-XMLRPC
(2) graphicsからp5-Image-Info

これで、動くが、以下のような2つの改造を加えることとした。順次示す。
なお、最後に私が作った修正版を以下に載せて置くのでご希望の方は自由にご利用ください。
(1) 投稿可能なメールアドレスを規定

オリジナルなpost2blogは受信するためのメールアドレスが漏洩すると誰でも書き込み可能である。
厳密に守る必要も無いとは思うが、受け付けるメールアドレスを規制したいと思い以下を追加した。
まず、最初の部分に@authadresの記入を追加。 ここに許可するメールアドレスを”,”で区切って書いておく。 それとflag用の変数$authを宣言。

my $url = 'http://TARGET/URL/DIRECTRY/MT/mt-xmlrpc.cgi';
# CGIPath + 'mt-xmlrpc.cgi'
my $blog_id = 8;
my $username = 'USERNAME';
my $password = 'PASSWORD';
my $MT_DIR = '/YOUR_DIRECTRY_TO/mt/';
my $parse_path = '/tmp/post2blog';
my @authadrs = ('abcd@xxxx.yyyy.com','aabbcc@yyyy.xxxx.co.jp');
my $auth;

そして、判定文を書く。
Mail Addressの取り出しは簡易な方法であるが、厳密に行いたいなら正規なmail_regexを利用するのが良いが、単純に自分が設定したアドレスだけが取り出せれば良いので、これでも十分だろう。

if($from =~ /([-,0-9,a-z,A-Z,-,_,.]+@[-,0-9,a-z,A-Z,-,.]+)/){
foreach (@authadrs){
if($_ eq $1){$auth = 1;}
}
}
if($auth != 1){print "Not authorized mail address : $fromn";exit;}

(2) サムネイルの作成

post2blogでは画像はサムネイルを作らず、オリジナルの画像を表示の”width”と”height”を指定することで横幅を330pixで表示している。
これでも表示上は問題ないが、Blogのページを表示するのに元の大きな画像ファイルを読み込むことになるので、たくさんの画像を貼り付けたページでは表示速度が遅くなる。
この改良のため、横幅が330pixel以上の画像はサムネイルを作ることとし、さらに横幅が800pixel以上の画像は元の画像も800pixelに縮小した(これは好みの問題でもあろう)。

use Image::Size;
use Image::Magick;
foreach my $fileref (@attachs) {
my ($file, $orgfilename) = @$fileref;
my ($filename, $filepath, $suffix) = fileparse($file,
'.(jpe?g|gif|png)');
##################################
       $mkthumb = 0;
my ($imgx, $imgy) = imgsize($file);
if($imgx > 330){$mkthumb = 1;}
if($mkthumb == 1){
$thumbfile = $filepath . 'tn_' . $filename . $suffix;
my $i =  Image::Magick->new;
$i->Read("$file");
$i = $i->Transform(geometry=>330);
$i->Write("$thumbfile");
undef $i;
my ($imgx, $imgy) = imgsize($file);
if($imgx > 800){
$i =  Image::Magick->new;
$i->Read("$file");
$i = $i->Transform(geometry=>800);
$i->Write("$file");
undef $i;
}
}

画像のサイズ変更はImageMagickのmoduleを使用した。
なお、変数の$mkthumb, $thumbfileなども最初の部分に宣言を入れておく必要がある。
そして、サムネイルを作ったときは、これもBlogに転送する必要があるので以下を追加。

        close(BIN);
my $ret = $rpc->call('metaWeblog.newMediaObject',
$blog_id,
$username,
$password,
{
'bits' => $bindata,
'name' => $filename.$suffix
},
1
);
   if($mkthumb == 1){
($thumbfilename, $filepath, $suffix) = fileparse($thumbfile,
'.(jpe?g|gif|png)');
open(BIN, $thumbfile);
$bindata ="";
while (<BIN>) {
$bindata = $bindata.$_;
}
}
$returl = $ret->result->{url};
        close(BIN);
$ret = $rpc->call('metaWeblog.newMediaObject',
$blog_id,
$username,
$password,
{
'bits' => $bindata,
'name' => $thumbfilename.$suffix
},
1
);
#print Dumper $ret->result;
#print Dumper $ret->fault;
      if($mkthumb == 1){
$tnreturl = $ret->result->{url};
}
      if ($returl =~ /.jpe?g$/i) {
my $info = image_info($file);
if (ref $info) {
my @lats = $info->{GPSLatitude};

そして、最後に画像へのリンク方法を修正する。

        if ($returl =~ /.(jpe?g|gif|png)$/i) {
           if($mkthumb != 1){$tnreturl = $returl;}
$description = "<a href="$returl">
<img src="$tnreturl" alt="$orgfilename" border="0"></a>
<br/>$description";
} else {
$description = "<a href="$returl">$orgfilename</a>
<br />$description";
}
}

最後に私が作った修正版を以下に載せて置く。
Download file


2005.02.03

Movabletype 画像枠線の削除・・・(Movabletype)

1. 画像の枠線の削除

Movable Type 3.122に入れ替えたら、画像の枠線が付いている。
2.66のときはついていなかったので、同じにしたいと思って調べたら、以下のところをを修正すればよい事がわかった。

mtディレクトリー内の/lib/MT/App/CMS.pmを修正

HTML
} elsif ($q->param('include')) {
(my $fname = $url) =~ s!^.*/!!;
if ($thumb) {
return <<HTML;
<a href="$url">
<img alt="$fname" src="$thumb" width="$thumb_width"
height="$thumb_height" border="0"/></a>
HTML
} else {
return <<HTML;
<img alt="$fname" src="$url" width="$width" height="$height"
border="0">

ついでに、最近mail-entry.cgiから乗り換えて使わせてもらっているpost2blogにもborder=”0″を追加しておこう。

$description = "<a href="$returl"><img src="$returl" width=
"$imgx"height="$imgy" alt="$orgfilename" border="0"></a><br/>
$description";

2. 編集ボタンの追加

おー、今度はMozillaでもエントリーBodyの記入枠の上にBold, Italic, Undeline, Link, Blockquoteなどの挿入アイコンが付く。
ファイルのアップロードが新設されたのも便利に使えそうだ。
あとは、Preを付けておくのだが、今回は簡単で・・・mt/tmpl/cms内のedit_entry.tmplをQuote(blockquote)の記述をコピーして追加しQuoteをPreに’blockquote’を’pre’とするだけでよい。
2箇所ある。

        write('<a title="<MT_TRANS phrase="Pre">"
href="#" onclick="return formatStr(document.entry_form.text,
'pre')"><img src="<TMPL_VAR NAME=STATIC_URI>
images/html-pre.gif" alt="<MT_TRANS phrase="Pre">"
width="22" height="16" /></a>');

ついでに赤字を指定する”Red”も付けておこう。
しかし、赤字は閉じるタグは開始タグに”/”をつければ良いとは行かない。
<font color=#ff0000>文が入る< /font>としなければならない。
結局mt.cgiと同じディレクトリにあるmt.jsに以下のようなformatStr2を追加した。

function formatStr2 (e, v) {
if (!canFormat) return;
var str = getSelection(e);
if (!str) return;
setSelection(e, '<' + v + '>' + str + '</font>');
return false;
}

これで準備が整ったのでedit-entry.tmplに以下を追加する。
formatStr2にして、新しくmt.jsに追加したfunctionを呼んでいるのに注意。

write('<a title="<MT_TRANS phrase="Red">" href="#" onclick="return
formatStr2(document.entry_form.text, 'font
color=#ff0000')"><img src="<TMPL_VAR NAM
E=STATIC_URI>images/html-red.gif"
alt="<MT_TRANS phrase="Red">" width="22" heigh
t="16" /></a>');

2005.01.30

Movabletype 3.122への入れ替え・・・(Movabletype)

いままで、Movable Typeの2.66版を使っていたが、UTFでメールを送るとデータベースが破壊されて回復不能の致命的な状態に陥ることがある。
わたしも、やってしまってバックアップしていたのを用いて回復させたことがある。
最近のものは直っているらしいので3.122版に入れ替えた。
しばらく、使ってみたりテストしないと直ったか否か分からないが・・・


2005.01.23

MajordomoのSequencerの改造(2)・・・(mail)

またまたまた、Majordomoの改造の話です。
sequencerを改造してOutlook Expressでもメールシーケンスの重なりを起こらないようにしたが、Eudoraでは重なりが起こる事が分かった。

EudoraのSubjectはSubject:のWordの直後に改行が入るので、最初の方法ではシーケンス番号を取り除けない。

Subject:
=?ISO-2022-JP?・・・

のようになっているので、Subject:行の次の行もmimedecodeしてmimeencodeしシーケンスを取り除く必要がある。
Subject:行の次の行も処理すべき対象か、それ以外の行かは、mimeencodeされた行には=?が現れる事で判別しているが、Subjectの継続行以外でmimeencodeされている可能性はFrom, To, Reply行であるので、これらは除く。 
また、メールの本文中にシーケンスの重なり除去のアルゴリズムに引っかかるものが存在すると困るのでシーケンス番号の除去はメールのheader部だけに作用させるようにした。
これらの条件を考慮した結果が次である。

$in_header = 1;
while (<STDIN>) {
     if ($in_header){
if (/^s*$/) {$in_header =0 ;}
if (/^Subject:/ || (/=?/ && !/From|To|Reply/)) {
$_ = &mimedecode($_);
$_ = &mimeencode($_);
s/[rR][eE]:.*[([].*d+[)]]/Re:/;
s/[rR][eE]:s*[rR][eE]:/Re:/g;
           }
}
#############################################
if(/out-of-the-office/i){$taboo = 1;}
############################################
print IN $_;
}

どうも、スッキリした方法では無いですね。
誰か、良いアイデアがあればお教えください。


« Previous | Next »