COREBlogを読む(index_html前半)

読むひと(わたし)の知識
・html、cssについてはそこそこわかる
・dtmlはほとんど知らない
・pythonはまったくわからない
・その他言語もほぼわからない

読むもの
・contentsタブで表示されるもの

pythonはさすがにいきなりは無理だと思うのでdtmlの使いかたをお勉強しようと思い立ち、まぁzopeの本とかネット上の情報とか読んで勉強するより身近なものを読んでいった方がわかりやすいだろうし今後の役にも立つかなと思ったわけで。

さっそくindex_htmlをば拝見。

まずはヘッダの読み込みですな。

<dtml-comment>

### Blog main interface ###

</dtml-comment>

<dtml-var blog_header>


dtml-varのvarは変数のvarですか。ものの本には「変数データのテキスト表現をドキュメントやメソッドの出力に挿入する」って書いてありますな。ふーむ。こういう説明ってやっぱりよくわからん…。
まぁcontentsの中にblog_headerがあるから、これがここに挿入されるんだろうって予想はすぐつきますが。

と予想した所で、ものの本のなかに衝撃的な事実を発見。

<dtml-var blog_header>は<dtml-var name="blog_header">の簡略化表現らしい!うーむ、また一つ勉強になったぞ。

dtml-varの属性はいろいろあるみたいですね。その中のひとつの属性がnameであると。でもnameとidってどう違うんだろうか…。まぁこれは今後の課題ということで、次を見てみる。



これはblog_headerと同じですな。パス。

<dtml-comment>

### banner ###

</dtml-comment>

<dtml-var blog_banner>



次はブログ本体とサイドメニューのレイアウト部分のようです。(中略その1)がブログ本体の記述、(中略その2)がサイドメニューの記述ですが、まずは全体を概観してみることに(自分が見やすいように適宜改行やスペースなど入れています)。

<table cellpadding="0" cellspacing="0"

border="0" width="100%">

<tr valign="top">

<td>

<dtml-comment>

### Content block ###

</dtml-comment>

<div id="content">



(中略その1)



</div>

</td>

<td align="right">

<dtml-comment>

### Sidebox block ###

</dtml-comment>

<div id="sidebox">



(中略その2)



</div>

<br />

<br clear="all" />

</td>

</tr>

</table>

これは基本的にhtmlなので理解はできます。テーブルを使って左にブログ本体、右にサイドメニューをもってきてるわけですな。
んでも、中略その2の後、/divがある、その次のbrが何のためのものなのかよくわからなかった。ので、これをとってしまうとどうなるか確認してみました。

brをとる前




brをとった後



なるほど。サイドメニューの方がブログ本体よりも縦長になってしまった場合、COREBlogのバナーがフッタにひっついてしまうわけですか。納得。

さて次はブログ本体の部分(中略その1)を眺めてみます。

<dtml-comment>
* set noheader,noextendlink,nocomment
to hide header,link to extend,comment and trackback
</dtml-comment>
<dtml-call "REQUEST.set('noheader',1)">
<dtml-call "REQUEST.set('noextendlink',1)">
<dtml-call "REQUEST.set('nocomment',1)">
<dtml-call "REQUEST.set('nocommentform',1)">

<dtml-unless top_days>
<dtml-call "REQUEST.set('top_days',4)">
</dtml-unless top_days>

<dtml-in "rev_day_entry_items(count=top_days)">
<dtml-var entry_body>
<dtml-else>
<div id="content">
There are no entry.
</div>
</dtml-in>

やばい…。難しい…。
とりあえずdtml-callというのが目新しい。しかもそのあとREQUEST.setほにゃららというのがまたいかにも難しそうだ…。

ものの本の力を借りると、まず
<dtml-call "REQUEST.set(いろいろ)">
というのは
<dtml-call expr="REQUEST.set(いろいろ)">
の簡略化表現らしいです。

簡略化表現でダブルクォーテーションありの場合はexpr="いろいろ"の簡略化、ダブルクォーテーションなしの場合はname="いろいろ"の簡略化というのはちゃんと記憶しておくことにする。よし。

また本によると、exprというのは評価するということらしい。評価というとピンとこないけど、たぶん計算するってことなんだろう。
この場合はREQUEST.set(いろいろ)ってのを評価することになるけど、REQUEST.setってなんやねん…。



またまた本にヘルプ〜。すると、REQUESTオブジェクトにはsetというメソッドがあって、setというのは、文字列としての変数名とその名前に割り当てる値という2つの引数をとって、web要求の間中、定義された状態を保つような変数を挿入できるらしい。
ソースのコメントにはヘッダとかコメントとかを隠すって書いてあるから、このことから予想するに、ひとつのエントリにはほんとはヘッダとかコメントとかいろいろ付属した形で保存されてるけど、index_htmlにおいてはそれらを隠すためにnoheaderとかnocommentとかいう変数に1(フラグを立てるってことか)をsetしてるんだろう。

こういうのは1を0にしてみれば確認でけるハズ。たぶん。

noextendlinkが1のとき




noextendlinkが0のとき



うーむ。noextendlinkについては変化が見られたけど、その他については変化ナス…。どういうことやろか。
まぁとりあえずnoextendlinkは予想どおりだったということでOKということにしておこう…。



