作者: 機械伯爵
日時: 2003/9/29(21:24)
■フォルダと階層

 とゆーわけで、マイペースでPyPageな第二弾です。

 今回は、フレーム付きページの動的生成と、PyPage 固
有の PP モジュールについてお話したいと思います。

 その前に、メインフォルダにテストページを散らかし
ておくのもなんですから、test というフォルダを pub
フォルダの下に作ってください。

 ここに HTML ファイルを置く分には問題無いのですが、
Python モジュールを置くなら、モジュール参照のために
__init__.py ファイルを用意してください(私はうっか
り忘れて、しばらく悩みました)

※__init__.py ファイル・・・フォルダをパッケージと
  して Package.Module のように参照するために、フォ
  ルダに必ず入れておくファイル。本来、パッケージの
  初期化内容を書くのだが、中身が無いブランクファイ
  ルでもかまわない。

 アドレスの書き方は、pub フォルダ下ですから、
http://localhost:8000/test/ となります。

 なお、pyp フォルダのように、pub より上のフォルダ
を参照するときは、
http://localhost:8000/pyp/ のように書きます

 それでは、以降はこの /pub/test/ 以下で作業を行う
ものとします。

※今回の話題の詳細な説明については、
 pyplib/handler.py の内部ドキュメントに詳しいので、
 そちらを参照してください。



■フレーム付きページの生成

 フレーム付きのページも、フレーム内のページを別個
に設定するなら、別に普通に書けば終わります。

#---pub/test/test3a.py---

page_top_content='''<html>
  <head>
    <title>TEST3 FRAME</title>
  </head>
  <frameset cols="20%,50%">
    <frame src="f0.html" name="frame-0" />
    <frame src="f1.html" name="frame-1" />
  </frameset>
  </html>'''

def page(pc):
  pc.send_head()
  pc.write(page_top_content)

#---pub/test/test3a.py---

 ところが、フレーム内のページを1モジュールで書く
となると、話が一気に複雑になります。

#---pub/test/test3b.py---

page_top_content='''<html>
  <head>
    <title>TEST3 FRAME</title>
  </head>
  <frameset cols="50%,50%">
    <frame src="test3b/f0" name="frame-0" />
    <frame src="test3b/f1" name="frame-1" />
  </frameset>
  </html>'''

def page(pc):
  pc.send_head()
  pc.write(page_top_content)

page_f0_content='''<html>
  <head>
    <title>FRAME-0</title>
    <style>
      p{text-align:center;font-size:48pt;color:blue}
    </style>
  </head>

  <body>
    <p>FRAME-0</p>
  </body>
  </html>'''

page_f1_content='''<html>
  <head>
    <title>FRAME-1</title>
    <style>
      p{text-align:center;font-size:48pt;color:red}
    </style>
  </head>

  <body>
    <p>FRAME-1</p>
  </body>
  </html>'''

def page_f0(pc):
  pc.send_head()
  pc.write(page_f0_content)

def page_f1(pc):
  pc.send_head()
  pc.write(page_f1_content)

#---pub/test/test3b.py---

 モジュール test3b.py 内にフレーム内のページを生成
するスクリプトを埋め込む場合は、生成するページのア
ドレスを test3b/ の下とします。

 さらに、生成するページの名前を name とすると、
page_name 関数が、page 関数と同じ役割を果たします。

※詳細ルールについては、/pyplib/handler.py参照

 なお、フレーム内ページから、画像などを相対パスで
参照する際、トップページより一つ下のディレクトリに
いることに気をつけてください。

 例えば今の例で、test3b.py モジュールと同じディレ
クトリにある fig0.jpg というファイルを参照する場合、
"../fig0.jpg"と書く必要があります。



■PPモジュールについて・・・

 PyPage は、拡張子.py のモジュールかわりに、拡張子.
pp のモジュールを指定することができます。

 参照の仕方は.py と同じく拡張子を省く書き方なので、
同じフォルダに spam.py と spam.pp を置いておくと、
spam.py の方を参照してしまうので、注意してください。

 というか・・・ PP モジュールはプリプロセッサでコ
ンパイルされて、PY モジュールに変換されて適用され、
以後は、PY モジュールを参照する、というシステムにな
っています。

 PP モジュールでは、一部タグを使用することによって
モジュールが書きやすくなっています。

 以下は、簡単なPPモジュールの例です。

#---test4.pp---

def page(pc):
  pc.send_head()
  <write><html>
    <head>
      <title>TEST4(PP)</title>
    </head>
    <body>
      <h1>TEST4-PP-Module!</h1>
    </body>
  </html></write>

#---test4.pp---

 Zope の DTML などとは異なり、HTML にスクリプトを
埋め込んだのはなく、スクリプトに HTML を埋め込む形
式になりますので、<write> タグの最初の位置だけは、
Python スクリプトの形式に従って字下げしてください
(後は自由です)

 PP モジュールでは、この他にも便利な機能があります
が、習得速度にあわせて順次使っていけばよいと思いま
す。

 なお詳細は、/pyplib/ppc.py の内部ドキュメントを参
照してください。



■フレーム間通信の例

 さて、まとめとしまして、別フレームから信号を受け
取ると表示する画像を変化させる、というページを書い
てみます。

 まず、fig0.png、fig1.png という2枚の PNG ファイ
ルを用意ください(なんでもかまいませんが、ヤバい絵
を使う場合は、周囲に注意してください)

#---test5.py---

page_top_context='''<html>
<head>
<title>TEST5 FRAMES</title>
</head>
<frameset cols="20%,50%">
  <frame src="test5/f0" name="f0" />
  <frame src="test5/f1" name="f1" />
</frameset>
</html>
'''

page_f0_context='''<html>
<head>
<title>FRAME-0</title>
</head>
<body>
<form action="/test/test5/f1" method="post" target="f1">
 <input type="radio" name="fig_n" value="fig0" />FIG-0<br>
 <input type="radio" name="fig_n" value="fig1" />FIG-1<br>
 <input type="submit" />
</form>
</body>
</html>
'''
page_f1_context='''<html>
<head>
<title>FRAME-1</title>
</head>
<body>
<p><img src="../%(fig_num)s.png">
</p>
</body>
</html>
'''

def page(pc):
  pc.send_head()
  pc.write(page_top_context)

def page_f0(pc):
  pc.send_head()
  pc.write(page_f0_context)

def page_f1(pc, fig_n=None):
  if not fig_n:
    fig_num = "fig0"
  else:
    fig_num = str(fig_n)
  pc.send_head()
  pc.write(page_f1_context % vars())

#---test5.py---

 うまく切り替えが出来たでしょうか?(最初は fig0.
png が表示されるようになっています)。

 とっかかりはこの程度で十分だと思いますので、まず
は使ってみてください。

 次回、があるかどうかは不明・・・

2003/09/29 12:55:30 機械伯爵