def test_general(self):
        answer = CustomRegEx.findall('(?#<hijo id="hijo1" *=label>)',
                                     self.htmlStr)
        required = ['primer hijo']
        assert answer == required, 'Comentario y variable independiente'

        answer = CustomRegEx.findall('(?#<hijo id=varid *=label>)',
                                     self.htmlStr)
        required = [('hijo1', 'primer hijo'), ('hijo2', ''),
                    ('hijo3', 'tercer hijo')]
        assert answer == required, 'Utilizando variables para distinguir casos'

        answer = CustomRegEx.findall('(?#<hijo id="hijo[13]"=varid *=label>)',
                                     self.htmlStr)
        required = [('hijo1', 'primer hijo'), ('hijo3', 'tercer hijo')]
        assert answer == required, 'Utilizando variables para distinguir casos'

        answer = CustomRegEx.findall('(?#<hijo exp *=label>)', self.htmlStr)
        required = ['']
        assert answer == required, 'Utilizando atributos requeridos (exp) para distinguir un caso'

        answer = CustomRegEx.findall('(?#<hijo exp .*>)', self.htmlStr)
        required = [('El primer comentario', 'El segundo comentario',
                     'El tercer comentario')]
        assert answer == required, 'Comentarios incluidos en tag'

        with pytest.raises(re.error):
            'Error porque no se pueden utilizar variables cuando se tiene ".*" como variable requerida'
            CustomRegEx.compile('(?#<span class=var1 .*>)')
 def test_equivNotation(self):
     """
     Notación equivalente utilizando asociatividad que se expresa con las {}
     """
     first = CustomRegEx.compile(
         '(?#<a href span{src=icon *=label} div.id>)', 0)
     scnd = CustomRegEx.compile(
         '(?#<a href span.src=icon span.*=label div.id>)', 0)
     assert ExtCompObjEquality(first, scnd)
 def test_cleanvars(self):
     """
     <a href="http://uno.html">texto</a>
     Html tag con variable implícita href y variable label que recoge el texto una vez se
     eliminan los espacios en el prefijo y el sufijo. Es decir si a.* = \n\r \testo es lo que vale \t\n
     la notación &label& hace que en label se almacene "esto es lo que vale"
     """
     first = CustomRegEx.compile('(?#<a (href) *=label>)', 0)
     scnd = CustomRegEx.compile('(?#<a (href) *=&label&>)', 0)
     assert first.tags['tagpholder']['*'] != scnd.tags['tagpholder']['*']
 def test_tripleAsignation(self):
     """
     Notación equivalente utilizando doble asignación para declarar la variable y el parametro que
     se quiere
     """
     first = CustomRegEx.compile(
         '(?#<ese a.*="http//.+?/prueba" a.*=icon href=url>)', 0)
     scnd = CustomRegEx.compile(
         '(?#<ese a.*="http//.+?/prueba"=icon href=url>)', 0)
     assert ExtCompObjEquality(first, scnd)
 def test_equivNotationII(self):
     """
     Notación equivalente utilizando asociatividad cuando se tienen el mismo tag en 
     varios niveles 
     """
     first = CustomRegEx.compile(
         '(?#<table id td.*=grp1 td[2].b.*=grp2 td[2].a.href=grp2a td[2].a.src=grp2b td[3].*=grp3 td[4].*=grp4>)',
         0)
     scnd = CustomRegEx.compile(
         '(?#<table id td{1.*=grp1 2{b.*=grp2 a{href=grp2a src=grp2b}} 3.*=grp3 4.*=grp4}>)',
         0)
     assert ExtCompObjEquality(first, scnd)
    def test_tag(self):
        answer = CustomRegEx.findall('(?#<span|a *=label>)', self.htmlStr)
        required1 = ['span0', 'bloque1', 'bloque2', 'span3']
        assert answer == required1, 'Obtener texto de tags span o a'

        cmpobj = CustomRegEx.compile('(?#<(span|a) *=label>)')
        answer = cmpobj.groupindex.keys()
        required2 = ['__TAG__', 'label']
        assert answer == required2, 'Al encerrar el tagpattern entre paréntesis el nametag se almacena en la variable __TAG__ '

        answer = cmpobj.findall(self.htmlStr)
        required3 = [('span', 'span0'), ('span', 'bloque1'),
                     ('span', 'bloque2'), ('span', 'span3')]
        assert answer == required3, 'El primer componente de los tuples que conforman answer corresponde al nametag'

        cmpobj = CustomRegEx.compile(
            '(?#<span|a __TAG__=mi_nametag_var *=label>)')
        answer = cmpobj.groupindex.keys()
        required4 = ['mi_nametag_var', 'label']
        assert answer == required4, 'Al utilizar el atributo __TAG__ se puede asignar una variable que contendra el nametag de los tags que cumplen con el pattern buscado'

        answer = cmpobj.findall(self.htmlStr)
        assert answer == required3, 'El resultado es el mismo, cambia solo el nombre de la variable asociada al nametag'

        cmpobj = CustomRegEx.compile('(?#<__TAG__ *="[sb].+?"=label>)')
        answer = cmpobj.findall(self.htmlStr)
        assert answer == required1, 'Al utilizar __TAG__ como tag attribute se hace el tagpattern = "[a-zA-Z][^\s>]*", para con el primer resultado se asigna "[sb].+?" al *'

        cmpobj = CustomRegEx.compile('(?#<(__TAG__) *=".+?"=label>)')
        answer = cmpobj.groupindex.keys()
        assert answer == required2, 'Se puede utiliza (__TAG__) para guardar el nametag en la variable __TAG__'

        cmpobj = CustomRegEx.compile(
            '(?#<__TAG__ __TAG__=mi_nametag_var *=".+?"=label>)')
        answer = cmpobj.groupindex.keys()
        assert answer == required4, 'Se puede utiliza __TAG__=nombrevar para guardar el nametag en una variable con nmbre propio'

        cmpobj = CustomRegEx.compile(
            '(?#<__TAG__ __TAG__=mi_nametag_var *=label>)')
        answer = cmpobj.findall(self.htmlStr)
        required = [('span', 'span0'), ('script', ''), ('bloque', ''),
                    ('span', 'span3')]
        assert answer == required, 'Utilizando __TAG__ como tagpattern'

        cmpobj = CustomRegEx.compile(
            '(?#<__TAG__ __TAG__="span|a"=mi_nametag_var *=label>)')
        answer = cmpobj.findall(self.htmlStr)
        assert answer == required3, 'Utilizando __TAG__="span|a"=mi_nametag_var se redefine el tagpattern a "span|a" y se asigna a la variable mi_nametag_var'

        with pytest.raises(re.error):
            'Entrega error porque se utiliza (__TAG__) como tagpattern y con __TAG__=mi_nametag_var se intenta asignarle a otra variable'
            CustomRegEx.compile(
                '(?#<(__TAG__) __TAG__=mi_nametag_var *=label>)')
