2007年09月

2007/09/01 00:45

今度こそ、空行・blockquote・pre・code対応のhtml_text_transform完成

事の顛末

まず、気軽に「html_text_transformをblockquoteとcodeに対応させる」と言った感じで、mt/lib/MT/Util.pmにあるhtml_text_transformをいじり始めたのがきっかけです。と言うのも、<blockquote>の不具合は知っていたから修正したのです。これをすれば、空行がある<blockquote>でも大丈夫だと何故か勘違いしていたのがまずかった。。見事に、html_text_transformにはまる。。

でも、がんばって何とかその日(土曜日)の夜には空行ありのblockquoteやcodeなどに対応したhtml_text_transform完成!させました。もうこりごりといった感じです。

しかし、ふとしたタイミングで、Validatorしちゃいました。

character data is not allowed here.

You have used character data somewhere it is not permitted to appear. Mistakes that can cause this error include:
putting text directly in the body of the document without wrapping it in a container element (such as a <p>aragraph</p>), or
forgetting to quote an attribute value (where characters such as "%" and "/" are common, but cannot appear without surrounding quotes), or
using XHTML-style self-closing tags (such as <meta ... />) in HTML 4.01 or earlier. To fix, remove the extra slash ('/') character. For more information about the reasons for this, see Empty elements in SGML, HTML, XML, and XHTML.

んあ?<blockquote>の中に文字データはおけないよって言われた!!になりました。え、そうなの?と思って仕様を確認すると、Transitionalでは文字データおっけーなのですが、Strictの場合は文字データえぬじーなのです。あう。

てかまぁ、よくよく考えてみたらその通りですよね。<blockquote>はあくまでもblockquoteだし。

と言うことで、<blockquote>の内部にもhtml_text_transformしてあげなければいけません。今までだと、<br />のみの付加でしたからダメダメです。ごめんなさい、プライベートだけStrict大好きなのです。パブリックはTransitionalじゃないと仕事になりませんけどね。みなさまtarget="_blank"大好きだから。

まぁ、ごにょごにょとコードを書き足しまして、完成しました。今度こそ。このエントリーでも<blockquote>を使っているのでソースを表示していただければどうなっているのか分かると思います。と言うか、html_text_transformの確認用エントリのソースと、実際のEntryBodyの内容を見た方がいいかも?ごちゃごちゃさせすぎかもだけど。

