テンプレートエンジン?

とあるHPを作っています。

htmlファイルしか使えない静的なサーバーでのHP作りは何がいやかって、メニューやタイトルなど、同じことを書いてる部分を編集するときに、いちいち全部を書き換えることです。かといって、フレームを使うのは好きじゃない。っと言うことで、HTMLファイルに他のテキストファイルを挿入するだけのスクリプト書きました。

まぁ、コードはあれだけど、やったことは公開していこー


1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
import os
import re
 
template_dir = "./templates"
output_dir = "./output"
 
_error = 0
 
def readpage(openfile):
global _error
 
replace_list = []
 
if not os.path.isfile(openfile):
_error += 1
print "No such file '%s'" % openfile
return "Include Error '%s'" % openfile
else:
f = open(openfile)
html = f.read()
f.close()
 
tags = re.findall("{.*?}",html)
 
if len(tags) == 0:
return html
 
openfile_dir,openfile_name = os.path.split(openfile)
 
for tag in tags:
src_tag = tag
tag = tag.replace("{","")
tag = tag.replace("}","")
method,param = tag.split(" ",1)
if method == "include":
arvs = param.split(" ")
for arv in arvs:
key,value = arv.split("=")
value = value.replace('"','')
if key == "file":
fname = os.path.join(openfile_dir,value)
ihtml = readpage(fname)
replace_list.append((src_tag,ihtml))
else:
print "Undefined param '%s' in %s. File %s" % (key,method,openfile)
_error += 1
else:
print "Undefind method '%s'. File %s" % (method,openfile)
_error += 1
 
for old,new in replace_list:
html = html.replace(old,new)
return html
 
 
def create(template_dir,output_dir):
 
tpath = os.path.abspath(template_dir)
opath = os.path.abspath(output_dir)
 
#set flist
src_flist = []
dir_list =[(tpath)]
while True:
d = dir_list[0]
flist = os.listdir(d)
for f in flist:
p = os.path.join(d,f)
if os.path.isdir(p):
dir_list.append(p)
else:
src_flist.append(p)
dir_list.pop(0)
if len(dir_list) == 0:
break
 
#select_page
page_flist = []
for fpath in src_flist:
bname = os.path.basename(fpath)
fname,ext = bname.split(".")
page_type = fname.split("_")
if page_type[0] == "page":
page_flist.append(fpath)
 
#ouput
for src_file in page_flist:
#make output file name
out_file = src_file.replace(tpath,opath)
src_bname = os.path.basename(src_file)
out_bname = src_bname.replace("page_","")
out_file = out_file.replace(src_bname,out_bname)
#write
dname,fname = os.path.split(out_file)
if not os.path.isdir(dname):
os.makedirs(dname)
html = readpage(src_file)
f = open(out_file,"w")
f.write(html)
f.close()
return
 
def main():
try:
create(template_dir,output_dir)
 
if _error == 0:
print "work clearly!"
else:
print "work with error %d" % _error
except:
print "something wrong....orz"
 
if __name__ == '__main__':
main()
os.system("pause")
 
実行環境:Python2.5.2

できること
・{include file="file_path"}で他ファイルを挿入することができる。だけ。これしか認めない。

・template_dirとoutput_dirはディレクトリ名、スラッシュつけるとダメ。/じゃなくて\使ってもダメ(なぜか)。相対パスは平気。

・template_dirの中の"page_何か.html"のファイルから"何か.html"ファイルをoutput_dirに生成する。挿入するファイルは"part_なんか.html"とかにするという想定。

・エラー回避はほぼしてない。無限ループとかする。



その他に、csvファイルから表を作るとか、機能を追加していければ、いければ・・・ね。


最初はPHPのSmartyでやろうとしたんです。使い慣れたテンプレートエンジンで簡単なので。そしたら、Shift-JISは読み込めませんなど、タグの誤認識をするなどで困りまして。
 Pythonのテンプレートエンジンを探してみたりもしましたが、いやいや、こういうときにちゃちゃっとスクリプトを書いてしまうのが理想だろ、と一つ書いてみたのがこちらです。ほら、できたじゃん、ちゃちゃっと、理想やん。・・・・・ちゃちゃっと、・・・結構かかったよ、ちくしょう。

--------------

おお、SkyDrive、フォルダをZipでダウンロード可能になってる。へぇー、便利ー。
関連記事

コメント

コメントの投稿

非公開コメント

このブログについて
□ ブログ内容
決まった趣旨はありません。
興味を持ったこと・日常で行ったことを何でも書きます。

3DCG・プログラミングなどが多めです。

□ 現在の活動
・ウェブサイト制作
 (http://tiblab.net)
・3Dゲーム制作
 (コックパニック)
検索フォーム
ユーザータグ

Blender キャプチャ blendファイル BGE Python GameEngine ムービー Android CG  Red5 Terragen C# C++ 

カテゴリー
プロフィール

TiBra

Author:TiBra
趣味でCG制作、プログラミング等を行っています。メイカーズに憧れています。

ネットを通じた交流を広げたく思っていますので、コメント・メールはお気軽にどぞー

戯言程度のことは、こちらのブログに投稿しています。基本戯言なので、実質移転しているようなものです。

Mail:tibraあっとlive.jp
HP:TibLabmemocode
動画:VimeoFC2動画ニコニコ
ファイル:SkyDrive
企画:3Dゲーム作業実況

Blogリンク
不都合がございましたらご連絡ください。
当ブログのリンクバナー
FC2 ID
FC2カウンター
RSSフィード+解析コード