» »

[Python] GePARD

[Python] GePARD

OwcA ::

GePARD (Generator Preprostih A Raznolikih Delov)


v0.2



Uvod


To čudo bi naj bil samostojen "template engine". Povod za nastanek je bilo delo na spletišču, ki ni omogočalo nobenega skriptnega jezika in zvrhana mera lenoba. ;)
Seveda se ga da uporabiti tudi v druge podobne namene, recimo za generiranje semidinamičnih strani.

Pogoji uporabe



GePARD je izdan pod GPL z vsemi pripadajočimi radostmi in bridkostmi.

Kako do GePARD-a?



Trenutno je uradna domača stran tale tema ;).

GePARD v0.2 (ZIP)
GePARD v0.2 (TAR.GZ)

Delovanje


Abstraktno gledano, imamo nekaj od koder beremo in nekaj kamor taisto potem zapišemo. Vmes le-to na določenih mestih še malo oplemenitimo. In potem so tu še filtri s katerimi omejimo kaj beremo (v osnovi so bili mišljeni kot optimizacija, čeprav si verjetno da izmisliti tudi primer kjer hočemo pogepardit samo določene datoteke iz kakšnih drugih razlogov). Preprosto? Vsekakor!

Datotečno strukturo in vse potrebno za delovanje si lahko ogledate v examples/basic, kot tudi poženete z example_basic.py

Zaganjanje



GePARD za delovanje potrebuje Python 2.4. Dobite ga lahko tu.

Za lažjo uporabo je priložena skripta simple_gepard_starter.py, ki deluje na dva načina. Bodisi ji podate XML nastavitveno datoteko kot argument, bodisi vas po tem pobara in morate ustrezno pot vpisati.


Uporaba predlog



<p>blabla bla bla bla b lablala.</p>

<? stetje_ovac(8) ?>

<p>blabla bla bla bla b lablala.</p>


GePARD-ovo predlogo kličemo podbno kot funkcije v večini skriptnih jezikov. Klic zapremo med <? in ?>. V primeru zgoraj kličemo predlogo stetje_ovac z argumentom 8. V okviru takšnega klica bomo v nadaljevanju za ime predloge uporabljali izraz glava.

Nastavitveni XML



Kot že rečeno, lenoba je bila pomemben dejavnik pri nastanku, zato je nujno, da lahko GePARD-a uporabimo za čim več stvari s kar se da malo dela. V tem duhu so vse nastavitve spravljene v XML datoteki. Ko GePARD-a naženemo nad novo opravilo tako zadošča, da podamo drugo datoteko.

<?xml version="1.1"?>
<gepard>
	<dir>
		<templates recursive="true">d:/gepard/templates</templates>
		<input depth="-1">d:/tralala/in</input>
		<output>d:/tralala/out</output>
	</dir>
	<filters>
		<filtergroup>
			<namestartswith matchcase="True" negate="true">BeEe</namestartswith>
			<extension>html</extension>
		</filtergroup>
		<filtergroup>
			<nameendswith>mu</namestartswith>
		</filtergroup>
	</filters>
</gepard>


templates je direktorij kjer so spravljene predloge. Vsaki glavi pripada istoimenska datoteka s končnico gt. Neobvezni atribut recursive določa uporabo rekurzivnih predlog.

input je vhodni direktorij. Neobvezni atribut depth določa globino brklanja:
-1 -> do dna (privzeto)
0 -> samo po podanem nivoju
n -> do največ n nivojev globoko

output je izhod

filters predstavlja unijo vseh filtergroupov znotraj (torej so združeni z logičnim ali)

filtergroup je presek vseh filtrov znotraj

Vsak filter ima neobvezne atribute:

matchcase:
true -> filter razlikuje med malimi in velikimi črkami
false -> filter ne razlikuje med malimi in velikimi črkami (privzeto)

negate:
true -> logični ne, filter torej izbere vse datoteke, ki ne ustrezajo kriterijem
false -> normalno delovanje (privzeto)

Trenutno implementirani filtri:
extension -> končnica
namestartswith -> ime datoteke se začne z
nameendswith -> ime datoteke se konča z
namecontains -> ime datoteke vsebuje
namere -> ime datoteke ustreza regularnemu izrazu

