Hivatkozás külön-külön az ismétlödö mintákra
Sziasztok.
A következö lenne a problémám:
Egy css-re szeretnék mintát illeszteni-ezzel önmagában nincs is gond-de az alábbi problémára nem találtam elegáns megoldást.
Egy html tag után,több selector is álhat,illetve tulajdonság:érték párbol is tetszöleges számu lehet,ezt le lehet fedni egy sokszorozoval,de akkor csak az utolso találatot adja vissza, és külön akarok hivatkozni az összes tulajdonságra, :-ra,értékre,etc...
Meglehet-e oldani hogy egy pl. az értékre hivatozo részminta kulon adja vissza a találatokat?
■ A következö lenne a problémám:
Egy css-re szeretnék mintát illeszteni-ezzel önmagában nincs is gond-de az alábbi problémára nem találtam elegáns megoldást.
Egy html tag után,több selector is álhat,illetve tulajdonság:érték párbol is tetszöleges számu lehet,ezt le lehet fedni egy sokszorozoval,de akkor csak az utolso találatot adja vissza, és külön akarok hivatkozni az összes tulajdonságra, :-ra,értékre,etc...
Meglehet-e oldani hogy egy pl. az értékre hivatozo részminta kulon adja vissza a találatokat?
Mit?
Kodszinezés
Hogy tudnám azt megoldani hogy tetszőleges számu tulajdonság:érték párra(vagy selectorra) illeszkedjen a minta ,de mindeggyik párt visszaadja(mert ha csak sokszorozó kvantor?.al csinálom,akkor csak az utolsó találatot adja vissza)(és ugye a párra illeszkedő mintán belül is van 4 részminta ami rendre a (tulajdonság(1) :(2) érték(3) ;(4))?
Weaverslave
Weaver?
A'sszem nem ismerem...
szerk.:közben találtam egy windows-os; ilyen nevü progit,csak nem arra gondolsz?
De.
Selector
Vagy Te valami másra gondoltál?
Jó kérdés, de nem lehet megoldani, egy mintába nem fér bele
A zárójeleket nem lehet kvantifikálni, mert tudni kell, hogy pontosan melyik sorszámú hivatkozás melyikre vonatkozik.
Neked valamiféle rekurzív találati tömbre volna szükséged, ami nem lehetséges. A preg-et nézve, a preg_match egydimenziós tömböt ad vissza, és annak az elemei a zárójelek, a befoglalás sorrendjében (minden minta en bloc implicit zárójelezve van, ez a 0 elem); a preg_match_all pedig kétdimenziós tömböt ad, melyben a felső zárójeles szint alá vannak beosztva az globális találatok, tehát a struktúrája is más, mint amire neked szükséged volna. (Neked a zárójelek alá a részminták találatai kellenének.)
Úgy is fogalmazhatunk, hogy a preg_match_all nem applikálható részmintákra, minden részmintának külön preg_match_all kell.
Nehéz ügy, mert előbb a selector blokkokat kéne kinyerni, azokhoz viszont alacsonyabb szintű elemzés is kell, tehát regex-szel mindenképp redundáns lesz az elemzés. És ugye kezelni kell a kommenteket és a string literálokat, amit a kódszínezők valószínűleg nem regexszel csinálnak. (Bár, ki tudja, okos lookahead-ekkel talán meg lehet oldani...)
nem is kell egy mintába
Üdv,
Felhő
nem visz közelebb
De persze ez az egész így csak egy egyszerűsített parser lesz, ami könnyen meg tud bukni, ha mondjuk kapcsos zárójel van egy fájl nevében. Normális parse-olást alulról felfelé kell csinálni, előbb tokenizálva (nyelvtan – ez hasznos lehet Ronynnak is, mert a tokenek regex-ek).
Szerk. Az utóbbit is lehet regex-ekkel, szerencsére a css-nek elég egyszerű a nyelvtana. Meg kell jelölni a tokeneket egyedi szimbólumokkal, utána már könnyű lehet a nyelvtani szintre megírni a regexet. Vagy ha valaki ezzel nem akar sokat szöszölni (bár megéri, mert korrektebb és szebb megoldás lesz), még akkor is hasznos lehet valamilyen lexikális szűrés, mondjuk a kommentek kiszűrése.
fájl neve?
A preg_replace_callback meg szerintem erre a feladatra egyszerűbb kódot eredményez, mint két egymásba ágyazott ilesztés. Persze itt is ez történik, de átláthatóbb lesz némileg a kód.
Üdv,
Felhő
e modositó
Végül belejöttem,lett egy class colorer belőle,kezeli a php fájlokat is(php,html,css vegyesen).
A php részt azt a token_get_all() függvénnyel oldottam meg,és sajna az a leggyengébb eddig(a stringeken elég sürün elhasal).
Lehet a php szinezést is saját függvénnyel oldom meg...
Na meg még a js-t kell(ene) beleintegrálni valahogy...
fájl neve
#id { background: url('bg{5}.jpg'); }
sorry
szerk
A replace-es verzióhoz még hozzá kell tenni, hogy replace-kor nem jön létre találati tömb, így ha későbbi vizsgálatra van szükség, vagy valamiért szükség van a rules eredménytömbre (elég hihető), akkor bővül:
nem okoz gondot
Átláthatóbb kód témaköre: ahol használod, ott egyik esetben van egy darab preg_replace_callback, másik esetben egy függvényhívás, aminek az eredményétől függően kell végigiterálni egy tömbön (ez utóbbit rejti el előled a preg_replace_callback).
Üdv,
Felhő
replace OK, tokenizálni kell
Tévedtem, tényleg replace-elni kell, túlságosan a topikindító bejegyzésre koncentráltam.
Viszont a kódszínezés tipikusan csak tokenizálást igénylő feladat, szóval a szabályblokkok felismerésére szerintem nincs is szükség.
Token kevés
Szerintem...:D
Tényleg kevés.
Végülis akkor hogy oldottad meg a property-value szétválasztást? Vagy a selectorokra/rule-setekre mi a regexed (ha regexet használsz rá)? Simán /\{.*?\}/ ?
Stringeket, kommentet hogy kezeled? (Példa fent.)
És hogy lehet, hogy a token_get_all() elhasal a stringeken, mikor a php lexerét használja?
Triviális
Ugy hogy a kezdö html tagot(ha van) helyben cserélem(hátránya hogy csak 1 tagot talál meg,de ez nekem is most jutott eszembe hogy abbol is lehet tobb :D))(ha tobb van akkor egyelore selectorként szinezi,ugyhogy megvan a holnapi piszkálni valo)),aztán az {-ig terjedö részt,egy másik fuggvény bontja szét elemeire.
A két {} kozti részt,meg egy 3. fuggvény,az emlitet határolok mentén.
A html hasonlo csak mivel ott nincs határolo,ezért preg_match_all keresi a tul="érték" párokat.(az értéken kivul adott listábol,vagyis tokenként kezeli,htmlt,css-t is)
A komment... hát az még alap,html,sortörésre nem illeszkedik,de annak egyelore nem is tulajdonitottam fontosságot.
Mivel esetenként a css-t is kommentek közzé zárjuk,ezzel még lessz munka
.
Amin magam is meglepödtem,hogy az esö proba után,a különbözö részek/tagok közzé beszurtam 3-4 sortörést,és ugy is hibátlanul illeszkedett)):D
A php érdekesen csinálja.
Pl.: egy print"<b>..."; esetén a két <> az T.STRING,a "b" pedig T.ENCHAPSED AND WHITESPACE(ha jol emlékszem a nevére).
Az egész fájlt átadom neki,szoval nem tudom.
Leginkább olyankor fordul elö,ha változo van a stringben,pl.: "...action=\"$_SERVER[PHP_SELF]\" "
gondolom az zavarja be,hogy az indexnél nincs aposztrof,pedig-tudtommal-ez szabályos(stringen belül)...
Aham.
Komment
Még ilyen extrém mintát is kezel
/
*
cssszoveg
*
/
A html kommentnél szintén jo,meg
<style...-n belüli kommentrészt is szinezi(<!-- és -->)
a kép{5}.jpg még nem megy de,majd kitalálok valamit :D
Végülis még nincs kész(teljesen
talán sose lesz),és biztos van/lesz olyan extrém eset amin elhasal,de ezt bele kell kalkulálni,mint minden olyasmibe,ami bizonyos szabályszeruségekre épit...
PS:Kozben a
kep{5}.jpg problémát is sikerult megoldani,igy már azt is helyesen kezeli...
Komment
Még ilyen extrém mintát is kezel
/
*
cssszoveg
*
/
A html kommentnél szintén jo,meg
<style...-n belüli kommentrészt is szinezi(<!-- és -->)
a kép{5}.jpg még nem megy de,majd kitalálok valamit :D
Végülis még nincs kész(teljesen
talán sose lesz),és biztos van/lesz olyan extrém eset amin elhasal,de ezt bele kell kalkulálni,mint minden olyasmibe,ami bizonyos szabályszeruségekre épit...
PS:Kozben a
kep{5}.jpg problémát is sikerult megoldani,igy már azt is helyesen kezeli...
mondjuk egy kep { 5 } .jpg esetén elhasalna,de ez van....
Mondjuk az általam ismert szerkesztök jo része,még
ennyit sem tud,és az igazán jokban is vannak hibák(css-t kommentként szinezi mert ki van kommentezve)...
A fentebb emlitett szerkesztönek pl. elég gyenge a kodszinezése...