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

Cevap