Пример #1
0
class DOMObject(object):
    def __init__(self, window, tag, parser):
        self.tagName  = tag
        self.__parser = parser
        self.__dict__['__window'] = window 

        if tag == 'body': 
            self.__dict__['__window'].document.body = self
        if tag == 'select': 
            self.options = Array()
        if tag == 'input': 
            self.value = ''
        if tag == 'option': 
            self.value = 0

        self.children   = []
        self.childNodes = Array()
        self.style      = CSSStyleDeclaration()
        self.__dict__['__window'].document.all.append(self)

        # assign an initial id to every dom node
        varname = 'domnode' + str(int(time.time()*10000000))
        self.__setattr__('id', varname)

    def handle_src(self, name, val):
        url = self.__dict__['__window'].document.location.fix_url(val)

        if config.retrieval_all:
            hc.get(url, self.__dict__['__window'].document.location.href)
        
        scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
        if scheme not in ('http','file','https','ftp'):
            config.VERBOSE(config.VERBOSE_WARNING, "[WARNING] Got unknown scheme: %s in %s.%s ."%(url,self.tagName, name));
            if 'onerror' in self.__dict__:
                config.VERBOSE(config.VERBOSE_DEBUG, "[DEBUG] Calling onerror of %s."%(self.tagName));
                self.onerror()

        if self.tagName == "iframe":
            from Window import Window
            from PageParser import PageParser
            window = Window(self.__dict__['__window'].__dict__['__root'],
                            self.__dict__['__window'].document.location.fix_url(val),
                            self.__dict__['__window'].document.location.href)
            parser = PageParser(window, window.document, window.__dict__['__html'])
            parser.close()

    def handle_id(self, name, val):
        self.__dict__[name] = val
        val = val.replace(':','_').replace('-','_')
        try:
            #if self.__dict__['__window'].__dict__['__cx'].execute('typeof ' + val + ' == "undefined"'):
            self.__dict__['__window'].__dict__['__cx'].add_global(val, self)
        except:
            #traceback.print_exc()
            pass
                
        self.__dict__['__window'].__dict__['__fl'][-1].__setattr__(val, self)

    def handle_name(self, name, val):
        self.handle_id(name, val)

    def handle_innerHTML(self, name, val):
        val = str(val)
        if self.__parser:
            self.__parser.html = self.__parser.html[:self.begin] + val + self.__parser.html[self.end:]
            dev = self.end - self.begin - len(val)
            for i in self.__dict__['__window'].document.all:
                if i.begin:
                    if i.begin > self.end:
                        i.begin -= dev
                if i.end:
                    if i.end >= self.end:
                        i.end -= dev
            
            self.__parser.current -= dev
            return
        
        from PageParser import PageParser
        self.__parser = PageParser(self.__dict__['__window'], self.__dict__['__window'].document, val)

    def __setattr__(self, name, val):
        try:
            handler = getattr(self, "handle_%s" % (name, ))
            handler(name, val)
        except:
            pass
        
        #if it's an event, let it be a function
        if dataetc.isevent(name, self.tagName):
            # using 'this' in methods may cause additional problems.
            # i think i find a way to handle this, but there could 
            # be some cases it cannot cover.
            val = str(val) + ';'
            cx = self.__dict__['__window'].__dict__['__cx']
            val = cx.patch_script(val)
            try:
                if 'id' in self.__dict__:
                    vals    = re.split('(?<=[^a-zA-Z0-9_])this(?=[^a-zA-Z0-9_])', val)
                    valstmp = re.split('^this(?=[^a-zA-Z0-9_])', vals[0])
                    if len(vals) > 1:
                        vals = valstmp + vals[1:]
                    valstmp = re.split('(?<=[^a-zA-Z0-9_])this$', vals[-1])
                    if len(vals) > 1:
                        vals = vals[:-1] + valstmp
                    val = self.id.join(vals)
                self.__dict__[name] = cx.execute('function(){' + val + '}')
            except:
                try:
                    p = val.decode('string-escape')
                    self.__dict__[name] = cx.execute('function(){' + p + '}')
                except:
                    print val
                    #traceback.print_exc()
        
        self.__dict__[name] = val

    def focus(self):
        if 'onfocus' in self.__dict__: 
            self.onfocus()
        self.__dict__['__window'].document.activeElement = self

    def blur(self):
        if 'onblur' in self.__dict__: 
            self.onblur()

    def __getattr__(self, name):
        if name == 'innerHTML': 
            return self.__parser.html[self.begin:self.end]
        
        return unknown()

    def appendChild(self, dom):
        if self.childNodes.length == 0: 
            self.firstChild = dom
        self.childNodes.append(dom)
        self.lastChild = dom
        dom.__dict__['parentNode'] = self
        self.children.append(dom)

    def removeChild(self, dom):
        self.childNodes.remove(dom)
        if self.childNodes.length == 0:
            self.firstChild = None
            self.lastChild  = None
        else:
            self.firstChild = self.childNodes[0]
            self.lastChild  = self.childNodes[self.childNodes.length - 1]

    def setAttribute(self, attname, attval):
        self.__setattr__(attname, attval)

    def removeAttribute(self, attname):
        if self.__dict__[attname]: 
            del self.__dict__[attname]
Пример #2
0
    elif choice == 2:
        # append elements
        itemToAdd = int(input("Enter integer to append: "))
        arr.append(itemToAdd)

    elif choice == 3:
        # insert elements
        itemToInsert = int(input("Enter integer to insert: "))
        insertPosition = int(input("Enter position to insert: "))
        arr.insert(insertPosition, itemToInsert)

    elif choice == 4:
        # pop element
        print(f"popped item is {arr.pop()}")
    elif choice == 5:
        # remove element
        itemToRemove = int(input("Enter integer to remove: "))
        print(arr.remove(itemToRemove))
    elif choice == 6:
        # index element
        item = int(input("Enter integer to find index: "))
        print(arr.index(item))
    elif choice == 7:
        # reverse array
        arr.reverse()
    elif choice == 8:
        print("program exited")
        break
    else:
        print("Invalid Choice")