Ejemplo n.º 1
0
 def parse(class_, text, country):
     r'''Parse an area definition text.
     '''
     otext = text
     acode = None
     name = None
     fullname = None
     while len(text):
         m = re.match(r'(ac)=(\d+)\s*', text)
         if m is not None:
             text = text[m.end():]
             if m.group(1) == 'ac':
                 acode = str(m.group(2))
             continue
         if name is None:
             text, name = multilang.parse(text)
             if name is None:
                 raise InputError('missing area name', char=text)
             continue
         if text.startswith('/'):
             if fullname is not None:
                 raise InputError('too many "/" separators', char=text)
             text, fullname = multilang.parse(text[1:].lstrip())
             if fullname is None:
                 raise InputError('missing area full name', char=text)
             continue
         raise InputError('malformed area description', char=text)
     if acode is None:
         raise InputError('missing ac=', line=otext)
     if name is None:
         raise InputError('missing name', line=otext)
     try:
         return class_(country, acode, name, fullname)
     except ValueError as e:
         raise InputError(e, line=otext)
Ejemplo n.º 2
0
    def parse(class_, text):
        r'''Parse a country definition text.

            >>> Country.parse('AU lang=en cc=61 ap=0 sp=1 "Australia"')
            Country('AU', 'en_AU', '61', multilang('Australia'), aprefix='0', sprefix='1')

        '''
        otext = text
        iso3166_a2, text = text.split(None, 1)
        iso3166_a2 = str(iso3166_a2)
        if not (len(iso3166_a2) == 2 and
                iso3166_a2.isalpha() and
                iso3166_a2.isupper()):
            raise InputError('invalid ISO3166 country code %r' % iso3166_a2,
                             char=iso3166_a2)
        ccode = None
        aprefix = None
        sprefix = None
        language = None
        name = None
        fullname = None
        while len(text):
            m = re.match(r'(cc|ap|sp)=(\d+)\s*', text)
            if m is not None:
                text = text[m.end():]
                if m.group(1) == 'cc':
                    ccode = str(m.group(2))
                elif m.group(1) == 'ap':
                    aprefix = str(m.group(2))
                elif m.group(1) == 'sp':
                    sprefix = str(m.group(2))
                continue
            m = re.match(r'(lang)=([a-z]{2}(?:_[A-Z]{2})?)\s*', text)
            if m is not None:
                text = text[m.end():]
                if m.group(1) == 'lang':
                    language = str(m.group(2))
                continue
            if name is None:
                text, name = multilang.parse(text)
                if name is None:
                    raise InputError('missing country name', char=text)
                continue
            if text.startswith('/'):
                if fullname is not None:
                    raise InputError('too many "/" separators', char=text)
                text, fullname = multilang.parse(text[1:].lstrip())
                if fullname is None:
                    raise InputError('missing country full name', char=text)
                continue
            raise InputError('malformed country description', char=text)
        if ccode is None:
            raise InputError('missing cc=', line=otext)
        if aprefix:
            if sprefix == aprefix:
                raise InputError('sp= and ap= must be different', line=otext)
        else:
            if sprefix is not None:
                raise InputError('sp= without ap=', line=otext)
        if language is None:
            raise InputError('missing lang=', line=otext)
        if name is None:
            raise InputError('missing name', line=otext)
        return class_(iso3166_a2, language, ccode, name, fullname=fullname,
                      aprefix=aprefix, sprefix=sprefix)