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)
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)