Пример #7
0
def getMenuHeaderFooterOLD(param, args, data, menus):
    htmlUnescape = HTMLParser.HTMLParser().unescape
    menuId = args.get('menu', ['rootmenu'])[0]
    url = args.get("url")[0]
    headerFooter = []
    for k, elem in enumerate(menus):
        opLabel, opregexp = elem
        opdefault, sep, opvalues = opregexp.partition('|')
        opvalues = opvalues or opdefault
        opdefault = opdefault if sep else ''
        pIni, pFin = 0, -1
        if opdefault.startswith('(?#<SPAN>)'):
            pIni, match = -1, CustomRegEx.search(opdefault, data)
            if match: pIni, pFin = match.span(0)
        opmenu = CustomRegEx.findall(opvalues, data[pIni:pFin])
        if not opmenu: continue
        cmpregex = CustomRegEx.compile(opvalues)
        tags = cmpregex.groupindex.keys()
        menuUrl = [elem[tags.index('url')] for elem in opmenu] if len(tags) > 1 else opmenu
        if 'label' in tags:
            menuLabel = map(htmlUnescape, [elem[tags.index('label')] for elem in opmenu])
        else:
            menuLabel = len(menuUrl) * ['Label placeholder']
        if opdefault:
            match = CustomRegEx.search(opdefault, data)
            opdefault = htmlUnescape(match.group(1) if match else '')
        paramDict = dict([(key, value[0]) for key, value in args.items() if hasattr(value, "__getitem__") and key not in ["header", "footer"]])
        paramDict.update({'section':param, 'url':url, param:k, 'menu':menuId, 'menulabel': str(menuLabel), 'menuurl':str(menuUrl)})      
        itemParam = {'isFolder':True, 'label':opLabel + opdefault}
        headerFooter.append([paramDict, itemParam, None])
    return headerFooter
Пример #8
0
def parseUrlContent(url, data, regexp, compFlags = None, posIni = 0, posFin = 0):
    parseDirect = getParseDirectives(regexp)
    nxtposini = parseDirect.get('NXTPOSINI', 0)
    compFlags = compFlags if compFlags else 0
    pattern = CustomRegEx.compile(regexp, flags = compFlags)
    matchs = []
    while 1:
        match = pattern.search(data, posIni)
        if not match: break
        if posFin != 0 and  match.start(0) > posFin: break
        matchDict = match.groupdict()
        if parseDirect.has_key('SPAN'):
            idGroup = parseDirect['SPAN']
            matchDict['span'] = str((match.start(idGroup), match.end(idGroup)))
        posIni = match.end(nxtposini)
        matchs.append(matchDict)
    
    patternVars = pattern.groupindex.keys()
    url_vars = ['url', 'videoUrl', 'iconImage', 'thumbnailImage']
    for key in set(url_vars).intersection(patternVars):
        for elem in matchs:
            elem[key] = urlparse.urljoin(url, elem[key].replace('https:', 'http:'))
    if matchs and 'label' in patternVars:
        srchKeys = [key for key in patternVars  if key.startswith('label') and key != 'label2']
        srchKeys.sort()
        htmlUnescape = HTMLParser.HTMLParser().unescape
        for k in range(len(matchs)):
            lista = [matchs[k].pop(key) for key in srchKeys]
            labelValue = ' '.join([label for label in lista if label])
            matchs[k]['label'] = htmlUnescape(labelValue)
    return matchs
Пример #9
0
def getMenuHeaderFooterOLD(param, args, data, menus):
    htmlUnescape = HTMLParser.HTMLParser().unescape
    menuId = args.get('menu', ['rootmenu'])[0]
    url = args.get("url")[0]
    headerFooter = []
    for k, elem in enumerate(menus):
        opLabel, opregexp = elem
        opdefault, sep, opvalues = opregexp.partition('|')
        opvalues = opvalues or opdefault
        opdefault = opdefault if sep else ''
        pIni, pFin = 0, -1
        if opdefault.startswith('(?#<SPAN>)'):
            pIni, match = -1, CustomRegEx.search(opdefault, data)
            if match: pIni, pFin = match.span(0)
        opmenu = CustomRegEx.findall(opvalues, data[pIni:pFin])
        if not opmenu: continue
        cmpregex = CustomRegEx.compile(opvalues)
        tags = cmpregex.groupindex.keys()
        menuUrl = [elem[tags.index('url')] for elem in opmenu] if len(tags) > 1 else opmenu
        if 'label' in tags:
            menuLabel = map(htmlUnescape, [elem[tags.index('label')] for elem in opmenu])
        else:
            menuLabel = len(menuUrl) * ['Label placeholder']
        if opdefault:
            match = CustomRegEx.search(opdefault, data)
            opdefault = htmlUnescape(match.group(1) if match else '')
        paramDict = dict([(key, value[0]) for key, value in args.items() if hasattr(value, "__getitem__") and key not in ["header", "footer"]])
        paramDict.update({'section':param, 'url':url, param:k, 'menu':menuId, 'menulabel': str(menuLabel), 'menuurl':str(menuUrl)})      
        itemParam = {'isFolder':True, 'label':opLabel + opdefault}
        headerFooter.append([paramDict, itemParam, None])
    return headerFooter