Predloge



<html>
<head>
<title>$arg0</title>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">

<LINK REL="stylesheet" TYPE="text/css" HREF="${escape_to_root}style.css">

</head>
<body>
<? title_block($arg0, "bee${arg1}") ?>


Predloge so navadni tekstovni dokumenti. Po imenih sovpadajo z glavo, ki ji pripadajo. Do podanih argumentov lahko dostopamo z
$arg0, $arg1, ... $argn

Na voljo so še posebne sistemske vrednosti:
$escape_to_root - pomik (../) do izhodiščnega direktorija (output)

Dvoumja razrešujemo z zavitimi oklepaji.

Predloge lahko vklučujejo klice drugih predlog (za to funkcionalnost je potrebno nastaviti atribute recursive elementa templates v nastavitveni XML datoteke). Prejeti argumenti zasedejo svoje prave vrednosti pred nadaljnim razvijanjem klicev, zato jih lahko uporabimo kot argumente.

Prihodnost



Prvi plan:
-opremiti kodo s komentarji
-DTD
-več filtorv
-postaviti CVS
-elegantnejše raziširjevanje funkcionalnosti predlog (trenutno je priporočljiv prijem dedovati razred Gepard in povoziti metodo getEnvironmentVars()) -- plugini

Drugi plan:
-GUI

Zgodovina



v0.1
- prva izdaja

v0.2
- popravljen bug zaradi katerega niso vedno delovali argumenti, ki niso bili zaprti med narekovaje
- dodana možnost rekurzivnih predlog (zaradi tega je iz metoda processFile nastala še metoda parseFile)
- dodana možnost logičnega ne za filtre
- dodan primer (examples/basic in example_basic.py)
- nov exception CyclicTemplatesException
- argumenti klica predloge se sedaj prenašajo okoli kot list (sprememba zaradi prihajajočih plug-inov)
- zmanjšal podvajanje kode (na račun kake operacije več) pri exceptionih

Otroška radovednost - gonilo napredka.
  • spremenilo: OwcA ()

OwcA ::

Kakšni komentrji, bug-reporti, zgražanja nad uporabljenimi rešitvami, ... ?

Vsaj dokler imam veselje s to zadevščino, nudim (v mejah razuma in lenobe omejeno) tehnično podporo.

Če ima kdo kašno dobro idejo kam usmeriti nadaljni razvoj, je bom zelo vesel. Nekaj (poleg samovšečnosti, ta se tako vedno dere ;)) mi pravi, da bi se iz tega dalo še kaj naresti.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Gandalfar ::

Zgleda lustno. Ni mi pa cisto jasno kako se to razlikuje od semi-standardnega htmltmpl

Zgodovina sprememb…

Gandalfar ::

Se cisto kozmeticna pripomba. Imeniki v tar.gz ponavadi nimajo presledkov imenih, ker je v bashu delo z njimi malo manj elegantno kot brez njih.

OwcA ::

htmltmpl se mi je zdel preveč zapleten za uporabo, poleg tega, če prav razumem je to template engine v klasičnem pomenu besede, torej namenjen generiranju dinamičnih spletnih strani, nisem pa se preveč poglabljal, priznam.

gz pripombo sem upošteval, hvala. Keep 'em coming.
Otroška radovednost - gonilo napredka.

kopernik ::

Na prvi uč zgleda ok. Preizkusil pa še nisem :-)

Mogoče bi veljalo dodati še funkcionalnost klicanja predlog znotraj predlog (v kolikor to še ni implementirano - ni jasno iz tvojega opisa geparda).

Potem bi mogoče lahko dodal še custom definiranje dodatnih spremenljvk v input xml-u (seveda bi moral uporabnik geparda zato napisati nekaj kode v pythonu - torej nekakšen plugin). Zakaj bi bilo to koristno ? Zgolj zato, da uporabnik ne bi brez potrebe šaril po kodi samega template engina in da bi lahko uporabniki izmenjevali te plugine.

OwcA ::

Mogoče bi veljalo dodati še funkcionalnost klicanja predlog znotraj predlog (v kolikor to še ni implementirano - ni jasno iz tvojega opisa geparda).