10行程度だったhtml_text_transformですが、いつの間にか80行くらいになっていたよ(; 行き当たりばったりで書いていったプログラムだったので無駄が多いのですけど。効率よくすれば70行くらいになるかな。。

てか、致命的な問題が一つ残っているんだけど、それはその場面に出会ったら修正しよう。。

2007/09/01 12:54

やっとmixiでも更新されました。。

おせーよ・・・。

mixiに外部ブログがなかなか反映されないのでいろいろと調べてみましたけど、アレでした。Atomだとどうやら無理っぽいです。なので、mixi用にRDFで配信をしたらうまくいきましたとさ。ちゃんちゃん。

でも、いい機会でした。AtomなXMLをみたら汚い汚い。とりあえず綺麗に整形しました。で、Feed Validatorもしました。エラーが出ました。とりあえず修正しました。なんかAtom(XML?)は内容に&gt;とかがあるだけでもtype="html"にしなきゃみたいなの?よくわかんないけど。そんなエラーが出ました。

RDFは本当にmixi用でしかないのでタイトル配信です。一般公開はしません(でも定番のファイル名なわけですけど・・・)。RSSの配信フォーマットが次世代DVD以上にいっぱいあるけど、さまざまで配信している理由ってあるのかな。なんか僕には、HTML 4.01、XHTML 1.0、XHTML 1.1でWebを公開中!って言っているみたいでなんか好きじゃないよ。

僕がAtomを選択した理由は、今後のことを考えてですね。mixiはRSS 2.0やらAtomにも対応した!とか記事をみたけど、対応してないのね。でも、先日書いたmixiのRSS FeedではAtom配信なんだよねー。なんなんだか。

とりあえず、mixi経由のみなさま。ご迷惑をお掛けしました。とりあえず、8月中旬のエントリーから過去ログをどうぞ

2007/09/01 18:32

links for 2007-09-01

2007/09/01 23:59

新宿へ

仕事ではないですよ。もちろん。昨日飲みに行く約束だったけど、今日になりましてー。最初はスペイン料理に行くもなんか合わなかったのさ。もちろん、gerryですね(ぇ

てか、スペインってワインなのね。ワインなんて洒落たドリンクは飲めないので、写真のビールを飲みましたよ。読み方は忘れた。味は何か別にーでした。やっぱり今までで一番はトルコのエフェスですね。

料理も別にーな感じ。海鮮ばっかり。肉が高い高い。まずくはなかったよ。けど、トルコやインドのがおいしい。店員もイマイチだだったし。

と言うことで、ビール1杯で移動してしまいましたとさ。ちゃんちゃん。

その後はあまりにも普通なお店だったので書くこともないんだけど、やたらと話してたからあっという間。んー、久しぶりだからかな。楽しかったなぁ。

今年、初めて誕生日プレゼントをもらいました。いまさらですけど。ありがとうございましたー。

今日は早くに起きてお買い物に行く予定だったのになぁ。早くに起きたけどダラダラし続けてなかなかの無駄っぷり。しっかり生きないとなぁ。

あーあ、残業とか別にいいけどしっかり評価してくれる会社に行きたい(またそれかよ

2007/09/03 15:15

Movable Typeのカテゴリー・アーカイブ、日付・アーカイブとエントリー・アーカイブの見出しレベルの調整

「エントリー・アーカイブ」と、「カテゴリー・アーカイブ」「日付・アーカイブ」では、本文の見出しレベルが異なってくるよね?というお話。

見せ方次第なんですけど、カテゴリーやら日付アーカイブでエントリーの内容(MTEntryBody)を表示させちゃうと、見出しレベルが怪しくなるのです。あ、本文に<h2>とか使わないなら別に問題はないです。

要は、見出しレベルの付け方の問題で、エントリーでは、

<h1>エントリーのタイトル</h1>
<p>エントリーの内容<p>

なんですけど、カテゴリーと日付アーカイブでは、

<h1>カテゴリー・日付のタイトル</h1>
<h2>エントリーのタイトル</h2>
<p>エントリーの内容<p>
<h2>エントリーのタイトル</h2>
<p>エントリーの内容<p>
<h2>エントリーのタイトル</h2>
<p>エントリーの内容<p>

になりますね。

そうすると、エントリーの内容(MTEntryBody)に書いた<h2>や<h3>などの見出しレベルがおかしいよねーになる。これを修正しなきゃいけません。

いろいろ探し回ったけど、あんまり見つからなかったけど、唯一見つかったのが「ISO-HTML準拠MovableTypeテンプレート : 雑記帳 : der Gegenwart」です。探し方が悪いのかな。。

解決方法は、Regixプラグインを入れると言うことです。
Six Apart - Movable Type プラグインディレクトリ: Regex

これは、正規表現をMovable Typeで実現するものです。あの忌まわしいhtml_text_transformで戦った正規表現の再来です。自ら招いているんだけど。というか、正規表現は信じられないくらいに便利です。とっつきにくいかもだけど、慣れてしまえば何も難しいことはないです。たぶん。んー、HTMLやらCSSのが奥が深くて難しいと思うけど。

プラグインの使い方はSix Apartのページが詳しいです。分かりやすいです。ただ、最後の書き方では正規表現に「$」を使用することはできません。$1などを使用したい場合は<MTRegexDefine>で事前に定義してください。ってトコがちょっと冷たいけど、正規表現で置換とかするときによく使います。

いままで、Melanges(このブログね)は http://melanges.kuma.nu/060822225338.html こんな感じのアドレスでした。いまは、 http://melanges.duck.nu/2006/08/22_225338.html です。これを正規表現で置換するときに、
検索http://melanges.kuma.nu/([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{6}).html置換http://melanges.duck.nu/20$1/$2/$3_$4.phpと出来るのさ。って、詳しくは他のサイトでどうぞ。言語やアプリケーションでもちょっと異なるし。つまり、この$を使うときは、<MTRegexDefine>を使えってことです。

余計なことを書きすぎた。。。

で、本編。

僕はエントリーアーカイブ中心にエントリーの内容(MTEntryBody)を書いていっているので、<h2>を<h3>に<h3>を<h4>に・・・と置換していきたい感じです。それを正規表現で書く。

<MTRegexDefine name="regex_h6e">s|</h6>|</p>|g</MTRegexDefine>
<MTRegexDefine name="regex_h6s">s|<h6>|<p class="h7">|g</MTRegexDefine>
<MTRegexDefine name="regex_h5">s|<(/?)h5>|<$1h6>|g</MTRegexDefine>
<MTRegexDefine name="regex_h4">s|<(/?)h4>|<$1h5>|g</MTRegexDefine>
<MTRegexDefine name="regex_h3">s|<(/?)h3>|<$1h4>|g</MTRegexDefine>
<MTRegexDefine name="regex_h2">s|<(/?)h2>|<$1h3>|g</MTRegexDefine>

これを適当なトコに書いて、(わかりやすいとこがいいから、僕は<h1>の下に書いてみた)<$MTEntryBody$>を以下のように書き換える<$MTEntryBody regex="1"$>

こんな感じです。<h6>をどうするかは、ご自由に変更してください。あと、最初にh2→h6の順番で置換していったら、全部<p class="h7">になって焦った。。順番に置換していってしまうみたい(当たり前か)なので、h6→h2の順番で書いていかないとね。

あとは、適当にこんなのとか。<MTRegexDefine name="smile">s|:\)|&#9786;|g</MTRegexDefine>:) を ☺ に置換してくれます。たぶん。。

そんな感じ。

2007/09/03 18:08

ダブルスクロールバー + JavaScriptエラー

いまさら気がつきました。Windows ieでの確認は怠りまくりんぐ。申し訳ない。帰ったらなおします。たぶん。。

2007/09/03 18:29

links for 2007-09-03

2007/09/03 18:41

社長より遅く来て、早く帰る

だって、暇なんだもん。ぎぶみーあじょぶ!!(あでいいの?ざ?

携帯から投稿すると文字数制限に悩まされるんだね。こんばんわ。

今日から始まる一週間。始まりは大抵月曜日。なかなかのイジメです。そして、iPodでランダム再生したら、Syrup16gの「土曜日」。さらなるイジメ?土曜日なんてくるはずないー♪聴いてる僕がいけないのですけど。

iPodってたまにむかつくランダム再生をするし、アレが聴きたいなんて思ったりするとランダムでもその曲を流してくれたり、長年付き合ってるだけあってお利口さんです(偶然だって

今日は帰り道にお茶の水でも行ってエフェクターでも買いに行こうなんて思っていたけど、駅に着いたら北行きの京浜東北線に乗ってました。そんなもんだよね。お茶の水ついでに、秋葉原の秋月電子にも行こうと思ってたんだけど、思っただけ。いつものこと。

そんなこんなで非充実した日々を送り何だか腐ってきました。

いや、楽しみはあるのよ。バンドとか楽しみだし、ギターとか弾いてると楽しいし。でも、何だかなぁ。この無気力っぷり。

冒頭に書いた通り、仕事がアレだからダメなのかな。

人間てさ、忙しいと暇が恋しくなり、暇だと忙しいのがいい、なんて思う贅沢な生き物だよね(引用元: 忘れた

仕事をくれぇ

2007/09/04 10:31

Movable Typeで、いま見ているエントリーを編集する Bookmarklet

参考文献
いま見ているエントリーを編集する Bookmarklet - bricklife.weblog.*

エントリー数が増えると意外とやっかいなので、なんかいい方法はないかなぁと探していたらいいものみっけた。結構古い記事でしたけど、僕はMT3.35なのであんまり問題がなかったよ。

以下が元記事のJS。

javascript:var id=document.comments_form.entry_id.value
location.href='http://your.mt/path/mt.cgi?__mode=view&_type=entry&id='
+ id + '&blog_id=1'

えー、なんで ; (セミコロン)がないの?とか思ったけど、あと、なんでfontタグを使っているの?とか。。そんなのはまぁいいとして、別Windowで開きたかったので書き換えましたよ。(僕はSafariStandで新規ウィンドウをタブで開くに設定しているのです)

と言うことで、書き換えたブックマークレットjavascript:void(window.open('http://www.sample.com/mt/mt.cgi?__mode=view&_type=entry&blog_id=1&id='+document.comments_form.entry_id.value));

http://www.sample.com/mt/mt.cgiは適当に変更して、blog_id=1も適当に変更する。

致命的な問題として、コメントのフォームからentry_idを取得しているので、document.comments_form.entry_id.valueはいじいじする必要がある人ももちろんいるし、entry_idが取得できない場合、この方法はダメですね。

2007/09/04 18:18

skEdit コードナビゲータ(Code Navigator)を有効に使う

COULD: skEdit 3.6で長谷川さんが言及していますがそれ以上のエントリーがなかなか出てきません。。skEdit + SVN(Subversion)の回でも書きましたけど、やっぱりユーザ数が少ない上、みんなさらりとこなしてしまっているのかな、と思います。

今回は、コードナビゲータを有効に使用する方法を説明します。あくまでも、私見ですので、使いにくい!と思われる方もいらっしゃるかもしれません。

コメントを表示するコードナビゲータ

上記で紹介した長谷川さんのCSSコメントをコードナビゲータに表示させる方法はいくつか問題があったりします。それは、

  • コードナビゲータに表示させたくないコメントまで表示されてしまう
  • コメントを使用したCSS Hackまで表示されてしまう

などが挙げられます。これらを解決する方法は、skEditのコードナビゲータ用のコメントを書くしか手段はありません。CSS Hackだけ表示させない、なども可能ですが、セパレータとして、/* ------------------------------------------ */と記述したいときに、困ってしまいます。

skEditのコードナビゲータ用のコメントですが、書き方は何でも構わないと思います。僕は、/** skEditのコードナビゲータ用のコメント */としました。最初のアスタリスクを2つ並べています。これが一番スマートかなぁ、と思いました。

このようにskEditコードナビゲータ用コメントのガイドラインを決めたら、正規表現を記述すればいいことになります。skEditの正規表現で( )を使用した場合、(1)に入ります。( ) ( )ならば(1)(2)とできます。$や\ではないですね。

トリガー:/\*\* ?([^\*]+) ?\*/タイトル:*** (1)カテゴリ名:CSS Comment説明:Shows CSS Comment (/** Comment */)

トリガー以外は自由に記述して問題ないと思います。タイトルが実際に表示されることになり、(1)部分がコメントの内容と置き換わります。僕は分かりやすいように、行頭に「*** 」を付けていますが好みで変更して構わないと思います。カテゴリ名・説明ともにあとあと分かりやすいように記述すれば問題ないと思います。

あとは、CSSでコードナビゲータ用のコメントは /** Comment */ と書くようにすれば問題ありません。うまく表示できない場合は、正規表現を疑ってみてください。

Javadocコメントを表示するコードナビゲータ

Javadocコメントについては、Googleで検索していただきたい。簡単な Javadoc の書き方など、有益なWebページは結構存在します。このJavadocコメントは、Java用のドキュメントの為のコメントだが、ある一定のルールに基づいてコメントを書くにはとてもいい見本になります。

CSSもある程度、大分類が出来るかな。それごとにファイルを分けてしまってもいいと思いますが、ヘッダー・コンテンツ・サイドバー・フッター等、全ページ一緒で数行しかないのにわざわざファイルを分けてしまっては管理が億劫で仕方ないときとかに、1つもしくはある程度の数のCSSファイルで管理することになるが、その大分類ごとにJavadocコメントを記述しておくといいかもしれません。まー、ワークフローは異なりますから、適当にどうぞ。

Javadocコメントは、@authorで誰が記述したのか、@seeでここも見ろ!など、第三者がみても分かりやすいようにするといいかもしれません。と言うか、自分しか見なくても、3ヶ月前に書いた自分のプログラム等は別人が書いたものと思っても過言ではないはずです。後々の自分のために詳しく書いておくに越したことはありません。@versionや更新日なども記述しておくのもいいかもしれませんが。そうすることで、誰がいつ更新したのがわかり、SCMと併用すれば完璧じゃないのかなぁ、なんて思うのです。

Javadocについてはこれくらいにし、実際の正規表現を書いてみます。カテゴリ名と説明は省略します。

トリガー:/\*\*\n \* ([^*]+)\nタイトル:----- (1) -----

トリガー: \* @([a-z]+) +([^\*]+)\nタイトル: (1): (2)

半角スペースとか意外と重要だったりして・・・わかりにくくてごめんなさい。
なんかよくわからいのですが、$が使えないのです。たぶん全てを1行と見なして処理してます。なので、\nで代用します。僕が間違えてたら指摘してくれると嬉しいです。

なにがオリジナルか分からなくなってきたけど、とりあえず使用しているコードナビゲータ

えー、これがあれですね。アレです。id系です。#content {}
#content #entry {}
#content .entry {}
#content p {}
こんな感じのにヒットします。

トリガー:\n#([a-z0-9_-]+) ?([#.])?([a-z0-9_-]*)?[ \n]?{タイトル:#(1) (2)(3)

class系は以下のだけ。てか、上のid系で、#content .entry {}はヒットするんで・・・.section {}

トリガー:\n\.([a-z0-9_-]+)[ \n]?{タイトル:.(1)

上の2つはcss用だけど、html用にもidにヒットさせる。
トリガー:<[a-z0-9_="' -]+id="([a-z0-9_-]+)"[a-z0-9_="' -]*>タイトル:#(1)

あと、HTMLのhnがあるけど、これはオリジナルで入っているかな
トリガー:<[hH]([1-6])[^>]*>\s*([^<]+)\s*<タイトル:<h(1)> (2)

そんな感じでした。
次回はSnippetについて書きたいなぁ、なんて思っています。
この文書も半年くらい熟成させていましたので、いつになることやら。。。