Пример #10
0
def parseUrlContent(url, data, regexp, compFlags = None, posIni = 0, posFin = 0):
    parseDirect = getParseDirectives(regexp)
    nxtposini = parseDirect.get('NXTPOSINI', 0)
    compFlags = compFlags if compFlags else 0
    pattern = CustomRegEx.compile(regexp, flags = compFlags)
    matchs = []
    while 1:
        match = pattern.search(data, posIni)
        if not match: break
        if posFin != 0 and  match.start(0) > posFin: break
        matchDict = match.groupdict()
        if parseDirect.has_key('SPAN'):
            idGroup = parseDirect['SPAN']
            matchDict['span'] = str((match.start(idGroup), match.end(idGroup)))
        posIni = match.end(nxtposini)
        matchs.append(matchDict)
    
    patternVars = pattern.groupindex.keys()
    url_vars = ['url', 'videoUrl', 'iconImage', 'thumbnailImage']
    for key in set(url_vars).intersection(patternVars):
        for elem in matchs:
            elem[key] = urlparse.urljoin(url, elem[key])
    if matchs and 'label' in patternVars:
        srchKeys = [key for key in patternVars  if key.startswith('label') and key != 'label2']
        srchKeys.sort()
        htmlUnescape = HTMLParser.HTMLParser().unescape
        for k in range(len(matchs)):
            lista = [matchs[k].pop(key) for key in srchKeys]
            labelValue = ' '.join([label for label in lista if label])
            matchs[k]['label'] = htmlUnescape(labelValue)
    return matchs
 def test_namedvarswithpattern(self):
     """
     <a href="http://uno/dos/tres.html">texto</a>
     Html tag con variables url y label a los que se asigna el valor del atributo href y 
     el texto respectivamente ya que href cumple con el patrón "http://uno/.+?/tres.html"
     """
     actual = CustomRegEx.compile(
         '(?#<a href="http://uno/.+?/tres.html" href=url *=label>)', 0)
     assert actual.varList == [['tagpholder.href', 'url'],
                               ['tagpholder.*', 'label']]
 def test_implicitvars(self):
     """
     <a href="http://uno.html">texto</a>
     Html tag con variable implícita href y variable label que recoge el texto
     """
     actual = CustomRegEx.compile('(?#<a (href) *=label>)', 0)
     assert (actual.tagPattern, actual.tags, actual.varList) == ('a', {
         'tagpholder': {
             '*': '',
             'href': ''
         }
     }, [['tagpholder.href', 'group1'], ['tagpholder.*', 'label']])
 def test_namedvars(self):
     """
     <a href="http://uno.html">texto</a>
     Html tag con variables url y label a los que se asigna el valor del atributo href y 
     el texto respectivamente
     """
     actual = CustomRegEx.compile('(?#<a href=url *=label>)', 0)
     assert (actual.tagPattern, actual.tags, actual.varList) == ('a', {
         'tagpholder': {
             '*': '',
             'href': ''
         }
     }, [['tagpholder.href', 'url'], ['tagpholder.*', 'label']])
Пример #14
0
 def getMediaCode(self):
     keyValues = set(['url', 'videoUrl', 'videoId'])
     lista = [(elem, self.addonADG.getThreadParam(elem, 'regexp')) for elem in self.addonADG.getChildren('media') if self.addonADG.getThreadAttr(elem, 'type') == 'thread']
     keySet = set()
     for elem in lista:
         cmpregex = CustomRegEx.compile(elem[1])
         regexvars = keyValues.intersection(cmpregex.groupindex.keys())
         keySet.update(regexvars)
     if not keySet: self.ERRORS += 'WARNING: Sources not send any of ' + str(keyValues) + ' to media'  + '\n'
         
     regexp = self.addonADG.getThreadParam('media', 'regexp')
     compflags = self.addonADG.getThreadParam('media', 'compflags')
     return self.parser.handle(ntype.MEDIA, keySet, regexp, compflags)
Пример #15
0
def getWebData(url, regexPattern, initConf=None, **kwargs):
    yield [PROCESS_MESSAGE, ('Contactando sitio web bvc', ), kwargs]
    if not initConf:
        initConf = r'curl  --user-agent "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36" --cookie-jar "cookies.lwp" --location'
    net = network.network(initConf)
    content, end_url = net.openUrl(url)
    if isinstance(content, Exception):
        raise content
    yield [PROCESS_MESSAGE, ('Pagina web entregada', ), kwargs]

    reg = CustomRegEx.compile(regexPattern)

    response = reg.findall(content)
    yield [PROCESS_DATA, (response, ), kwargs]
Пример #16
0
    def getMediaCode(self):
        keyValues = set(['url', 'videoUrl', 'videoId'])
        lista = [(elem, self.addonADG.getThreadParam(elem, 'regexp'))
                 for elem in self.addonADG.getChildren('media')
                 if self.addonADG.getThreadAttr(elem, 'type') == 'thread']
        keySet = set()
        for elem in lista:
            cmpregex = CustomRegEx.compile(elem[1])
            regexvars = keyValues.intersection(cmpregex.groupindex.keys())
            keySet.update(regexvars)
        if not keySet:
            self.ERRORS += 'WARNING: Sources not send any of ' + str(
                keyValues) + ' to media' + '\n'

        regexp = self.addonADG.getThreadParam('media', 'regexp')
        compflags = self.addonADG.getThreadParam('media', 'compflags')
        return self.parser.handle(ntype.MEDIA, keySet, regexp, compflags)