Trenutno ni. Mi je pa ideja všeč, tako da bo.

Potem bi mogoče lahko dodal še custom definiranje dodatnih spremenljvk v input xml-u (seveda bi moral uporabnik geparda zato napisati nekaj kode v pythonu - torej nekakšen plugin).

Se strinjam.
Najboljša rešitev bi bil verjetno nek plug-in sistem.
Otroška radovednost - gonilo napredka.

Gandalfar ::

Bi se ti dalo dodati se kaksen primer zraven aplikacije. Da samo pozenem gepard.py primer in mi nekaj zgenerira. Tole mi se ni cisto jasno kaj pocne. Trenutno zmedeno opazujem kako mi simple_gepard_starter.py spremeni kurzor in caka da graba del ekrana z njim.

BigWhale ::

Na sourceforge zapopaj stvar. Pa en angleski readme daj zraven... :)

Nerdor ::

Brez zamere (preden začne kaj name letet .. :8) ). Ta GePARD je:
- zelo podobno kot php, right? Ali celo kakšnemu Strutsu ?
- kako se bo to dalo povezati skupaj s spletnim strežnikom? Recimo Apache :\
- mogoče bi lahko template razvijal, da bi veboval "več akcij od enkrat" ozr. "več metod izvrši na en tag". Podobno kot je Struts, Asp.Net, JFS.. take stvari bi zeeelloo potrebovali v svetu Pythona (žejni smo te ideje kot velblodi vode v sahari, verjemi!). Nekako ideja za podporo MVC ideji ..
To so samo namigi, lahko da se motim :\ , saj je projekt v zelo rosni fazi razvoja.

Gandalfar ::

- kako se bo to dalo povezati skupaj s spletnim strežnikom? Recimo Apache [:\\]


Kakor sem jaz razumel iz opisa je zadeva namenjena generiranju staticnih spletnih strani.

CCfly ::

Opis, kakšen opis ? Danes je gepard jutri je leopard :)
Vlečem dol ...
"My goodness, we forgot generics!" -- Danny Kalev

Gandalfar ::

Recimo v uvodu?

kopernik ::

Zakaj samo spletne strani ? Template engine lahko uporabiš za generiranje kakršnegakoli tekstovnega fajla.

Nerdor ::

Zdej štekam, kaj hočete z tem projektom doseči. :))

OwcA ::

kako se bo to dalo povezati skupaj s spletnim strežnikom? Recimo Apache

Vsaj v bližnji prihodnosti se še ne bo. Če slučajno doseže stvar nek nesluten uspeh potem morda, drugače so na voljo boljše rešitve in nimam nobenega namena dodatno zasičiti trga in krasti razvijalce drugim podobnim projektom.

- mogoče bi lahko template razvijal, da bi veboval "več akcij od enkrat" ozr. "več metod izvrši na en tag". Podobno kot je Struts, Asp.Net, JFS..

To nameravam narediti. Delno v obliki rekurzivnih predlog, dokončno pa s plug-ini.
Otroška radovednost - gonilo napredka.

OwcA ::

Nova verzija:

v0.2
- popravljen bug zaradi katerega niso vedno delovali argumenti, ki niso bili zaprti med narekovaje
- dodana možnost rekurzivnih predlog (zaradi tega je iz metoda processFile nastala še metoda parseFile)
- dodana možnost logičnega ne za filtre
- dodan primer (examples/basic in example_basic.py)
- nov exception CyclicTemplatesException
- argumenti klica predloge se sedaj prenašajo okoli kot list (sprememba zaradi prihajajočih plug-inov)
- zmanjšal podvajanje kode (na račun kake operacije več) pri exceptionih
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

DC power jack s stikalom

Oddelek: Elektrotehnika in elektronika
8767 (565) Golaz
»

gepard

Oddelek: Loža
193714 (2653) primozzzz
»

Pomoč pri spletni strani (strani: 1 2 3 )

Oddelek: Izdelava spletišč
1218154 (5615) gepard69
»

Oklep od morskega ježka - čiščenje le tega

Oddelek: Loža
269011 (8416) Ziga Dolhar
»

Kam v okolico Žirov?

Oddelek: Loža
81046 (863) elfstone

Več podobnih tem