Пример #1
0
 def __init__(self, name, dic):
     #print ">>> construct ElementNode: %s" % name
     self._name = name
     self._childStyleNodes = []
     self._count = 1
     self._imp = 0
     self._nodeimp = 0
     self.type = 'elementnode'
     self.doter = ElementNodeDoter()
     self.doter.init(self)
     #set DataNode default pos 0
     _datanode = DataNode(self, dic)
     self._childStyleNodes.append(_datanode)
Пример #2
0
class ElementNode:
    '''
    base tag class
    data structure:
        [
            tagname,
            childtags: [],
            count = 1,
            imp = 0,
        ]
    '''
    def __init__(self, name, dic):
        #print ">>> construct ElementNode: %s" % name
        self._name = name
        self._childStyleNodes = []
        self._count = 1
        self._imp = 0
        self._nodeimp = 0
        self.type = 'elementnode'
        self.doter = ElementNodeDoter()
        self.doter.init(self)
        #set DataNode default pos 0
        _datanode = DataNode(self, dic)
        self._childStyleNodes.append(_datanode)

    def setName(self, name):
        self._name =  str(name)

    def getName(self):
        return self._name

    def getChildStyleNodes(self):
        # maybe should return _childStyleNodes[1:]
        return self._childStyleNodes

    def getDataNode(self):
        #default: the first element is DataNode
        return self._childStyleNodes[0]

    def addChildStyleNode(self, node):
        '''
        @ node : StyleNode
        '''
        self._childStyleNodes.append(node)

    def _searchStyleNode(self, stylenodename):
        #skip DataNode defaut first pos
        for node in self.getChildStyleNodes()[1:]:
            if node.getPreview() == stylenodename:
                return node
        return False

    def findStyleNode(self, stylenode):
        '''
        only find the stylenode
        '''
        return self._searchStyleNode(stylenode.getPreview())

    def incCount(self):
        '''
        count pages that contain node
        '''
        self._count += 1

    def getCount(self):
        return self._count

    def getP(self):
        return self._count / pageNum

    def registerStyleNode(self, stylenode):
        if not trim(stylenode.getPreview()):
            return
        node = self._searchStyleNode(stylenode.getPreview())
        if node:
            node.incCount()
            #print '.. return node ', node
            return node
        else:
            self.addChildStyleNode(stylenode)
            #print '.. return stylenode ', 
            #print str(stylenode)
            return stylenode

    def getNodeImp(self):
        '''
        if len(self.getChildStyleNodes()) == 1:
            return 1
        '''
        if self._nodeimp:
            return self._nodeimp
        m = self.getCount()
        res = 0
        if m == 1:
            res = 1
        else:
            for stylenode in self.getChildStyleNodes()[1:]:
                pi = stylenode.getCount() / pageNum
                res -= pi * math.log(pi, m)
            res += self.getDataNode().getCompImp()
        self._nodeimp = res
        return res

    def getCompImp(self):
        r = 0.9
        if self._imp: return self._imp
        if len(self.getChildStyleNodes()) == 1:
            self._imp = self.getNodeImp()
            return self.getNodeImp()
        #else
        res = 0
        res += (1 - r) * self.getNodeImp()
        tem = 0
        tem += r * sum([
            #pi
            stylenode.getP() * stylenode.getCompImp()
                for stylenode in self.getChildStyleNodes()[1:]
        ])
        tem /= pageNum
        res += tem
        self._imp = res
        return res


    def __str__(self):
        '''
        use dot to generate structure
        '''
        #create dot node 
        res = ''
        res += self.doter.initDotNode() + '\n'
        for i,e in enumerate(self.getChildStyleNodes()):
            e.doter.initIndex(self.doter.index+i)
            res += '%s -- %s;\n' % (
                self.doter.getDotNode(),
                e.doter.getDotNode() 
            )
            res += str(e)
        #self.doter.incIndex()
        return res