05 Aralık 2009 Cumartesi günü (saat 16:42:46) Fatih Aşıcı şunları yazmıştı:
> AND ilişkisine sahip farklı durumlar için bir senaryo aklıma gelmiyor. Eğer > böyle bir şeye ihtiyacımız olursa da dediğin gibi x86-bootstrap şeklinde > ayrı bir durum adı kullanabiliriz. Ekte buna göre yaptım. Mantık şöyle (rekürsif olarak): Bir tag eğer notFor özelliği taşıyorsa, bu özellik içindeki virgülle ayrılmış durumlarda silinir. Bir tag eğer for özelliği taşıyorsa, bu özellik içindeki virgülle ayrılmış durumlardan en az biri aktif değilse silinir. ! işareti yerine notFor daha açık geldi, öbür türlü biraz kriptik oluyor, göz hemen göremiyor. > Bu arada pisi'deki gerekli değişikliği piksemel ile parse edilen kısmın > hemen ardına eklersek hata durumlarını (birden fazla Name tagının match > etmesi gibi) ayrıca yakalama gereği de kalmaz. Aynen öyle olacak.
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import piksemel class DomFilter: def filter(self, dom, target): # Convert to dict for fast lookup, anyone knows a simpler idiom? target = dict(zip(target, range(len(target)))) self.filter_int(dom, target) return dom def match(self, tag, attr, target): if not attr: return False for x in attr.split(","): if x in target: return True return False def filter_int(self, dom, target): for tag in dom.tags(): dont = tag.getAttribute("notFor") want = tag.getAttribute("for") if dont: if self.match(tag, dont, target): tag.hide() continue tag.setAttribute("notFor", None) if want: if not self.match(tag, want, target): tag.hide() continue tag.setAttribute("for", None) self.filter_int(tag, target) def test(filename, target): filter = DomFilter() dom = piksemel.parse(filename) newdom = filter.filter(dom, target) print newdom.toPrettyString() filename = sys.argv[1] target = [] if len(sys.argv) > 2: target = sys.argv[2].split(",") test(filename, target)
_______________________________________________ Gelistirici mailing list Gelistirici@pardus.org.tr http://liste.pardus.org.tr/mailman/listinfo/gelistirici