Пример #17
0
 def handle_media(self, keySet, regexp, compflags):
     tags = CustomRegEx.compile(regexp).groupindex.keys()
     INDENT = '\n\t'
     mediacode  = 'def media():'
     mediacode += INDENT + 'import urlresolver'
     if 'url' in keySet:
         if len(keySet) > 1:
             mediacode += INDENT + 'if args.get("url", None):'
             INDENT += '\t'
         mediacode += INDENT + 'url = args.get("url")[0]'
         regexp = regexp.replace("'", "\\'")    
         sep = "'"
         mediacode += INDENT + 'regexp = ' + sep + regexp + sep
         mediacode += INDENT + 'url, data = openUrl(url)'
         mediacode += INDENT + 'compflags ='  + compflags
         mediacode += INDENT + 'subMenus = parseUrlContent(url, data, regexp, compflags )'
         if 'videourl' in tags:
             mediacode += INDENT + 'videoUrl = subMenus[0]["videourl"]'
             mediacode += INDENT + 'url = urlresolver.HostedMediaFile(url = videoUrl).resolve()'
         elif 'videoUrl' in tags:
             mediacode += INDENT + 'url = subMenus[0]["videoUrl"]'
     if 'videoUrl' in keySet:
         INDENT = '\n\t'
         if len(keySet) > 1:
             mediacode += INDENT + 'if args.get("videoUrl", None):'
             INDENT += '\t'
         mediacode += INDENT + 'videoUrl = args.get("videoUrl")[0]'
         mediacode += INDENT + 'url = urlresolver.HostedMediaFile(url=videoUrl).resolve()'
     if 'videoId' in keySet:
         INDENT = '\n\t'
         if len(keySet) > 1:
             mediacode += INDENT + 'if args.get("videoId", None):'
             INDENT += '\t'
         mediacode += INDENT + 'videoId = args.get("videoId")[0]'
         mediacode += INDENT + "videoHost = args.get('videoHost')[0]"
         mediacode += INDENT + 'url = urlresolver.HostedMediaFile(host=videoHost,media_id=videoId).resolve()'
         
     INDENT = '\n\t'
     
     mediacode += INDENT + 'li = xbmcgui.ListItem(path = url)'
     mediacode += INDENT + 'if args.get("icondef", None): li.setThumbnailImage(args["icondef"][0])'
     mediacode += INDENT + 'if args.get("labeldef", None): li.setLabel(args["labeldef"][0])'
     mediacode += INDENT + "li.setProperty('IsPlayable', 'true')"
     mediacode += INDENT + "li.setProperty('mimetype', 'video/x-msvideo')"
     mediacode += INDENT + "return xbmcplugin.setResolvedUrl(handle=addon_handle,succeeded=True,listitem=li)"
     return mediacode    
Пример #18
0
    def handle_media(self, keySet, regexp, compflags):
        tags = CustomRegEx.compile(regexp).groupindex.keys()
        INDENT = '\n\t'
        mediacode = 'def media():'
        mediacode += INDENT + 'import urlresolver'
        if 'url' in keySet:
            if len(keySet) > 1:
                mediacode += INDENT + 'if args.get("url", None):'
                INDENT += '\t'
            mediacode += INDENT + 'url = args.get("url")[0]'
            regexp = regexp.replace("'", "\\'")
            sep = "'"
            mediacode += INDENT + 'regexp = ' + sep + regexp + sep
            mediacode += INDENT + 'url, data = openUrl(url)'
            mediacode += INDENT + 'compflags =' + compflags
            mediacode += INDENT + 'subMenus = parseUrlContent(url, data, regexp, compflags )'
            if 'videourl' in tags:
                mediacode += INDENT + 'videoUrl = subMenus[0]["videourl"]'
                mediacode += INDENT + 'url = urlresolver.HostedMediaFile(url = videoUrl).resolve()'
            elif 'videoUrl' in tags:
                mediacode += INDENT + 'url = subMenus[0]["videoUrl"]'
        if 'videoUrl' in keySet:
            INDENT = '\n\t'
            if len(keySet) > 1:
                mediacode += INDENT + 'if args.get("videoUrl", None):'
                INDENT += '\t'
            mediacode += INDENT + 'videoUrl = args.get("videoUrl")[0]'
            mediacode += INDENT + 'url = urlresolver.HostedMediaFile(url=videoUrl).resolve()'
        if 'videoId' in keySet:
            INDENT = '\n\t'
            if len(keySet) > 1:
                mediacode += INDENT + 'if args.get("videoId", None):'
                INDENT += '\t'
            mediacode += INDENT + 'videoId = args.get("videoId")[0]'
            mediacode += INDENT + "videoHost = args.get('videoHost')[0]"
            mediacode += INDENT + 'url = urlresolver.HostedMediaFile(host=videoHost,media_id=videoId).resolve()'

        INDENT = '\n\t'

        mediacode += INDENT + 'li = xbmcgui.ListItem(path = url)'
        mediacode += INDENT + 'if args.get("icondef", None): li.setThumbnailImage(args["icondef"][0])'
        mediacode += INDENT + 'if args.get("labeldef", None): li.setLabel(args["labeldef"][0])'
        mediacode += INDENT + "li.setProperty('IsPlayable', 'true')"
        mediacode += INDENT + "li.setProperty('mimetype', 'video/x-msvideo')"
        mediacode += INDENT + "return xbmcplugin.setResolvedUrl(handle=addon_handle,succeeded=True,listitem=li)"
        return mediacode
Пример #19
0
def parsingUrlData(url, regexPattern, initConf=None, **kwargs):
    yield [PROCESS_MESSAGE, ('Contactando sitio web bvc', ), kwargs]
    if not initConf:
        initConf = r'curl  --user-agent "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36" --cookie-jar "cookies.lwp" --location'
    net = network.network(initConf)
    content, end_url = net.openUrl(url)
    yield [PROCESS_MESSAGE, ('Pagina weg entregada', ), kwargs]

    reg = CustomRegEx.compile(regexPattern)

    k = 0
    pos = baseIndex = 0
    while True:
        match = reg.search(content, pos)
        if not match:
            break
        k += 1
        pos = match.end(0)
        yield [PROCESS_DATA, (k, match, baseIndex), kwargs]