さてREQUEST.set(いろいろ)についてはいちおう確認できたということにしておいて、dtml-callの方を調べてみると、これはdtml-varとほとんど同じらしい。dtml-varと異なる点は

・テキストを生成しない
・テキスト置換を実行しない

ということらしい。テキスト置換についてはよくわからんけど、テキストを生成しないというのはきっとテキストを表示しないってことなんだろう。<dtml-call expr="なんたら">というわけだから、「出力しなくていいから”なんたら”って評価を実行してくれい」ということか。
ここでは”なんたら”ってのがREQUEST.set(いろいろ)というわけだから、これを考えあわせると、

「出力しなくていいから、web要求の間、いろいろな変数に1をセットしておいてくれい」

ということなんだろう。
違ってるかもしれないけど、これ以上の理解はいまは激しく無理…。



さてそのあとはどうなってたかな。

<dtml-unless top_days>
<dtml-call "REQUEST.set('top_days',4)">
</dtml-unless top_days>


dtml-unlessというのはわかりやすいな。いってみればdtml-if-notみたいな感じかな(そんなのないけどさ)。

<dtml-unless top_days> = <dtml-unless name="top_days">

ということだから、<dtml-call "REQUEST.set('top_days', 4)>と考えあわせれば、

「出力しなくていいから、top_daysという変数が設定されてなかったら、web要求の間、これを4に設定してくれい」

ということなんだろう。また、これは当然予想できるけど、top_daysはトップページに表示するエントリの数だろう。



うを。眠気が…。あと少しだけ読んだら寝てしまおう。

<dtml-in "rev_day_entry_items(count=top_days)">
<dtml-var entry_body>
<dtml-else>
<div id="content">
There are no entry.
</div>
</dtml-in>


dtml-inてのは繰り返しだから、top_days変数に格納されてる回数だけ繰り返すということになるはずだろうけど…。なんだこの評価の式は。早く寝たいのにこんなところで超難問が…。

Zope本よ、助けてくれー!

あれこれ探すこと10分以上。でもたぶん15分未満。ズバリではないけど、それっぽいものがあった。
range(count)っていうのがあって、これが「count個の整数のリストを返す」らしい。スタートは「0」みたい。例として「"_.range(4)"」となってて、返す値は「0、1、2、3」。_.rangeというのがよくわからんけど今は無視。

ここではcount=top_daysで、top_daysはデフォルトでは4が入ってるから、「0、1、2、3」が返される。けど、rev_day_entry_itemsというのがある…。



よーし、パパ予想しちゃうぞー。

まずここには最新のエントリが(デフォルトでは4つ)挿入されるはずだ。

また、各エントリには「ブログのURL/数字」でアクセスできる。ということは各エントリには番号がつけられているはずだ。最初のエントリには番号「1」が、2番目のエントリには番号「2」が、…という具合に。例えば50のエントリがあれば最新のエントリには50という番号が付いてるはず。

ということは、50のエントリがあって、最新のエントリを4つ得たい場合は、欲しいエントリ番号は50、49、48、47だ。

ということは、だ。

rev_day_entry_itemsのrevはリバースのrevで、この中にはエントリ番号とかが逆さまに格納されてるんじゃないかな。
それで、この中からcount=top_daysによって(デフォルトでは4つ)、最新のものが引っ張ってこられるという仕掛けなのでは…。



rev_day_entry_itemsの正体を予想するのは今の理解では無理。激しく無理。何より眠い。よし、ラストスパート。
ソースをもう一度確認。

<dtml-in "rev_day_entry_items(count=top_days)">
<dtml-var entry_body>
<dtml-else>
<div id="content">
There are no entry.
</div>
</dtml-in>


dtml-inによって、rev_day_entry_itemsの中身についてtop_daysによって取り出される要素の個数分だけ、dtml-in以下を繰り返す。
(ただしrev_day_entry_itemsが空ならば、dtml-else以下が表示される)

dtml-in以下には<dtml-var entry_body>があるから、対応するエントリ番号のentry_bodyが表示される。

とまあ、そんな感じのハズ。

もう寝る!
トラックバック用URL:
http://nagosui.org:8080/Nagosui/COREBlog2/26/tbping
コメントを追加

下のフォームに記入してコメントを追加できます。平文テキスト形式。

(必須)
(必須)
(必須)
(Required)
Enter the word

このBlogについて
Plone, Zope, Pythonなどのトピックについてのメモです。
カテゴリ
Plone (98)
Plone Products (23)
COREBlog2 (31)
COREBlog1 (29)
ReadingCOREBlog (7)
Zope (66)
Turbogears (18)
Django (12)
Python (25)
Linux (30)
Nagosui (12)
Design (33)
Misc (48)
moblog (5)
最近のエントリ
浜松ブラスバンド定期演奏会2008 nyusuke 2008年11月24日
Glossy Horizontal Menuを使う nyusuke 2008年11月17日
第3回Python東海終了 nyusuke 2008年11月17日
Universalじゃない件 nyusuke 2008年11月15日
最近のコメント
Re:WebデザイナーのためのDjangoはじめの一歩 nyusuke 2007年06月01日
Re:WebデザイナーのためのDjangoはじめの一歩 pateo 2007年05月31日
Re:東海Python Workshop 01終了 nyusuke 2007年05月31日
Re:東海Python Workshop 01終了 kfuruhata 2007年05月30日