Source code for language_tags.tags

# -*- coding: utf-8 -*-
from language_tags.Subtag import Subtag
from language_tags.Tag import Tag
from language_tags import data


index = data.get('index')
registry = data.get('registry')


[docs]class tags():
[docs] @staticmethod def tag(tag): """ Get a :class:`language_tags.Tag.Tag` of a string (hyphen-separated) tag. :param str tag: (hyphen-separated) tag. :return: :class:`language_tags.Tag.Tag`. """ return Tag(tag)
[docs] @staticmethod def check(tag): """ Check if a string (hyphen-separated) tag is valid. :param str tag: (hyphen-separated) tag. :return: bool -- True if valid. """ return Tag(tag).valid
[docs] @staticmethod def types(subtag): """ Get the types of a subtag string (excludes redundant and grandfathered). :param str subtag: subtag. :return: list of types. The return list can be empty. """ if subtag in index: types = index[subtag] return [type for type in types.keys() if type != 'redundant' or type != 'grandfathered'] else: return []
[docs] @staticmethod def subtags(subtags): """ Get a list of existing :class:`language_tags.Subtag.Subtag` objects given the input subtag(s). :param subtags: string subtag or list of string subtags. :return: a list of existing :class:`language_tags.Subtag.Subtag` objects. The return list can be empty. """ result = [] if not isinstance(subtags, list): subtags = [subtags] for subtag in subtags: for type in tags.types(subtag): result.append(Subtag(subtag, type)) return result
[docs] @staticmethod def filter(subtags): """ Get a list of non-existing string subtag(s) given the input string subtag(s). :param subtags: string subtag or a list of string subtags. :return: list of non-existing string subtags. The return list can be empty. """ if not isinstance(subtags, list): subtags = [subtags] return [subtag for subtag in subtags if len(tags.types(subtag)) == 0]
[docs] @staticmethod def search(description, all=False): """ Gets a list of :class:`language_tags.Subtag.Subtag` objects where the description matches. :param description: a string or compiled regular expression. For example: ``search(re.compile(r'[0-9]{4}'))`` if the description of the returned subtag must contain four contiguous numerical digits. :type description: str or RegExp :param all: If set on True grandfathered and redundant tags will be included in the return list. :type all: bool, optional :return: list of :class:`language_tags.Subtag.Subtag` objects each including the description. The return list can be empty. """ # If the input query is all lowercase, make a case-insensitive match. if isinstance(description, str): list_to_string = lambda l: ', '.join(l).lower() if description.lower() == description else ', '.join(l) def test(record): return description in list_to_string(record['Description']) elif hasattr(description.search, '__call__'): def test(record): return description.search(', '.join(record['Description'])) is not None records = filter(lambda r: False if ('Subtag' not in r and not all) else test(r), registry) records = list(records) # Sort by matched description string length. This is a quick way to push precise matches towards the top. results = sorted(records, key=lambda r: min([abs(len(r_description) - len(description)) for r_description in r['Description']])) \ if isinstance(description, str) else records return [Subtag(r['Subtag'], r['Type']) if 'Subtag' in r else Tag(['Tag']) for r in results]
[docs] @staticmethod def description(tag): """ Gets a list of descriptions given the tag. :param str tag: (hyphen-separated) tag. :return: list of string descriptions. The return list can be empty. """ tag_object = Tag(tag) results = [] results.extend(tag_object.descriptions) subtags = tag_object.subtags for subtag in subtags: results += subtag.description return results
[docs] @staticmethod def languages(macrolanguage): """ Get a list of :class:`language_tags.Subtag.Subtag` objects given the string macrolanguage. :param string macrolanguage: subtag macrolanguage. :return: a list of the macrolanguage :class:`language_tags.Subtag.Subtag` objects. :raise Exception: if the macrolanguage does not exists. """ results = [] macrolanguage = macrolanguage.lower() macrolanguage_data = data.get('macrolanguage') if macrolanguage not in macrolanguage_data: raise Exception('\'' + macrolanguage + '\' is not a macrolanguage.') for registry_item in registry: record = registry_item if 'Macrolanguage' in record: if record['Macrolanguage'] == macrolanguage: results.append(Subtag(record['Subtag'], record['Type'])) return results
[docs] @staticmethod def type(subtag, type): """ Get a :class:`language_tags.Subtag.Subtag` by subtag and type. Can be None if not exists. :param str subtag: subtag. :param str type: type of the subtag. :return: :class:`language_tags.Subtag.Subtag` if exists, otherwise None. """ subtag = subtag.lower() if subtag in index: types = index[subtag] if type in types: return Subtag(subtag, type) return None
[docs] @staticmethod def language(subtag): """ Get a language :class:`language_tags.Subtag.Subtag` of the subtag string. :param str subtag: subtag. :return: language :class:`language_tags.Subtag.Subtag` if exists, otherwise None. """ return tags.type(subtag, 'language')
[docs] @staticmethod def region(subtag): """ Get a region :class:`language_tags.Subtag.Subtag` of the subtag string. :param str subtag: subtag. :return: region :class:`language_tags.Subtag.Subtag` if exists, otherwise None. """ return tags.type(subtag, 'region')
[docs] @staticmethod def date(): """ Get the file date of the underlying data as a string. :return: date as string (for example: '2014-03-27'). """ meta = data.get('meta') return meta['File-Date']