Пример #20
0
    def handle_apimenu(self, nodeId, menuId, paramDict, menuIcons, searchFlag, spanFlag):
        from basicFunc import INFOLABELS_KEYS
        otherParam = {}
        for key in paramDict.keys():
            if not key.startswith('op_'): continue
            modKey = key[3:]
            otherParam[modKey] = paramDict.pop(key)
        addonInfoKeys = [key for key in otherParam if key.startswith('addonInfo')]
        if len(addonInfoKeys) > 1:
            addonInfo = {}
            for key in addonInfoKeys:
                value = otherParam.pop(key)
                key, value =  value.rpartition('<>')[0:3:2]
                if key: addonInfo[key] = value
                else: addonInfoDef = value
        addonInfoFlag = paramDict.has_key('regexp') 
        if addonInfoFlag: regexp = paramDict.pop('regexp')
        INDENT = '\n\t'        
        sourceCode = 'def ' + nodeId + '():'
        if regexp.find('?#<PASS>') != -1: sourceCode += '\n\t'+ 'global args'
        if paramDict.get('url', None):paramDict.pop('url')
        sourceCode += '\n\t'+ 'url = args.get("url")[0]'
        suffix = ')'
        if menuId:
            if spanFlag:
                sourceCode += '\n\t'+ 'limInf, limSup = eval(args.get("span", ["(0,0)"])[0])'
                suffix = ', posIni = limInf, posFin = limSup)'
        spanFlag = False
        if addonInfoFlag:
            spanFlag = regexp.find('?#<SPAN') != -1 
            regexp = regexp.replace("'", "\\'")    
            sep = "'"
            sourceCode += '\n\t'+ 'regexp = r' + sep + regexp + sep
            sourceCode += '\n\t'+ 'url, data = openUrl(url)'
            if paramDict.get('compflags', None):
                sourceCode += '\n\t'+ 'compflags = ' + paramDict.pop('compflags')
                sourceCode += '\n\t'+ 'subMenus = parseUrlContent(url, data, regexp, compflags' + suffix
            else:
                sourceCode += '\n\t'+ 'subMenus = parseUrlContent(url, data, regexp' + suffix
            tags = CustomRegEx.compile(regexp).groupindex.keys()
            addonInfoFlag = any(map(lambda x: x in INFOLABELS_KEYS, tags))
            
        if regexp.find('?#<PASS>') != -1:
            sourceCode += '\n\t'+ "args = dict((key, [value]) for key, value in subMenus[0].items())"
#             if spanFlag: sourceCode += '\n\t'+ "args['span'] = [str(subMenus[0]['span'])]"
            sourceCode += '\n\t'+ "return " +  str(paramDict['menu']) + "()"
            return sourceCode

        if menuIcons:
            iconList = '["' + '", "'.join(menuIcons) + '"]'
            sourceCode += '\n\t' + 'iconList = ' + iconList
            sourceCode += '\n\t' + 'for k in range(len(subMenus)):'
            sourceCode += '\n\t\t' + 'kmod = min(k, len(iconList) - 1)' 
            sourceCode += '\n\t\t' + 'subMenus[k]["iconImage"] = os.path.join(_media, iconList[kmod])'
        
        contextMenuFlag = paramDict.has_key('contextmenus')
        if contextMenuFlag:
            contextMenu = [tuple(elem.split(',')) for elem in paramDict.pop('contextmenus').split('|')]
            onlyContext = paramDict.pop('onlycontext') if paramDict.has_key('onlycontext') else False
            sourceCode += '\n\t'+ 'contextMenu = {"lista":' + str(contextMenu) + ', "replaceItems":' + str(onlyContext) + '}' 
        
        if len(addonInfoKeys) > 1:
            sourceCode += '\n\t'+ 'addonInfo=' + str(addonInfo)
            
        sourceCode += '\n\t'+ 'menuContent = []'
        sourceCode += '\n\t'+ 'for elem in subMenus:'
        sourceCode += '\n\t\t'+ 'itemParam = dict([(key,elem.pop(key)) for key  in elem.keys() if key in LISTITEM_KEYS])'
        isFolder = str(paramDict['menu'] != 'media') if paramDict.has_key('menu') else 'True'
        sourceCode += '\n\t\t'+ 'itemParam["isFolder"] = ' + isFolder
        sourceCode += '\n\t\t'+ 'otherParam = ' + str(otherParam)
        if len(addonInfoKeys) > 1:
            sourceCode += '\n\t\t'+ 'otherParam["addonInfo"] = addonInfo.get(menu, "%s")' % addonInfoDef 
        if contextMenuFlag:
            sourceCode += '\n\t\t'+ 'otherParam["contextMenu"] = dict(contextMenu)'
        if addonInfoFlag:
            sourceCode += '\n\t\t'+ 'otherParam["addonInfo"] = dict([(key,elem.pop(key)) for key  in elem.keys() if key in INFOLABELS_KEYS])'
        if regexp.find('videoUrl') == -1:
            sourceCode += '\n\t\t'+ 'paramDict = dict([(key, value[0]) for key, value in args.items() if hasattr(value, "__getitem__") and key not in ["header", "footer"]])'
        else:
            sourceCode += '\n\t\t'+ 'paramDict = dict([(key, value[0]) for key, value in args.items() if hasattr(value, "__getitem__") and key not in ["url", "header", "footer"]])'
        sourceCode += '\n\t\t'+ 'paramDict.update(' + str({ key:value for key, value in paramDict.items() if key not in ['header','headregexp','nextregexp', 'iconflag', 'iconimage']}) + ')'
#         sourceCode += '\n\t\t'+ 'paramDict = ' + str({ key:value for key, value in paramDict.items() if key not in ['nextregexp', 'iconflag', 'iconimage']})
        sourceCode += '\n\t\t'+ 'paramDict.update(elem)'
        if spanFlag: sourceCode += '\n\t\t'+ 'paramDict["url"] = url'
        sourceCode += '\n\t\t'+ 'menuContent.append([paramDict, itemParam, otherParam])'
        sourceCode += '\n\t'+ 'return menuContent'
        if searchFlag: sourceCode += ' or EMPTYCONTENT' 
        return sourceCode
