'''Script transformasi data untuk situs AdhiHargo.net
Script ini menjelajahi secara rekursif direktori situs, memasukkan isi halaman
dari setiap file data (berekstensi .isi) yang ditemui dan mengubahnya menjadi
halaman HTML berdasarkan layout dari file kerangka, skeleton.html. Script akan
mencari rujukan pada file tertentu dalam file kerangka, lalu mengubahnya
secukupnya dalam setiap level rekursi agar referensi tersebut tidak rusak.
* Hanya menterjemahkan file-file yang telah berubah setelah terjemahan
terakhir (jadi seperti make).
* Perkecualian untuk aturan di atas adalah bila file kerangka telah berubah.
* Label yang dikenali oleh script ini adalah:
- JUDULHALAMAN, akan di-konkatenasi dengan teks dalam tag <title></title>
- ISIHALAMAN,
- EKSTENSIFILE, ekstensi file target, menggantikan ".isi"
Author : Adhi Hargo
Last modified : 15/01/2007 3:49:31
'''
import sys, os, re, stat
from _skel import *
out = sys.stdout
SKLFILENAME = 'layout.html'
DATFILEEXT = '.isi'
DEFAULT_DSTFILEEXT = '.html'
linkre = re.compile('(?:href|src)="/[^"]*"',re.IGNORECASE)
def makepages(rootdir):
sklpath = os.path.join(rootdir,SKLFILENAME)
if not os.path.exists(sklpath):
raise IOError, "Tidak ada file %s dalam direktori %s" %\
(SKLFILENAME, os.path.split(sklpath)[0])
sklfile = file(sklpath,'rb')
sklstrs = sklfile.readlines()
sklfile.close()
parser = Parser()
datfile = None; dstfile = None
datpath = None; dstpath = None
datstrs = None;
titlestr = None; contentstr = None
curline = None;
level = None; levelstr = None
for curdir, dirs, files in os.walk(rootdir):
level = abs(curdir.count(os.sep) - rootdir.count(os.sep))
if level: levelstr = "../" * level
else : levelstr = "./"
datlist = [i for i in files if i.endswith(DATFILEEXT)]
for datstr in datlist:
datpath = os.path.join(curdir, datstr)
datfile = file(datpath,'rb')
parser.reset()
parser.feed(datfile)
datfile.close()
if parser.tree.has_key('EKSTENSIFILE'):
if parser.tree['EKSTENSIFILE'].startswith('.'):
parser.tree['EKSTENSIFILE'] = parser.tree['EKSTENSIFILE'][1:]
dstpath = os.path.join(curdir, datstr.replace(DATFILEEXT,".%s" % parser.tree['EKSTENSIFILE'].strip()))
else:
dstpath = os.path.join(curdir, datstr.replace(DATFILEEXT,DEFAULT_DSTFILEEXT))
latestsrc = max( os.stat(datpath)[stat.ST_MTIME],
os.stat(sklpath)[stat.ST_MTIME])
if not os.path.exists(dstpath) or \
latestsrc > os.stat(dstpath)[stat.ST_MTIME]:
dstfile = file(dstpath,'wb')
titlestr = parser.tree['JUDULHALAMAN']
contentstr = parser.tree['ISIHALAMAN']
for line in sklstrs:
curline = line.replace('JUDULHALAMAN',titlestr)
curline = curline.replace('ISIHALAMAN',contentstr)
if linkre.search(curline):
curline = curline.replace('="/','="' + levelstr)
dstfile.write(curline)
dstfile.close()
else: out.write("%s belum berubah.\n" % datstr)
if __name__ == '__main__':
args = sys.argv[1:]
if args: rootdir = os.path.abspath(args[0])
else: rootdir = os.getcwd()
try:
makepages(rootdir)
except:
t, v, tb = sys.exc_info()
print v