'''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):
        # Hitung posisi direktori ini relatif terhadap rootdir, agar tiap
        # referensi yang dibuat file kerangka tidak rusak. Prefiks link
        # disiapkan.
        level = abs(curdir.count(os.sep) - rootdir.count(os.sep))
        if level:   levelstr = "../" * level
        else    :   levelstr = "./"

        # Mendaftar dan memproses satu-persatu semua file isi halaman menjadi
        # file HTML dalam bentuk yang diinginkan.
        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])
            # Kalau file tujuan tidak ada atau salah satu file sumber lebih
            # baru dari file target...
            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