Пример #21
0
def getMenuHeaderFooter(param, args, data, menus):
    htmlUnescape = HTMLParser.HTMLParser().unescape
    menuId = args.get('menu', ['rootmenu'])[0]
    url = args.get("url")[0]
    headerFooter = []
    for k, elem in enumerate(menus):
        opLabel, opregexp = elem
        opdefault, sep, opvalues = opregexp.partition('|')
        opvalues = opvalues or opdefault
        opdefault = opdefault if sep else ''
        pIni, pFin = 0, -1
        if opdefault.startswith('(?#<SPAN>)'):
            pIni, match = -1, CustomRegEx.search(opdefault, data)
            if match: pIni, pFin = match.span(0)
        opmenu = CustomRegEx.findall(opvalues, data[pIni:pFin])
        if not opmenu: continue
        tags = CustomRegEx.compile(opvalues).groupindex.keys()
        if 'url' in tags:
            menuUrl = [elem[tags.index('url')] for elem in opmenu] if len(tags) > 1 else opmenu[0]
        if 'label' in tags:
            menuLabel = map(htmlUnescape, [elem[tags.index('label')] for elem in opmenu])
        else:
            placeHolder = 'Next >>>' if param == 'footer' else 'Header >>>'
            menuLabel = len(menuUrl)*[placeHolder]
        if len(opmenu) == 1: opLabel = menuLabel[0]
        if 'varvalue' in tags: 
            varValue = [elem[tags.index('varvalue')] for elem in opmenu] if len(tags) > 1 else opmenu

        if opdefault:
            cmpregex = CustomRegEx.compile(opdefault)
            tags = cmpregex.groupindex.keys()
            match = cmpregex.search(data)
            if tags:
                if 'label' in tags:
                    opdefault = htmlUnescape(match.group(1) if match else '')
                elif 'defvalue' in tags:
                    opdefault = htmlUnescape(match.group('defvalue'))
                elif 'varname' in tags:
                    varName = match.group('varname')
                    urlquery = urlparse.urlsplit(url).query
                    queryDict = dict(urlparse.parse_qsl(urlquery))
                    opdefault = queryDict.get(varName, '')
                    try:
                        indx = varValue.index(opdefault)
                    except:
                        opdefault = ''
                    else:
                        opdefault = menuLabel[indx]
                    menuUrl = []
                    for elem in varValue:
                        queryDict[varName] = elem
                        menuUrl.append('?' + urllib.urlencode(queryDict))
                
        paramDict = dict([(key, value[0]) for key, value in args.items() if hasattr(value, "__getitem__") and key not in ["header", "footer"]])
        paramDict.update({'section':param, 'url':url, param:k, 'menu':menuId})
        paramDict['menulabel'] = base64.urlsafe_b64encode(str(menuLabel))
        paramDict['menuurl'] = base64.urlsafe_b64encode(str(menuUrl))
        label = '[COLOR yellow]' + opLabel + opdefault + '[/COLOR]'
        itemParam = {'isFolder':True, 'label':label}
        headerFooter.append([paramDict, itemParam, None])
    return headerFooter
Пример #22
0
def getMenuHeaderFooter(param, args, data, menus):
    htmlUnescape = HTMLParser.HTMLParser().unescape
    menuId = args.get('menu', ['rootmenu'])[0]
    url = args.get("url")[0]
    headerFooter = []
    for k, elem in enumerate(menus):
        opLabel, opregexp = elem
        opdefault, sep, opvalues = opregexp.partition('|')
        opvalues = opvalues or opdefault
        opdefault = opdefault if sep else ''
        pIni, pFin = 0, -1
        if opdefault.startswith('(?#<SPAN>)'):
            pIni, match = -1, CustomRegEx.search(opdefault, data)
            if match: pIni, pFin = match.span(0)
        opmenu = CustomRegEx.findall(opvalues, data[pIni:pFin])
        if not opmenu: continue
        tags = CustomRegEx.compile(opvalues).groupindex.keys()
        if 'url' in tags:
            menuUrl = [htmlUnescape(elem[tags.index('url')]) for elem in opmenu] if len(tags) > 1 else [htmlUnescape(opmenu[0].replace('\/', '/'))]
        if 'label' in tags:
            menuLabel = map(htmlUnescape, [elem[tags.index('label')] for elem in opmenu])
        else:
            placeHolder = 'Next >>>' if param == 'footer' else 'Header >>>'
            menuLabel = len(opmenu)*[placeHolder]
        if len(opmenu) == 1: opLabel = menuLabel[0]
        if 'varvalue' in tags: 
            varValue = [elem[tags.index('varvalue')] for elem in opmenu] if len(tags) > 1 else opmenu

        if opdefault:
            cmpregex = CustomRegEx.compile(opdefault)
            tags = cmpregex.groupindex.keys()
            match = cmpregex.search(data)
            if tags:
                if 'label' in tags:
                    opdefault = htmlUnescape(match.group(1) if match else '')
                elif 'defvalue' in tags:
                    opdefault = htmlUnescape(match.group('defvalue'))
                elif 'varname' in tags:
                    varName = match.group('varname')
                    urlquery = urlparse.urlsplit(url).query
                    queryDict = dict(urlparse.parse_qsl(urlquery))
                    opdefault = queryDict.get(varName, '')
                    try:
                        indx = varValue.index(opdefault)
                    except:
                        opdefault = ''
                    else:
                        opdefault = menuLabel[indx]
                    menuUrl = []
                    for elem in varValue:
                        queryDict[varName] = elem
                        menuUrl.append('?' + urllib.urlencode(queryDict))
            else:
                opdefault = htmlUnescape(match.group(1) if match else '')
                
        paramDict = dict([(key, value[0]) for key, value in args.items() if hasattr(value, "__getitem__") and key not in ["header", "footer"]])
        paramDict.update({'section':param, 'url':url, param:k, 'menu':menuId})
        paramDict['menulabel'] = base64.urlsafe_b64encode(str(menuLabel))
        paramDict['menuurl'] = base64.urlsafe_b64encode(str(menuUrl))
        label = '[COLOR yellow]' + opLabel + opdefault + '[/COLOR]'
        itemParam = {'isFolder':True, 'label':label}
        headerFooter.append([paramDict, itemParam, None])
    return headerFooter
