Example #1
0
class ListManager(object):
    
    __list = None
    __pth = None
    __debug = None
    
    def __init__(self):
        self.__pth = ParserTreeHelper()
        self.__debug = False

    @staticmethod
    def clearListFromEmptyTokens(tokenList):
        whiteTokensCount = tokenList.count('')
        for i in range(whiteTokensCount):
            tokenList.pop(tokenList.index(''))
        return tokenList
    
    def loadList(self, list):
        self.__list = list

    #TODO test    
    def findIndexOfEndingTag(self, token):
        if not self.__pth.isTokenATag(token):
            raise NotATagException
        specialRequirement = self.__pth.getSpecialRequirements(token) 
        endingTag = self.__pth.getEndingTag(token)
        expectedIndexOfEndingTag = 0
        skipFirstOccurenceOfTag = False
        if token == endingTag:
            skipFirstOccurenceOfTag = True
        counter = 0
        start_token_found = False
        for idx, currentTokenElement in enumerate(self.__list):
            counter = idx
            
            if currentTokenElement == token:
                start_token_found = True
                if specialRequirement == 'FirstInLine':
                    if idx != 0:
                        if self.__list[idx-1] != '\n':
                            raise NotATagException
            if (currentTokenElement == endingTag) and start_token_found:
                if skipFirstOccurenceOfTag:
                    skipFirstOccurenceOfTag = False
                    continue
                else:
                    expectedIndexOfEndingTag = idx
                    break
        if self.__pth.affectsLine(token):
            return counter
        return expectedIndexOfEndingTag
    
    #todo test
    def parseListToElement(self):
        headElement = Element("headElement")
        skip = None

        for i, currentToken in enumerate(self.__list):
            
            if i < skip:
                continue
            
            newElement = Element("token")  
            if not self.__pth.isTokenATag(currentToken):
                newElement.set('name', 'text')
                newElement.text = currentToken
            
            else:
                try:
                    endingTagIndex = self.findIndexOfEndingTag(currentToken)
                except NotATagException:
                    newElement.set('name', 'text')
                    newElement.text = currentToken
                else:
                    currentTokenName = self.__pth.getTagId(currentToken)
                    newElement.set('name', currentTokenName)
                
                    trimmedList = self.cutList(i, endingTagIndex)
                    tmpListManger = ListManager()
                    tmpListManger.loadList(trimmedList)
                    returnedElement = tmpListManger.parseListToElement()
                    newElement.append(returnedElement)
                    
                    skip = endingTagIndex
                    
            headElement.append(newElement)
            
        return headElement
        
    def cutList(self, startingIndex, endingIndex):
        return self.__list[startingIndex+1 : endingIndex]