Пример #23
0
    def handle_apimenu(self, nodeId, menuId, paramDict, menuIcons, searchFlag,
                       spanFlag):
        from basicFunc import INFOLABELS_KEYS
        otherParam = {}
        for key in paramDict.keys():
            if not key.startswith('op_'): continue
            modKey = key[3:]
            otherParam[modKey] = paramDict.pop(key)
        addonInfoKeys = [
            key for key in otherParam if key.startswith('addonInfo')
        ]
        if len(addonInfoKeys) > 1:
            addonInfo = {}
            for key in addonInfoKeys:
                value = otherParam.pop(key)
                key, value = value.rpartition('<>')[0:3:2]
                if key: addonInfo[key] = value
                else: addonInfoDef = value
        addonInfoFlag = paramDict.has_key('regexp')
        if addonInfoFlag: regexp = paramDict.pop('regexp')
        INDENT = '\n\t'
        sourceCode = 'def ' + nodeId + '():'
        if regexp.find('?#<PASS>') != -1: sourceCode += '\n\t' + 'global args'
        if paramDict.get('url', None): paramDict.pop('url')
        sourceCode += '\n\t' + 'url = args.get("url")[0]'
        suffix = ')'
        if menuId:
            if spanFlag:
                sourceCode += '\n\t' + 'limInf, limSup = eval(args.get("span", ["(0,0)"])[0])'
                suffix = ', posIni = limInf, posFin = limSup)'
        spanFlag = False
        if addonInfoFlag:
            spanFlag = regexp.find('?#<SPAN') != -1
            regexp = regexp.replace("'", "\\'")
            sep = "'"
            sourceCode += '\n\t' + 'regexp = r' + sep + regexp + sep
            sourceCode += '\n\t' + 'url, data = openUrl(url)'
            if paramDict.get('compflags', None):
                sourceCode += '\n\t' + 'compflags = ' + paramDict.pop(
                    'compflags')
                sourceCode += '\n\t' + 'subMenus = parseUrlContent(url, data, regexp, compflags' + suffix
            else:
                sourceCode += '\n\t' + 'subMenus = parseUrlContent(url, data, regexp' + suffix
            tags = CustomRegEx.compile(regexp).groupindex.keys()
            addonInfoFlag = any(map(lambda x: x in INFOLABELS_KEYS, tags))

        if regexp.find('?#<PASS>') != -1:
            sourceCode += '\n\t' + "args = dict((key, [value]) for key, value in subMenus[0].items())"
            #             if spanFlag: sourceCode += '\n\t'+ "args['span'] = [str(subMenus[0]['span'])]"
            sourceCode += '\n\t' + "return " + str(paramDict['menu']) + "()"
            return sourceCode

        if menuIcons:
            iconList = '["' + '", "'.join(menuIcons) + '"]'
            sourceCode += '\n\t' + 'iconList = ' + iconList
            sourceCode += '\n\t' + 'for k in range(len(subMenus)):'
            sourceCode += '\n\t\t' + 'kmod = min(k, len(iconList) - 1)'
            sourceCode += '\n\t\t' + 'subMenus[k]["iconImage"] = os.path.join(_media, iconList[kmod])'

        contextMenuFlag = paramDict.has_key('contextmenus')
        if contextMenuFlag:
            contextMenu = [
                tuple(elem.split(','))
                for elem in paramDict.pop('contextmenus').split('|')
            ]
            onlyContext = paramDict.pop('onlycontext') if paramDict.has_key(
                'onlycontext') else False
            sourceCode += '\n\t' + 'contextMenu = {"lista":' + str(
                contextMenu) + ', "replaceItems":' + str(onlyContext) + '}'

        if len(addonInfoKeys) > 1:
            sourceCode += '\n\t' + 'addonInfo=' + str(addonInfo)

        sourceCode += '\n\t' + 'menuContent = []'
        sourceCode += '\n\t' + 'for elem in subMenus:'
        sourceCode += '\n\t\t' + 'itemParam = dict([(key,elem.pop(key)) for key  in elem.keys() if key in LISTITEM_KEYS])'
        isFolder = str(paramDict['menu'] != 'media') if paramDict.has_key(
            'menu') else 'True'
        sourceCode += '\n\t\t' + 'itemParam["isFolder"] = ' + isFolder
        sourceCode += '\n\t\t' + 'otherParam = ' + str(otherParam)
        if len(addonInfoKeys) > 1:
            sourceCode += '\n\t\t' + 'otherParam["addonInfo"] = addonInfo.get(menu, "%s")' % addonInfoDef
        if contextMenuFlag:
            sourceCode += '\n\t\t' + 'otherParam["contextMenu"] = dict(contextMenu)'
        if addonInfoFlag:
            sourceCode += '\n\t\t' + 'otherParam["addonInfo"] = dict([(key,elem.pop(key)) for key  in elem.keys() if key in INFOLABELS_KEYS])'
        if regexp.find('videoUrl') == -1:
            sourceCode += '\n\t\t' + 'paramDict = dict([(key, value[0]) for key, value in args.items() if hasattr(value, "__getitem__") and key not in ["header", "footer"]])'
        else:
            sourceCode += '\n\t\t' + 'paramDict = dict([(key, value[0]) for key, value in args.items() if hasattr(value, "__getitem__") and key not in ["url", "header", "footer"]])'
        sourceCode += '\n\t\t' + 'paramDict.update(' + str({
            key: value
            for key, value in paramDict.items() if key not in
            ['header', 'headregexp', 'nextregexp', 'iconflag', 'iconimage']
        }) + ')'
        #         sourceCode += '\n\t\t'+ 'paramDict = ' + str({ key:value for key, value in paramDict.items() if key not in ['nextregexp', 'iconflag', 'iconimage']})
        sourceCode += '\n\t\t' + 'paramDict.update(elem)'
        if spanFlag: sourceCode += '\n\t\t' + 'paramDict["url"] = url'
        sourceCode += '\n\t\t' + 'menuContent.append([paramDict, itemParam, otherParam])'
        sourceCode += '\n\t' + 'return menuContent'
        if searchFlag: sourceCode += ' or EMPTYCONTENT'
        return sourceCode
 def test_ExtCompile(self):
     """
     Html tag m�nimo
     """
     requested = {'tagpholder': {}}
     assert CustomRegEx.compile('(?#<table>)', 0).tags == requested
Пример #25
0
def getFormXmlStr(content):
    form_xml ='<?xml version="1.0" encoding="utf-8" standalone="yes"?>\n<settings>\n'
    pattern = r'(?#<form>)'
    comPattern = CustomRegEx.compile(pattern)
    k = 0
    posIni = 0
    while True:
        formData = getFormData(comPattern, content, posIni)
        if not formData: break
        posIni, formAttr, formFields = formData
        formAttr = dict([(key, escapeXml(value)) for key, value in formAttr.items()])
        form_xml += '\t<category label="Form %s">\n' % (k + 1)
        if formAttr:
            form_xml += '\t\t<setting type="lsep" label ="Form attributes"/>\n'
            for name, value in sorted(formAttr.items()):
                form_xml += '\t\t<setting id="fa_{0}" type="text" label="{0}" default="{1}" enable="false"/>\n'.format(name, value)
        bFlag = 0
        for key in formFields:
            if formFields[key].has_key('prepend'):
                if bFlag == 0:
                    bFlag = 1
                    form_xml += '\t\t<setting type="lsep" label ="Form Prepend Vars"/>\n'
            else:
                if bFlag < 2:
                    bFlag = 2
                    form_xml += '\t\t<setting type="lsep" label ="Form Vars"/>\n'
            if isinstance(formFields[key].get('value', ''), basestring):
                formFields[key].update([(fkey, escapeXml(formFields[key][fkey])) for fkey in ['name', 'value', 'checked'] if formFields[key].has_key(fkey)])
                atype = formFields[key].get('type', '')
                if atype == 'hidden':
                    felem = '<setting id="{name}" type="text" label="{name}" default="{value}" enable="false"/>\n'
                    pass
                elif atype in ['radio', 'checkbox']:
                    formFields[key]['checked'] = 'true' if formFields[key].has_key('checked') else 'false'
                    felem = '<setting id="{name}" type="bool" label ="{name}" default="{checked}"/>\n'
                    pass
                elif atype == 'text':
                    formFields[key]['value'] = formFields[key].get('value', '')
                    felem = '<setting id="{name}" type="text" label="{name}" default="{value}"/>\n'
                elif atype == 'submit':
                    felem = '<setting type="lsep" label ="{value}" noline="true"/>\n'
                elif atype == 'file':
                    formFields[key]['defaultValue'] = formFields[key].get('defaultValue', '')
                    felem = '<setting id="if_{name}" type="file" label="{name}" default="{defaultValue}"/>'
                else:
                    formFields[key]['value'] = formFields[key].get('value', '')
                    felem = '<setting id="{name}" type="text" label="{name}" default="{value}"/>\n'
            else:
                toEscape = ['name', 'value', 'default']
                formFields[key]['value'] = '|'.join(formFields[key]['value'])
                if formFields[key].has_key('lvalue'):
                    formFields[key]['lvalue'] = '|'.join(formFields[key]['lvalue'])
                    toEscape.append('lvalue')
                formFields[key]['default'] = formFields[key].get('default', '')
                formFields[key].update([(fkey, escapeXml(formFields[key][fkey])) for fkey in toEscape])
                if formFields[key].has_key('lvalue'):
                    felem = '<setting id="{name}" type="drpdwnlst" label="{name}" lvalues="{lvalue}" values="{value}" default="{default}"/>\n'
                else:
                    felem = '<setting id="{name}" type="labelenum" label="{name}" lvalues="{value}" default="{default}"/>\n'
            form_xml += '\t\t' + felem.format(**formFields[key])
        form_xml += '\t</category>\n'
        k += 1
    form_xml += '</settings>\n'
    return form_xml
Пример #26
0
def getFormXmlStr(content):
    form_xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>\n<settings>\n'
    pattern = r'(?#<form>)'
    comPattern = CustomRegEx.compile(pattern)
    k = 0
    posIni = 0
    while True:
        formData = getFormData(comPattern, content, posIni)
        if not formData: break
        posIni, formAttr, formFields = formData
        formAttr = dict([(key, escapeXml(value))
                         for key, value in formAttr.items()])
        form_xml += '\t<category label="Form %s">\n' % (k + 1)
        if formAttr:
            form_xml += '\t\t<setting type="lsep" label ="Form attributes"/>\n'
            for name, value in sorted(formAttr.items()):
                form_xml += '\t\t<setting id="fa_{0}" type="text" label="{0}" default="{1}" enable="false"/>\n'.format(
                    name, value)
        bFlag = 0
        for key in formFields:
            if formFields[key].has_key('prepend'):
                if bFlag == 0:
                    bFlag = 1
                    form_xml += '\t\t<setting type="lsep" label ="Form Prepend Vars"/>\n'
            else:
                if bFlag < 2:
                    bFlag = 2
                    form_xml += '\t\t<setting type="lsep" label ="Form Vars"/>\n'
            if isinstance(formFields[key].get('value', ''), basestring):
                formFields[key].update([
                    (fkey, escapeXml(formFields[key][fkey]))
                    for fkey in ['name', 'value', 'checked']
                    if formFields[key].has_key(fkey)
                ])
                atype = formFields[key].get('type', '')
                if atype == 'hidden':
                    felem = '<setting id="{name}" type="text" label="{name}" default="{value}" enable="false"/>\n'
                    pass
                elif atype in ['radio', 'checkbox']:
                    formFields[key]['checked'] = 'true' if formFields[
                        key].has_key('checked') else 'false'
                    felem = '<setting id="{name}" type="bool" label ="{name}" default="{checked}"/>\n'
                    pass
                elif atype == 'text':
                    formFields[key]['value'] = formFields[key].get('value', '')
                    felem = '<setting id="{name}" type="text" label="{name}" default="{value}"/>\n'
                elif atype == 'submit':
                    felem = '<setting type="lsep" label ="{value}" noline="true"/>\n'
                elif atype == 'file':
                    formFields[key]['defaultValue'] = formFields[key].get(
                        'defaultValue', '')
                    felem = '<setting id="if_{name}" type="file" label="{name}" default="{defaultValue}"/>'
                else:
                    formFields[key]['value'] = formFields[key].get('value', '')
                    felem = '<setting id="{name}" type="text" label="{name}" default="{value}"/>\n'
            else:
                toEscape = ['name', 'value', 'default']
                formFields[key]['value'] = '|'.join(formFields[key]['value'])
                if formFields[key].has_key('lvalue'):
                    formFields[key]['lvalue'] = '|'.join(
                        formFields[key]['lvalue'])
                    toEscape.append('lvalue')
                formFields[key]['default'] = formFields[key].get('default', '')
                formFields[key].update([(fkey,
                                         escapeXml(formFields[key][fkey]))
                                        for fkey in toEscape])
                if formFields[key].has_key('lvalue'):
                    felem = '<setting id="{name}" type="drpdwnlst" label="{name}" lvalues="{lvalue}" values="{value}" default="{default}"/>\n'
                else:
                    felem = '<setting id="{name}" type="labelenum" label="{name}" lvalues="{value}" default="{default}"/>\n'
            form_xml += '\t\t' + felem.format(**formFields[key])
        form_xml += '\t</category>\n'
        k += 1
    form_xml += '</settings>\n'
    return form_xml
 def test_raiseAsignationError(self):
     with pytest.raises(re.error):
         CustomRegEx.compile(
             '(?#<TAG ese a{*=icon a.*="http//esto/es/prueba" href=url>)',
             0)